0

データグラムを収集しようとしている単純な UDP リスナーがあります。私のデータグラムは、2 つのデータ形式のいずれかになります。最初のデータ形式では、期待どおりにプログラムでデータを受信して​​います。2 番目の例では、UDP データが Wireshark 経由でネットワーク インターフェイスに渡されていることは確認できますが、プログラムからデータが受信されたことを示す兆候はまったくありません。これらは、Windows が拒否した不正な UDP パケットである可能性があると考えましたが、Wireshark はそれらを UDP としてラベル付けしています。私のコードは以下の通りです:

    static void Main(string[] args)
    {
        Thread thdUdpServer = new Thread(new ThreadStart(serverThread));
        thdUdpServer.Start();
    }

    static void serverThread()
    {

        Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        socket.Bind(new IPEndPoint(new IPAddress(0), 2000));

        while (true)
        {
            byte[] responseData = new byte[128];
            socket.Receive(responseData);
            string returnData = Encoding.ASCII.GetString(responseData);
            Console.WriteLine(DateTime.Now + " " + returnData);

        }

欠落しているパケットはすべて、次のような (ASCII に変換された) 29 バイトのデータグラムです。

#01RdFFFF...?...... ........F

Wireshark はそれらの存在を示すのに、.NET はそれらを認識していないように見えるのはなぜですか?

4

2 に答える 2

2

バイトに印刷できない ASCII 文字が含まれている場合、コンソールに表示されないことがあります。

于 2012-10-16T02:30:54.873 に答える
0

コードに何かが欠けています。ReceiveFrom を呼び出すときにソケット例外をスローする必要があります (少なくとも MSDN によると、コードは試していません)。

リッスンするアドレス: ポートにソケットをバインドする必要があります (または、任意のローカル アドレスでリッスンするアドレスとして 0.0.0.0 を使用します)。

socket.Bind(new IPEndPoint(new IPAddress(0), 2000);

ReceiveFrom の EndPoint は、サーバーのリッスン ポートではありません。パケットを受信したいアドレスです。0.0.0.0:0 のエンドポイントを使用して、任意のホストから受信できます。

メソッドから戻った後、エンドポイントには、パケットを送信したホスト (クライアント) のアドレスが入力されます。

クライアント エンドポイントを気にしない場合は、ReceiveFrom の代わりに Receive を使用できます。おそらく、クライアントは 192.168.1.100:2000 からパケットを送信していないため、受信していません。ReceiveFrom を呼び出すときに例外が発生しない理由を考えました。

また: Convert.ToInt32 を呼び出す必要はありません:

new IPEndPoint(IPAddress.Parse("192.168.1.100"), Convert.ToInt32(2000));

2000 はすでに int です。

于 2012-10-16T03:10:06.763 に答える