• ベストアンサー

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

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

  • Java
  • 回答数4
  • ありがとう数3

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

  • ベストアンサー
回答No.4

#1です。 > 受信側は > DatagramSocket > を引数なしでインスタンス化して、receiveメソッドを動かせば、そこに返ってくる、ということなのでしょうか? 「返ってくる」というのはレスポンスのことでしょうか。その前提で話をします。 最初の回答のA→B(リクエスト)とB→A(レスポンス)のうち,Aがこの質問のとおりに動作するには,Bが以下のような動作を行う必要があります。逆にBが以下のような動作をするならAの動作はご質問のとおりです。 1)Aは引数なし,Bは固定のポートを指定してインスタンス化。 2)Aは送信するリクエストパケット(DatagramPacket)を作り,これにBのIPアドレスとポートをセットして送信。 3)BのIPアドレス・ポートにAからのパケット到着。Bはこれをreceiveメソッドで受け取る。 4)BはAからのパケットに含まれるAのIPアドレスとポート番号を取得する(DatagramPacketのgetSocketAddressメソッドで多分取得可)。 5)Bはレスポンスを作成し,取得したAのIPアドレスとポートをレスポンスパケット(DatagramPacket)にセットしてこれを送信。 6)AのIPアドレス・ポートにBからのパケット到着。Aはこれをreceiveメソッドで受け取る。 UDPでは,リクエストを送って相手がそれを受け取れば,UDP通信はそれでおわりです。リクエストに対してレスポンスを返す場合,送信側と受信側が入れ替わって新規のUDP通信を始めることになります。

netw2009
質問者

お礼

皆さん、回答ありがとうございます。 自分の中でイメージした感じで、簡単なコードを書いてみたのですが、うまく動きません。ただ、質問が変わってしまうので、下記のページに質問させていただきました。 もしよければ、よろしくお願いします。 http://oshiete1.goo.ne.jp/qa4937796.html

その他の回答 (3)

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.3

> パケットが自分に返ってくる時の自分のポート番号をどう相手に知らせるのか 知らせるまでもなく、TCP/IPレベルで、受信した時点で相手のIPアドレスやポート番号は既知のものです。 Java であれば、 > socket.receive(packet); で受信した時の packet に、その情報が入っていて、 getAddress や getPort で取得できます。 http://java.sun.com/javame/reference/apis/jsr218/ja/java/net/DatagramPacket.html#getPort() ・待ち受ける自分自身のポート番号情報は socket が保持している ・通信相手(こちから送る相手先/こちらが受けとった送信元)のポート番号情報などは packet が保持している ので、 サーバ側では、この受信に使った packet をそのまま使って、setData してから socket.send(packet)してやれば、 通信相手のIPアドレスやポート番号を意識しなくても、 そのまま送信者に返信を送ることができます。 クライアント側では、 ・ポートを指定していないので、socketが使用するポート番号は適当に割り振られる ・socket.send 時には、そのポート番号を送信元としてデータを送りつける ・socket.receive 時には、そのポート番号宛のデータを受け取る ことになるので、 送信に使った socket を使って、そのまま socket.receive(packet)すれば、サーバ側が送り返したデータはそのまま受信できます。

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.2

UDPにかぎらず、TCPでも同じことですが、 クライアント(一番最初に送信を行う)側は、 サーバ(一番最初に受信を行う)側のポート番号を、 別途何らかの手段であらかじめ知っておく必要があります。 その方法としては、 ・ポート番号を決めうちにする   たとえば、http はTCPの 80 であるとか、DNS はUDPの53番を使うと、あらかじめ決めておく。質問者さんの挙げてるサンプルもこの方法ですね。 ・別の通信で、ポート番号などの情報交換を行う。   ftp(TCP)では、コントロールとデータの2つのコネクションを張りますが、データコネクションのポート番号はコントロールコネクションで通知します。   WWWで、http://excample.com:8080/foo/bar/ などとポート番号込みでURLを指定するのも、この方法の一種でしょう。 などがあります。

netw2009
質問者

お礼

回答ありがとうございます。 すみません、私の書き方が悪かったのですが、私が知りたかったのは自分が相手のウェルノウンポートに送った後に、パケットが自分に返ってくる時の自分のポート番号をどう相手に知らせるのか、ということでした。

回答No.1

2点間,たとえばAとBの間でUDP通信を行う場合,最初のA→B(リクエスト)を行うポート番号は教えようがありません。Bはあらかじめ決めた固定のポート番号にバインドしてAはそのポート番号にリクエストを投げる必要があります。 しかし,B→A(レスポンス)については,A→Bで送られたリクエストパケットの中に送信元ポート番号(Aのポート番号)が含まれているので,その送信元ポートにレスポンスを投げ返すのは可能かと思います。 詳しくはUDPパケットの仕様を調べてみてください。

参考URL:
http://www.atmarkit.co.jp/fwin2k/network/baswinlan013/baswinlan013_03.html
netw2009
質問者

お礼

回答ありがとうございます。 私の質問文が不十分だったのですが、私が知りたかったのはB→Aのレスポンスする時のBが、Aのポート番号の知り方でした。 ということは、下記のプログラムでいうと、受信側は DatagramSocket を引数なしでインスタンス化して、receiveメソッドを動かせば、そこに返ってくる、ということなのでしょうか? http://www.hellohiro.com/datagram.htm

