重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

WinsockでUDP通信を行うプログラムを作っているのですが、
原因不明の問題が発生していて困っています。

通信手順は以下のとおりです。
(1) クライアントからサーバへ要求パケット送信
(2) 要求パケットを受け取ったサーバは、クライアントへACKを送信
(3) サーバが要求に対する応答パケットをクライアントへ送信
(4) 応答パケットを受け取ったクライアントは、サーバへACKを送信

クライアント-サーバ間でやりとりするデータは最大で992バイト、
それ以上になる場合は、分割して送信します。

パケットの分割が発生しない場合は、(1)~(3)がパケットの損失もなく通信できるのですが、
パケットの分割が発生する場合には、2回目以降の(4)のパケットがクライアントに届きません。再現率は今のところ100%です。
クライアント側のselect関数でもソケットを検出しません。

たしかにUDPは信頼性が低いですが、パケット分割が発生しないパターンでは100%届くので、UDPの仕様とは関係ないような気がします。
原因がさっぱりわからないので、アドバイスをお願いいたします。

ちなみに、クライアント、サーバともに同一端末内にあります(双方がループバックアドレスに対してパケットを送信)が、
これはテスト段階だからであって、本来はそれぞれ別々の端末で動作します。

A 回答 (1件)

おつかれさまです。


自分では、UDPは、
 1.受信順位が送信順位通りにはならない場合がある。
 2.送信した全てのデータが受信できるとは限らない。
   だめなデータも受信してしまうので、それらの
   データは読み飛ばすしかない。
 3.つまり、まともなハンドシェイクはできない。
程度で、通信の品質は「ラジオ放送よりひどい」と考えています。
たとえ実験用のネットワークで動いても、お外でちゃんと動いて
くれるか心配でなりません。つまり、それでも良い、極端に言うと
「一度も送受信に成功しなくても問題ない」ような厳密度の低い
情報の送信にしか使えないなぁと考えています。

また、この欠点を補うためにハンドシェイクをコードしていくと、
結局TCP/IPになってしまいます。それなら最初からTCP/IPを
使った方がはるかに簡単で確実です。
TCP/IPなら、ACKやパケット等のことは全て無視してコードでき、
より通信仕様の精度に注力できます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!