• 締切済み

Winsock で UDPパケットのデータロスト

Winsockを使用して で UDP/IPパケット受信するアプリケーションを作成しましたが、Winsockで UDP/IPデータを取りこぼしています。何か回避手段や対策がありましたらお教えいただけないでしょうか よろしくお願いします

  • matu
  • お礼率0% (0/1)

みんなの回答

noname#4807
noname#4807
回答No.1

UDP/IP自体受信を保証しない通信方法なため取りこぼしが起きてはならない システムの開発には使用できないと考えてください。取りこぼしが起きた 際に問題がないよう対策をとることはUDP/IPを使用するときは必須です。 上記を踏まえた上で、受信から次の受信待ち状態までの間隔を短くする ことです。完全なマルチタスク環境であれば受信プロセスやスレッドを 持つことで対応も可能ですが、Windows 3.Xでは少々難しいと思われます。 できるだけアプリケーションの処理を軽くするしかないのでは?

関連するQ&A

  • WinSockとWinPcapについて

    いつもお世話になります。 今、UDPパケット送受信ソフトを生成しています。 送信ソフトはWinSockを用いて作成しました。 受信ソフトをWinSockを用いて作成しましたが、 受信パケット数をカウントしようと思い、 recvfrom()でカウントしましたが、正常にカウントされない 保障されないことがWinSockではわかりました。 受信パケット数をカウントするには、 デバイスレベルで(Ethereal/WireShark)で行っている ようにWinPCapを用いると パケットをカウントできるのではないかと考えられます。 WinPcapでパケット受信を行う場合、 送信がWinSockで送信していても問題ないでしょうか? また、WinPcapでパケットを受信するには どうしたらいいのでしょうか? どうぞよろしくお願い致します。

  • UDPパケットの分割について

    こんにちは。 現在、クライアント&サーバの通信プログラムを作成しています。 クライアントがサーバに接続しにいく際、サーバの待ち受けポートにクライアントが UDPでブロードキャストしています。 その際、クライアントの情報もUDPに乗せて、送信しています。 ここで、問題なのですが、ネットワークモニタで通信データを見てみると、 クライアントから送信するUDPデータが1500バイト?を超えると、UDPパケットの分割が行われ、 2つめのデータが、UDPではなく、IPで送信されています。 しかも、2つめのIPのパケットがサーバ側に届くケースと届かないケースがあるように見受けられます。 (環境の違いかもしれません。) 2つめのパケット破棄は破棄が起こる環境では必ず起きます。 破棄が起きない環境では一回も起こりません。 スイッチ、NIC等で、破棄することってあるのでしょうか? ネットワーク上の問題っぽいので、OSの違い(Win2K pro,Win2k advanced server) などには関係ないですよね? どなたが、ご存知の方がおられましたらご教授願います。

  • WinsockによるUDP通信にて

    WinsockでUDP通信を行うプログラムを作っているのですが、 原因不明の問題が発生していて困っています。 通信手順は以下のとおりです。 (1) クライアントからサーバへ要求パケット送信 (2) 要求パケットを受け取ったサーバは、クライアントへACKを送信 (3) サーバが要求に対する応答パケットをクライアントへ送信 (4) 応答パケットを受け取ったクライアントは、サーバへACKを送信 クライアント-サーバ間でやりとりするデータは最大で992バイト、 それ以上になる場合は、分割して送信します。 パケットの分割が発生しない場合は、(1)~(3)がパケットの損失もなく通信できるのですが、 パケットの分割が発生する場合には、2回目以降の(4)のパケットがクライアントに届きません。再現率は今のところ100%です。 クライアント側のselect関数でもソケットを検出しません。 たしかにUDPは信頼性が低いですが、パケット分割が発生しないパターンでは100%届くので、UDPの仕様とは関係ないような気がします。 原因がさっぱりわからないので、アドバイスをお願いいたします。 ちなみに、クライアント、サーバともに同一端末内にあります(双方がループバックアドレスに対してパケットを送信)が、 これはテスト段階だからであって、本来はそれぞれ別々の端末で動作します。

  • 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/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パケットが送受信されない?

    ブロードバンドルータBRL-04FA(プラネットコミュニケーションズ)を使って、LAN環境を構築しました。 サブネット外にUDPパケットを送信し受信したいのですが、受信できていないようなのです。 ローカルサーバの設定でポート開放してみたり、バーチャルコンピュータに設定してみたのですが、UDPパケットを受信できません。 そのほかの設定でなにか注意すべきところがあったら教えてください。 初心者です。

  • IPパケット、TCPパケット、UDPパケット

    IPパケット、TCPパケット、UDPパケットのヘッダ構造とはどんなものなのでしょうか?また各々のフィールドがどのような役割を担っているのかについて教えてください。お願いしますm(__)m

  • UDPソケット通信におけるデータパケット

    UDPソケット通信をする際、受信データサイズとして考慮するべきサイズはアプリサイズとUDPヘッダー(8バイト)としてソケットオプションで受信バッファサイズを増加させたのですが、予想より受信できるパケット数が少ないです。 例) 1パケットのアプリサイズを10バイトしUDPヘッダーも考慮して実際1パケットあたり18バイトとして、最大5パケット受け取れるようにソケットオプションで アプリサイズ(10バイト)× UDPヘッダー(8バイト)×パケット数(5) 上記のように設定したのですが、実際5パケットも受信できませんでした。 上記のほかにIPヘッダーなども考慮しなければならないのでしょうか? 開発環境:solaris8 C言語

  • Javaのパケットキャプチャについて

    Javaでもネットワークのプログラミングができるということを知って、ちょっとそれをかじっている者です。 その学習をするに当たって、最終目標としてパケットキャプチャを作ってみたいと考えてるようになりました。 自分自身に送られてくるパケットを拾って、それを解析したいと思っています。 Pcap系のアプリケーション(WinPcapやlibpcap)を用いれば、それを用いたライブラリを使って作成できることもわかりました。 ただ、ちょっとこだわってみたいので、そういったものを利用することなく作成してみたいなと考えています。 ですが、インターネットで調べても、それらを使用した方法しかわかりません。 実際にそのようなことができるのでしょうか・・・。 TCPパケット・UDPパケットを受信することは可能ですが、その他のプロトコルのパケットの受信と、パケットの解析まではできないのじゃないかと思っています。 気になったので質問しました。 よろしくお願いします。

    • ベストアンサー
    • Java
  • winsockについて

    winsock、非同期モードでTCP/IP通信を行うようなプログラムを作成しています。 通常の同期モードでのプログラムは完成させることができました。 そこで、クライアント側を非同期モードにし、受信バッファにデータが入ったら受信するというようなプログラムにしたのですが、どうもうまく動作してくれません。 やはりサーバー側も非同期モードにしなければならないのですか?? どなたかご教授お願いします。