- PR -

ソケットプログラミング UDP TCP bind()について

投稿者投稿内容
ごめz
会議室デビュー日: 2007/10/31
投稿数: 15
投稿日時: 2007-10-31 01:55
ソケットプログラミングでの質問です.
初心者です.いくつか教えてください.

今まで,クライアント側でソケットを作成したらbind()をすると思っていたのですが
間違っていたようです。
今までは,bind()をしないとポート番号が決められないと思っていたからです。
bind()しても問題ないですか?


次に,クライアントからサーバに文字を送信する場合です。

UDPのソケットをクライアント,サーバで生成して,サーバにはサーバのIPアドレスと適当なポート番号でbind()します。クライアントは,bind()しないで,サーバ宛にsendto()をする場合
サーバのrecvfrom()でのIPアドレスは,クライアントのIPアドレスになることはわかりますが,
ポート番号は何になるのでしょうか?クライアントが動的に割り当てたとすると,
クライアントでそのポート番号をしる方法はありますか?

また,TCPでも同様にクライアントでbind()しないなでサーバにsend()できると
思いますが,このときのクライアントのポート番号はUDPの時とまったく同じで
クライアントが適当(動的)に割り当てるのでしょうか?
ごめz
会議室デビュー日: 2007/10/31
投稿数: 15
投稿日時: 2007-10-31 02:04
少し訂正します.
UDPでは,sendto()
TCPでは,connect()
の際に,OSがクライアント側のポートを自動的に適切に割り当ててくれるから
ということですか?
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2007-10-31 10:33
引用:

ごめzさんの書き込み (2007-10-31 01:55) より:
ソケットプログラミングでの質問です.
今までは,bind()をしないとポート番号が決められないと思っていたからです。
bind()しても問題ないですか?


それによる弊害を理解してた上で行うなら問題ないです。
TCP/IPのデータはインターネット上のさまざまな経路を通ってやり取りされます。切断した後、それに遅れてデータが届くことがあるのです。このときに同じポートを使って別の通信セッションの処理を行っていたら何が起こると思います?
それを考慮してTCP/IPでは通信を切断した後、3分程度の間は同じポートを再利用しない(CLOSE_WAIT)することが定められています。BINDすると3分間経過していないポートでも直ちに使えてしまいます。


引用:

UDPでは,sendto()
TCPでは,connect()
の際に,OSがクライアント側のポートを自動的に適切に割り当ててくれるから
ということですか?


クライアント側で開いているポートを適当に割り当てます。何番以下か忘れたけど、若い番号のポートはサーバ用に予約しているので、それ以上の番号から適当に取られます。
ごめz
会議室デビュー日: 2007/10/31
投稿数: 15
投稿日時: 2007-10-31 22:45
ご回答ありがとうございます。

引用:

ごめzさんの書き込み (2007-10-31 01:55) より:

次に,クライアントからサーバに文字を送信する場合です。

UDPのソケットをクライアント,サーバで生成して,サーバにはサーバのIPアドレスと適当なポート番号でbind()します。クライアントは,bind()しないで,サーバ宛にsendto()をする場合
サーバのrecvfrom()でのIPアドレスは,クライアントのIPアドレスになることはわかりますが,
ポート番号は何になるのでしょうか?クライアントが動的に割り当てたとすると,
クライアントでそのポート番号をしる方法はありますか?




是非,上記の質問も教えてください。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2007-11-01 09:26
引用:

ごめzさんの書き込み (2007-10-31 22:45) より:
ポート番号は何になるのでしょうか?クライアントが動的に割り当てたとすると,
クライアントでそのポート番号をしる方法はありますか?


標準的に使われるバークレイソケットにはそのようなインターフェースはないです。
Windowsの拡張にもないと思う。

原則として自分自身のIPアドレスやポートを知らなくても、通信するには困らないので気にしないのが良い。どうしても知りたいなら、recvfromで受信すればわかるので、自分の通信相手に問い合わせるのが一番汎用性が高い。
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2007-11-01 10:11
connect() したあとなら、getsockname() で分かるんじゃないかな。。
marun
常連さん
会議室デビュー日: 2007/07/19
投稿数: 22
投稿日時: 2007-11-01 11:45
こんにちわ。
bindをしない場合は、ポートはOSによって自動的に割り振られます。
普通です。
TCPでもUDPでもサーバ側(待ちうけ側)のポートは確定する必要があるが、
送信元のポートは確定する必要がないのです。
ポートの割り振られる範囲は、OSに依存します。
(私の使ってたOSでは2000から36000くらいだったかな)
ただし、システムによってポートを割り振らないといけない場合は
bindする必要があります。
例えば、
セキュリティの観点から、ルータで送信元ポートを特定してはじく設計となっている場合。
そういった要件があるかどうかは、ここで聞くのではなく
あなたの仕事の依頼人(上司あるいはお客様)に確認をとってくださいね。
ごめz
会議室デビュー日: 2007/10/31
投稿数: 15
投稿日時: 2007-11-03 01:42
引用:

未記入さんの書き込み (2007-11-01 10:11) より:
connect() したあとなら、getsockname() で分かるんじゃないかな。。



UDPの場合は不可能なんですかね?

スキルアップ/キャリアアップ(JOB@IT)