質問

私は、ブロードキャストを送信し、それにサーバ応答を聞かせしようとしています:

public static void SendBroadcast()
    {
        byte[] buffer = new byte[1024];
        var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);

        socket.Connect(new IPEndPoint(IPAddress.Broadcast, 16789));
        socket.Send(System.Text.UTF8Encoding.UTF8.GetBytes("Anyone out there?"));

        var ep = socket.LocalEndPoint;

        socket.Close();

        socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

        socket.Bind(ep);
        socket.Receive(buffer);
        var data = UTF8Encoding.UTF8.GetString(buffer);
        Console.WriteLine("Got reply: " + data);

        socket.Close();
    }

    public static void ReceiveBroadcast()
    {
        byte[] buffer = new byte[1024];

        var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        var iep = new IPEndPoint(IPAddress.Any, 16789);
        socket.Bind(iep);

        var ep = iep as EndPoint;
        socket.ReceiveFrom(buffer, ref ep);
        var data = Encoding.UTF8.GetString(buffer);

        Console.WriteLine("Received broadcast: " + data + " from: " + ep.ToString());

        buffer = UTF8Encoding.UTF8.GetBytes("Yeah me!");
        socket.SendTo(buffer, ep);

        socket.Close();
    }

放送は罰金到着したが、返事はしていません。例外はスローされません。誰も私を助けることができますか?私は返事か何かのために新しい接続をオープンする必要がありますか?

編集:私のコードビットを変更し、今では動作します!お返事をありがとう!

役に立ちましたか?

解決

これは、彼が何かを受け取ることはないだろうので、あなたのSendBroadcast()ソケットがポートにバインドされているようには見えません。彼は彼自身の返事を受け取ることになりますので、実際には、あなたのReceiveBroadcast()ソケットは、彼自身のポートを応答を返送されます。

ReceiveBroadcast: binds to port 16789
SendBroadcast:    sends to port 16789
ReceiveBroadcast: receives datagram on port 16789
ReceiveBroadcast: sends reply to 16789
ReceiveBroadcast: **would receive own datagram if SendTo follwed by Receive**

あなたは(代わりに、自分のエンドポイントSendBroadcast()の)そのポートに送信(a)のの異なるのポートにバインドをReceiveBroadcast()epを変更している必要があり、あるいは(b)は、両方の機能は同じソケットを使用していますオブジェクトの両方のは、ポート16789上のデータグラムを受信することができ、彼らがそう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top