• 締切済み

WinsockによるUDP通信にて

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

みんなの回答

回答No.1

おつかれさまです。 自分では、UDPは、  1.受信順位が送信順位通りにはならない場合がある。  2.送信した全てのデータが受信できるとは限らない。    だめなデータも受信してしまうので、それらの    データは読み飛ばすしかない。  3.つまり、まともなハンドシェイクはできない。 程度で、通信の品質は「ラジオ放送よりひどい」と考えています。 たとえ実験用のネットワークで動いても、お外でちゃんと動いて くれるか心配でなりません。つまり、それでも良い、極端に言うと 「一度も送受信に成功しなくても問題ない」ような厳密度の低い 情報の送信にしか使えないなぁと考えています。 また、この欠点を補うためにハンドシェイクをコードしていくと、 結局TCP/IPになってしまいます。それなら最初からTCP/IPを 使った方がはるかに簡単で確実です。 TCP/IPなら、ACKやパケット等のことは全て無視してコードでき、 より通信仕様の精度に注力できます。

関連するQ&A