こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

UDPのソケットプログラミング

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

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

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

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

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

投稿日時 - 2007-10-31 01:07:33

QNo.3476344

すぐに回答ほしいです

質問者が選んだベストアンサー

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

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

投稿日時 - 2007-11-07 11:11:58

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

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

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

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

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

投稿日時 - 2007-11-01 01:44:53

補足

ありがとうございます.

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

投稿日時 - 2007-11-03 22:00:22

あなたにオススメの質問