• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:UDP通信におけるbind関数について)

UDP通信のbind関数について

rinkunの回答

  • ベストアンサー
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.2

TCP/UDP通信がどのように働くかを考えれば、疑問の答えが分かるのでは? bindについて言えば 「OSはマシンに届いたパケットを如何にして該当プログラムに届けるか?」 です。 自分のポート番号をOSに教えてあげなければ、OSは着信したパケットをどのプログラム(プロセス)に届けるか分からないでしょう。それをするのがbindの役割です。 従って(1)は自ポート番号。IPは複数IPを持っているマシンで一部IPでのみ受け付ける場合に必要ですね。 一般的にサーバでbindするタイミングでは相手のIPやポート番号は不明ですから、要求されても困りますね。 (2)は質問者さんの認識通り。受信のために必要、送信では不要です。

akirakunnnnnn
質問者

お礼

質問した後、実は試しに相手側のIPやポート番号を設定するなど、色々なことを調べていました。回答が遅くなり申し訳有りません。 試した結果、相手側のIPやポートを設定すると、bindでエラーが帰ってきて、自動で自分のIPやOS割り振りのポート番号が設定されました。(Win2008server VC2010) 他にもワイヤーシャークにご登場願い、気になる箇所を色々と調べて勉強することが出来ました。 的確な回答ありがとうございます。 ベストアンサーとさせていただきます。

