アプリ版:「スタンプのみでお礼する」機能のリリースについて

ソケットプログラミングでの質問です.
初心者です.

UDPクライアントで
sock = socket(PF_INET,SOCK_DGRAM,0)
でUDPソケットを生成した後に

bind()なしで,UDPサーバ宛にsendto()
を行った場合,

サーバのrecvfrom()でクライアントの
IPアドレスとポート番号が受け取ることができると思いますが
ここでのIPアドレスはクライアントのアドレスで,
ポート番号は他のクライアントの他ソケットが使用していないポート番号
が受け取ることができると考えてよろしいですか?

クライアントのsendto()で自動的にポート番号が割り当てられるが,
クライアントが,どのポートから送信したのかを知る方法はないですか?

A 回答 (2件)

No.1 です。


回答が遅くなってしまったことをお詫びします。

connect() や bind() なしで sendto() を呼び出した場合は、sendto() の
処理が実行される時点でソケットと任意のポートの結びつけが行われます。
従って、sendto() を呼び出したあとで getsockname() を使用すれば、
送信元のポート番号を取得することが可能なはずです。
    • good
    • 0

あまり時間がないため、手短に書かせていただきます。



まず、bind() せずにデータを送信した場合、サーバ側で受信した
データグラムに含まれるポート番号は、koton_ さんの認識どおり、
クライアントで任意に割り当てられたポート番号となります。
(この一時的に割り当てられるポート番号をエフェメラルポートと
言ったりします。)

次に、一般的なBSDライクの Socket APi であれば、
送信に使用したポート番号をクライアント側で知るためには、
getsockname() という関数を使用するのが一般的だと思います。

関数の詳細については、申し訳ないですがお手持ちのマニュアルや
インターネット等で検索してみてください。

この回答への補足

ありがとうございます.

getsockname()の場合connect()が必要なので,
UDPの場合は一般的でないですね。

補足日時:2007/11/03 22:00
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!