関連するQ&A

  • UDP通信におけるbind関数について

    初めて質問させていただきます。よろしくお願いします。 最近、ネットワークプログラミングの勉強をしているのですが、bindについてよくわからなくなってきました・・・。よろしければご教授願います。 質問内容は以下の通りです。 (1)bindにおける設定内容は、「相手側のIPとポート番号」なのか「自分側のIPとポート番号」なのか?  色々なところを調べてみましたが、「IPとポート番号」を設定する、としかかかれてなく、いったいどっちなのかがわからなくなってきました・・・。 (2)UDP通信において、bindは必要なのか?  サーバ-クライアントの関係が曖昧なUDP通信において、bindというのは必要なのでしょうか。 私の認識では例えば、「recv関数」などを使い受信待ちをする場合はbindが必要だが、送信だけの場合には不要であるとなっています。 この認識はあっているのでしょうか。 拙文ですが、どうか教えていただきたく <(_ _*)>

  • UDP通信について

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

  • UDPでやりとりするには?

    UDPを勉強しています。 下記のページ等を見ると、いずれも1度だけUDPのメッセージを送って終了しているのですが、例えば、SNMPのやりとりのようにまずUDPで、 Get Request というメッセージをSNMPのサーバ(エージェント)に送り、そのレスポンスを受け取りたい場合はどのようにすれば実現できるのでしょうか? http://milkyway.merseine.nu/100java/Java/Java099.html http://www.hellohiro.com/datagram.htm

    • ベストアンサー
    • Java
  • UDPの宛先ポートと送信元ポートについて

    はじめまして。 UDPで通信を行うアプリケーションを設計しているのですが、そこで質問があります。 送信元ポートと宛先ポートの番号が同じでも問題ないのでしょうか? 機器A-機器Bで通信をする場合、機器A宛てのフレームのデータが 宛先ポート10000、送信元ポート10000でも問題はない?ってことです。 待ち受けるポート番号は10000で固定として送信元が同じ10000となって しまってもいいのでしょうか?

  • UDP通信でのポート

    javaを使ってUDP通信を行います。 映像データと音声データの2つのデータが あります。 以下のようなことは可能ですか? (図の説明)AからBへデータを送信します。 Aのポートは1500番を使って映像データを 送信します。と同時に、同じ1500番を使って 音声データは送信できますか? 同一ポートで複数データを送信できるか知りたい です。 (このままだと、いくつもポートをあけるため データのタイムラグありすぎて使い物になりません。。 ) もしくは、1つのポートでデータの送受信が できるか知りたいです。 なにかヒントになるようなことでもいいので 教えてください。よろしくお願いします。    A ------------------------> B (1500) 映像データ送信  A ------------------------> B (1500) 音声データ送信

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

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

  • 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点です。 どなたかご存知の方いらっしゃいましたら、是非ご教授ください。

  • TCP及びUDP通信について

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

  • クライアント側のポート番号

    ネットワークの勉強を始めたばかりの者です。 ポート番号に関する本で、HTTPポートに関して次のように書いてありました。 「HTTPポートは、WebブラウザでWebページを閲覧するときに使用される「HTTPプロトコル」を用いて通信を行う際にデータが通過するポートです。 HTTPプロトコルでは、通信の際だけ80番のHTTPポートを開き、通信が完了するとポートは閉じます。 例えば、あるWebページをWebブラウザに表示するにあたり、表示されるまでは、そのWebページのデータを受信している状態なので80番ポートは開いていますが、Webページデータを完全に受信し終わり、Webブラウザに表示されたら80番ポートは閉じます。 つまり、一回の通信毎に80番ポートを開けたり閉じたりを繰り返しています。」 私は、変だと思いました。 私は、クライアント側のポート番号は、その場で適当な番号が割り当てられるものだと思っているからです。 上の引用の中で、80番というWell-Knownポートで受信しているという話は解せなのです。 どう読んでも、上記の引用部分はクライアント側の話なのです。 (サーバ側はクライアント側(ブラウザ)からいつ要求されるかわからないから、「開けたり閉じたり」ということはないと思うのです。) http://www.mm-labo.com/computer/tcpip/ipaddress/portsort.html このページにも、「クライアント側で使用するポート番号は各OSが動的に割り当てる」と書いてあります。 私がしている勘違いはなんでしょうか。

  • UDPポートの開放について

    1ヶ月程前まではTCP・UDP共に開放出来ていたのですが 最近TCP・UDPポート開放必須のネットゲームをやろうと思い 新たにポート開放の設定をし、プレイしてみようとしたところ UDPポートが開いていないようなのです。 TCPポートに関しては確認サイトで開放確認出来ました。 以前から開放していたUDPポートも使えないようになっていました。 環境は以下の通りです。 ルータ:Aterm WR7805S 回線:フレッツ光プレミアム OS:WindowsXP SP3 フレッツ光なのでCTU設定画面から静的アドレス変換設定で TCPポートと同じように払い出しIPアドレスや接続先を設定するのですがUDPポートは色んな番号を試してみてもどれも駄目でした。 IPアドレスの固定は以前はしていなくても問題無く開放出来ていました。 念のため今回固定してみましたがやはりUDPポートは開放出来ませんでした。 同じ設定でTCPポートは開放出来るのにUDPポートが開放出来ないのは何が原因なのでしょうか?  ここ暫く回線機器や通信環境に変化はありません。 文章が拙く情報が足りない部分等あるかと思いますが 何か思い当たる解決策やアドバイス等あれば教えていただけると助かります。 よろしくお願いします。

専門家に質問してみよう