1

UDP ソケットを介して相互に通信するサーバーとクライアントがあります。サーバーはポート 10002 を開き、着信データグラムをリッスンしています。

クライアントがサーバー IP を取得するために、サーバーが応答する 1 つのブロードキャスト データグラムを送信します。サーバーの IP アドレスの検索を担当するクライアント コードは次のようになります。

    private IPEndPoint GetServerEP(TimeSpan timeout, UdpClient udpclient)
    {
        IPEndpoint server = new IPEndPoint(IPAddress.Broadcast, 10002);
        byte[] data = GetDiscoverDatagram();

        _udpclient.EnableBroadcast = true;
        udpclient.Send(data, data.Length, server);

        try
        {
            udpclient.Client.ReceiveTimeout = (int)timeout.TotalMilliseconds;
            udpclient.Receive(ref server);
        }
        catch (SocketException e)
        {
            string msg = string.Format("Server did not respond within {0} ms", timeout.TotalMilliseconds);
            throw new TimeoutException(msg, e);
        }

        return server;
    }

これを実行すると、サーバーが実際にブロードキャスト データグラムを受信し、クライアントの送信元と同じポートにバインドされたパケットで応答することがわかります。ただし、クライアントは何も受信せず、タイムアウトします。

私は何が欠けていますか?

4

1 に答える 1

0

愚かな私 (または; 愚かなファイアウォール)。コードは機能しましたが、ファイアウォールがサーバーからの応答パケットをブロックしました。すべてを無効にした後、魅力のように機能します。

于 2013-08-12T11:02:20.533 に答える