0

現在取り組んでいるサーバー クライアント アプリケーションがあります。サーバーは WAN 経由で正常にデータを受信して​​おり、クライアントはデータを受信して​​いるように見えますが、クライアントは 1 つの通信しか受信していません。クライアントが常に最初の戻りUDP通信のみを受信し、その後の通信を受信しないようにするWANを介したものはありますか? 助けてくれてありがとう。

クライアント UDP リスニング コード

private void receiveUDP()
    {
        System.Net.IPEndPoint test = new System.Net.IPEndPoint(System.Net.IPAddress.Any,UDP_PORT_NUMBER);
        System.Net.EndPoint serverIP = (System.Net.EndPoint)test;
        server.Bind(serverIP);
        //server.Ttl = 50;

        EndPoint RemoteServ = (EndPoint)listenUDP;
        do
        {
            byte[] content = new byte[1024];
            int data = server.ReceiveFrom(content, ref RemoteServ);

            string message = Encoding.ASCII.GetString(content);


            ProcessCommands(message);


        } while (true);
    }
4

1 に答える 1

1

これは暗黒面でのちょっとした刺し傷です (何が起こっているのかを実際に説明するのに十分なコードを提供していないため) が、一部の UDP データグラムが WAN 経由で配信されず、他のものは常に正常に到着します。この理由は MTU です。単一のUDP データグラムで送信できる最大伝送単位。これにより、たとえば、最初のデータグラムが短い「接続を受け入れます」というメッセージであり、その後に大きなファイルを含むデータグラムが続く場合に、表示されるような動作が簡単に生成されます。最初の (小さい) データグラムは MTU よりも小さいため配信されますが、次の (大きい) データグラムは MTU よりも大きく、途中で破棄されます。

WAN を介した UDP の場合、MTU は約 1500 バイトを超えることはなく、多くの場合、1200 バイトまで低くなることがあります。それより大きいパケットは、エンドポイント間のどこかに静かにドロップされます。UDP 経由で大きなデータ ブロックを送信するには、データを送信するネットワーク セグメントの MTU よりも小さい単位に分割する必要があります。

LAN では、通常、任意のサイズのデータ​​グラムを送信して問題を解決できます。しかし、それらがインターネットまたは異種ネットワークを介して送信されるとすぐに、黙って破棄される可能性があります。

大きなファイルを送信する必要がある場合は、代わりに TCP 経由で送信することを選択できます。TCP は、MTU 内に収まるようにチョッピング データを自動的に管理し、そのパケットがすべて受信され、順番に受信されるようにします。UDP 経由で送信されたデータグラムから受信しないことを保証します。

上で述べたように、これは暗闇の中の完全な刺し傷であり、実際の問題とは実際には関係がないかもしれません. しかし、最初のパケットが常に正常に到着し、その後のパケットがまったく到着しないことだけを続けなければならないのは、部屋の中の象です。

于 2011-08-15T03:03:51.687 に答える