関連するQ&A

  • TCP及びUDP通信について

    TCP及びUDP通信について 現在WinSockAPIを用いた通信を行うプログラムを組んでいます。 しかしながらネットワークに関しては初心者で、わからない点がいくつか出てきたので質問させて頂きます。 -------------------------------------------------- 1.TCPで双方向通信を行う場合、サーバ側は指定したポートにbind→listenし、接続を待ち受けます。 クライアント側はサーバのIPを指定し、接続確立後にポートはOSが自動で割り振ると聞きました。 つまり、クライアント側がポートを開放せずに通信が出来るのは、OSなどが自動でポートを割り当て、割り当てたポートに到着したデータを該当アプリケーションに渡すからでしょうか? ポート関連は全てルータが管理しているものだと思っていたのですが、OSがポートを割り当てるという動作がよく理解できません。 -------------------------------------------------- 2.UDPで双方向通信を行う場合、端末A・端末Bともに指定したポートにbindする必要があると聞きました。 つまり、UDPで双方向通信を行う場合、端末A・端末Bの双方でポートを開放する必要があるということでしょうか? -------------------------------------------------- 是非ともご教授ください。

  • winsockを使ったTCP及びUDP通信について

    今回winsockを使った通信プログラムを組む事になったのですが、わからない点が多々ありましたので、どなたかご教授頂けると大変ありがたいです。 1. TCP通信において、送信側が"Hoge" "Fuga"と2回sendした際、受信側でrecvすると"Ho" "geFu" "ga"と3回受信する可能性があると認識しているのですが、これは正しいでしょうか? (到着する順序は保証されるが、recvする際に送信側がどのようにsendしたかは考慮されない) 2. UDP通信においては、上記のような現象は起きないと認識しているのですが、これは正しいでしょうか? (UDP通信では、2回sendすれば2回以上はrecvしない。パケットの破棄はあっても、分割はない) 3. もしUDP通信でも上記のような現象が起きる場合、到着順序の保証がされないという観点から、recvした際に"Ho" "ga" "geFu"と受信する事はあり得るのでしょうか? 4. 2が正しい前提での話です。UDP通信では、MTUを超えた場合、自動でパケットが分割されると聞きました。プログラムを組む際、これは意識しないといけないのでしょうか? (MTUが1500Byteの場合、UDPで2000Byteをsendすると、recvで1500,500と2回受信する?) 以上の4点です。 どなたかご存知の方いらっしゃいましたら、是非ご教授ください。

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

    ソケットプログラミングでの質問です. 初心者です. UDPクライアントで sock = socket(PF_INET,SOCK_DGRAM,0) でUDPソケットを生成した後に bind()なしで,UDPサーバ宛にsendto() を行った場合, サーバのrecvfrom()でクライアントの IPアドレスとポート番号が受け取ることができると思いますが ここでのIPアドレスはクライアントのアドレスで, ポート番号は他のクライアントの他ソケットが使用していないポート番号 が受け取ることができると考えてよろしいですか? クライアントのsendto()で自動的にポート番号が割り当てられるが, クライアントが,どのポートから送信したのかを知る方法はないですか?

  • bind()を呼び出さなくてもよい理由

    開発言語:C soccket(AF_INET, SOCK_DGRAM, 0)での通信時 サーバ側ではrecv()を行なうためにはbind()しますが、 クライアント側では、send()を行なうために明示的にbind()を行なわずにプログラムが動作しています。 この動作理由を教えて頂けませんか。 また、クライアント側において送受信を行なう場合にはsend()を呼び出した後に、 recv()を呼び出す場合にはbind()を必要としないプログラムを見た事あるのですが、 その動作理由が分かりません。 これについても合わせて教えて頂けると助かります。 よろしくお願いします。

  • TCP/IPにおける端末間の通信について(NAPT)

    TCP/IPにおける端末間の通信について(NAPT) お世話になります。 TCP/IPについて質問です。 NAPT機能の付いたルータを介し、インターネット越しに通信を行う場合を想定します。 1.端末A(送信側)から端末B(受信側)にTCPあるいはUDPを用いてデータを送信する場合、端末Bでは必ず待ち受けるポートにbind(listen)し、また端末Aでは指定されたポート宛てにデータを送信する必要があると聞きました。 ここまでは理解できますが、ここにNAPT機能の付いたルータが介入する場合、"例外なく"端末B側のルータでポートマッピングを行う必要があるのでしょうか? 2.上記の認識がもし正しい場合、2台の端末で通信を行う場合は少なくとも片方でポートマッピングが必要ということになります。 だとするならば、SkypeやMSNメッセンジャーなどのクライアント側でポートマッピングが必要のないアプリケーションは、必ずサーバを介した通信を行っているということでしょうか? Skypeなどの仕組みを説明しているサイトを見ると、接続の手順を踏んだのちに端末間で通信を行うとの記述があるのですが、いくら接続先のIPがわかっていても、アプリケーション間で接続を確立するには、片方でポートマッピングが必要になると思うのですが、これはどういうことなのでしょうか? 3.上記の認識が正しい場合、UDPで受信する為には必ずポートマッピングが必要ということになります。 だとするならば、クライアント側でポートマッピングが必要のないアプリケーションは、少なくとも受信にはUDPを用いていないということでしょうか? 以上の3点についてお答え頂けると幸いです。 回答お待ちしています。

  • UDPのポート53の通信が多い

    Linuxを接続しているルーターが、そのルーターのWAN側と接続しているルーターにUDPのポート53でパケットを飛ばします。 そしてそのルーターからLinuxを接続しているルーターへと返事が帰って来ているみたいです。 この通信がとても多く発生しています。 Linuxで設定が足りなかったり設定が間違っていたりしている可能性はありませんか?

  • UDP通信について

    はじめまして。 UDPの通信について教えて下さい。 送信元ポートと宛先ポートについてです。 機器A-機器Bで通信をする場合です。 両方の機器で同じアプリ(ポート番号10000)が起動しているとします。 機器Aから機器Bのアプリに対してフレームを送信した時、 送信元ポートはランダムな値(仮:5000)で宛先ポートは10000になると思います。 機器Bでフレームを受信した後、応答フレームを送信する時には 送信元ポート10000、宛先ポート5000になると思います。 機器Aで起動しているアプリのポート番号は10000ですので機器Bからの応答フレームの宛先ポート5000とは一致しません。 この場合、どのようにソフトは判断しているのでしょうか? 組み込みで評価ボードに同じアプリを実装してお互いに通信させるのが 目的です。

  • UDP/IPでのソケット作成について(winsock)

    UDP/IPでのソケット作成について(winsock) 開発環境VC++.NET、O/S WIN2000にてソケットプログラミング(winsock2.0)をしています。 コンソールプログラミングではありませんが、WindProcは持っていません。 UDPサーバーを作り、複数クライアントの対応をしたいと考えています。 クライアントAからの通信やりとり中に クライアントBからの通信がきたら、そちらとも通信やりとりを(自動で)行いたい。 ここで問題なのが、クライアントAの要求ポートが15000で、 クライアントBの要求ポートも15000なのです。 同じ既に開いているポートでソケット作成しようとしても、socket()関数はエラーを返してくるのですが、 やり方を工夫すれば、同一ポートでの複数クライアント対応は可能なのでしょうか。不可能なのでしょうか。 可能であれば、やり方、ヒント等教えてください。よろしくお願いします。 追記 (1)TCP/IPでは、同一ポートでソケット作成が可能でした。ネットで探したサンプルプログラムが  そのような動きをしていたのですが、UDPに書換えることはできませんでした。  http://eternalwindows.jp/network/winsock/winsock04s.html (2)UNIXの場合fork()処理後に socket()作成 → bind()で同一ポートでの複数クライアント対応が  上手くいくらしいのですが、Windowsではマルチスレッド等をうまく活用すれば、  fork()と同様の処理が可能になり、目的が達成できるでしょうか。

  • UDPについて

    SOCKETを使ってUDPの通信プログラムを勉強中なんですが sendto(),bind()ではstruct sockaddr_in型の構造体を渡しますよね。その中の sockaddr_in.sin_addr.s_addr はIPアドレス(コンピュータ名)をバイナリ化したデータですよね。これって、sendとreceiveそれぞれでどのような役割をしているのでしょうか。 また、sendto()はデータを送信しているんですよね。receive側ではreceiveする前にbindしなくちゃいけないみたいなんですが、そもそもbind()って何をしてるんでしょうか。 よろしくお願い致します。

  • UDP通信する時に、相手にどうやって自分のポート番号を教える?

    UDP通信する時に、相手(送信側)にどうやって自分(受信側)のポート番号を教えるのでしょうか? 例えば、下記のページのサンプルだと、受信側は5555で待ち受けていますが、この場合は送信側はあらかじめ受信側が5555で待ち受けていると知っています。送信側が知らない場合に、どうやって受信側のポート番号を知らせればよいのでしょうか? http://www.hellohiro.com/datagram.htm

    • ベストアンサー
    • Java