• ベストアンサー

UDPについて

こんばんは。 UDPについてうまく理解できず困っております。 お分かりになる方がいらっしゃいましたら、教えて下さい。 わからないのはUDPでのクライアント-サーバ間での通信方法です。 例えばこちらからあるコマンドを投げたとして、向こうから結果が返ってくるとします。 UDPなのでこちらからはじゃんじゃん投げます。 サーバからもじゃんじゃん返ってきます。 でも投げるコマンドによって処理時間が違うので 返ってくるデータの順番がバラバラになってしまう可能性があると思うのです。 TCPだとコネクションはって1対1というイメージがあるのですが、 UDPはやりたい放題(?)というイメージがあります。 順番がバラバラになってしまうのはもうどうしようもないことなのでしょうか? それともプログラミングのテクニック(?)で解消できるものなのでしょうか? 1コマンド1Threadにして管理すれば良いのでしょうか? (こうすると、このコマンドに対しての結果はこれって識別できますよね???) 一人ではどうにも前に進めないので、ご指導宜しくお願いします。 意味不明な部分は補足させていただきます。

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

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

>>それじゃTCPとUDPの違いって??? >>コネクションをはるかはらないかの違いでしかないんですか? 正解!、大きな違いはそこだけです。 しかしコネクションの確立後はデータは保証されているので正確に通信が保てると言うことです。 (IPパケットレベルの保証はUDPとTCP同じなのでUDPは信頼性が低いとは一概には言えない) 簡単に言うと(ご存知ですねこの辺) TCPは、パケット送信中に毎回 相手に届いたかどうかを確認して順次データの受け渡しをする。 UDPは、その確認が無いので、速い。 No2の補足にあるコメントだと その仕組みで UDP通信するよりいっそTCP でやった方が良いと思います<わざわざUDPを使ってTCPの仕組みを作るのは二度でまかと・・・

yukki-111
質問者

お礼

再度の書込みありがとうございます。 わかりやすい説明をありがとうございます。 こちらで教えていただいたおかげでやっと感覚つかめました!! 迷走中だったプログラムをただ今コーディングしなおしています・笑 実はTCPもあるんですよ。 でもUDPのやつも作れと言われました…。 あとTelnetとRSHもあって、初心者の私にはちんぷんかんぷんです。 またこちらにお世話になることがあるかもしれませんが、そのときはまたよろしくお願いします。

その他の回答 (2)

回答No.2

じゃんじゃん投げずに、コマンドを投げたら応答を待つプロトコルにすればいいのではないでしょうか。 そうすればじゃんじゃん応答が返ってくることもなくなって、順番も保証されます。 通常はACKが一定時間届かなければタイムアウトするとか、再送するとかの処理が必要になります。

yukki-111
質問者

お礼

書込みありがとうございます。 うーん私はなにやら根本的に勘違いしていたのかも…。 今回ネットワークプログラミングに初めて触れたのですが、TCP→正確だけど遅い、UDP→不正確だけど早い、ということから、UDPはどんどん投げなければいけないものだと思っていました。(だから早いのかなぁ、って思って) 言われてみればコマンドを投げてから応答を待てば順番は崩れないですよね。 それじゃTCPとUDPの違いって??? コネクションをはるかはらないかの違いでしかないんですか?(なんかアホっぽい質問でスミマセン)

yukki-111
質問者

補足

度々失礼します。 もしよければ再度教えていただきたいのですが、コマンドの結果が取得できなければそれはそれでいい場合、 コマンド送信→3秒待つ→何も返ってこなかった→次のコマンド投げる→3秒待つ→何か返ってきた→ というように続けていけばいいんですよね? ↑のようだと実際のところTCPより早かったりするわけ?なんて思ってしまうのですが…。

回答No.1

それがUDPなのです。 よってUDPで通信する場合、すべて自分で通信規格(プロトコル)を決めてコーティングしないといけません。

yukki-111
質問者

お礼

書込み、ありがとうございました。 UDPとは自由度の高い通信方法、ということなのでしょうか…。

関連するQ&A

  • UDPの接続って?

    Linuxとgccでプログラムしているのですが、 UDPによるデータ送受信で悩んでいます。 (すいません、前回も同じようなこと言いましたね(^^;) TCPであれば、サーバ側は 1.ソケット生成 2.バインド クライアント側は 1.ソケット生成 2.コネクト で通信路が確立されますよね。 UDPはどうなるんでしょうか。コネクションを張らないということは、サーバとクライアントは区別しないんですか? 今現在、TCPのプログラムのSOCK_STREAMとIPROTO_TCPの部分だけをUDPにして実行しているのですが、UDPのくせに Connectとかやってて気分が良くないのです・・・。(笑) 現在は、SetupForClient(サーバ側)とConnectToServer(クライアント側)というTCPの接続関数をそのまま使っています。前者はいいのですが、後者は明らかにUDP向けではないですよね。 もし、クライアント側の例があったら、教えていただければ嬉しく思います。

  • UDPデータ通信中の認識方法

    はじめまして。 表題の件について教えて下さい。 機器Aと機器BでUDPデータの通信をしている場合(機器Bのファイルを機器Aに転送しているとか)に受信側の機器Aはデータを受信している最中であるとどうやって認識しているのでしょうか? TCPだと最初にコネクションを確立して最後にコネクションを切断するのでデータ受信開始、受信中、受信完了はコネクション情報で確認できると思うのですが、UDPではコネクション確立がないのでTCPでのデータ受信開始、受信中、受信完了をどうやって識別しようか迷っています。 UDPでデータを受信している最中にLANケーブルを抜かれたらエラーとしたいのです。 その為に受信中であることを知りたいのですが。。。。

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

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

  • nagiosのcheck_udpについて

    nagiosでサーバ監視をしています。TCP・HTTP・POP等のサービスは問題なく監視できるのですが、RADIUSサービスを監視したく ./check_udp -H 192.168.0.2 -p 1645  とコマンドを叩いてもWith UDP checks, a send/expect string must be specified.と出て反応がありません。 nagiosでudpチェックをされてる方、お分かりなる方ご教授ください。 よろしくお願いします。

  • UDP通信での受信方法について

    MFCでUDPプロトコルを使ったサーバー・クライアントをソケットプログラムで書いております。 ソフトの内容は、クライアントから送信されたの文字列のコマンドをサーバで処理をするだけです。 サーバー側での受信の仕方は WSAAsyncSelect()関数を使ってソケットイベントが発生するごとに親ウィンドウに自作のメッセージ(WM_MY_MSG)が送られるように設定する ↓ WM_MY_MSGのメッセージハンドラ内でrecvfrom()関数を使って受信する。 という方法を用いています。クライアント2台ぐらいであれば正常に動きます。 質問1: まだ試したことはないのですが(というより試す環境がない)、ほぼ同時ぐらいに複数(10台ぐらい)のクライアントからコマンドが送信された場合、それを全部正確に受信できるものなのでしょうか?要するに一つのコマンドを処理中に別のコマンドが送られてきた場合の動作はどうなるのでしょうか? 質問2: UDP通信での受信をする場合の何かもっとスタンダードな方法があるのでしょうか? よろしくお願いします。

  • 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()と同様の処理が可能になり、目的が達成できるでしょうか。

  • TCP及びUDP通信について

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

  • TCPコネクションについて

    はじめまして 宜しくお願いいたします。 以下ご質問させてください。 TCPコネクションについて クライアント⇔サーバ間通信において、 ポート21からポート80(HTTP)に対してTCPコネクションをオープン することはできるのでしょうか? (クライアントポート21からサーバポート80に対してアクセスする ことってできるのでしょうか?) 自分の認識では・・・ TCPクライアントはダイナミック(OSが割り当てたランダムなポート。しばしば1024から4000の間)にポートを選択すると認識しているので が。 最初にFTP通信をおこなっており、その継続セッションでHTTP通信をおこなうといった場合にそういった使い方をするのでしょうか? 以上 宜しくおねがいいたします。

  • DBサーバと接続しているプロセスを見たい

    Oracleクライアントから、他のどのプロセス(もしくはスレッドか、 コネクションか)がサーバと接続しているかを見たいですが、 クライアントからは可能でしょうか?SQLで実現できますか? ご教授お願いいたします。

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

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