【问题标题】:Receive Answer to UDP Broadcast (C#)接收对 UDP 广播的应答 (C#)
【发布时间】:2011-09-03 09:28:22
【问题描述】:

我正在尝试发送 udp 广播,并在 c# 中接收答案。虽然发送广播完美,但我在 c# 中没有收到任何答案。但是当我用wireshark查看时,我可以看到已经发送了一个答案:

  1. 从 192.168.0.141 发送到 192.168.0.255
  2. 从 192.168.0.105 发送到 255.255.255.255(这就是答案)


Wireshark 日志:

1   0.000000    192.168.0.141   192.168.0.255   UDP Source port: 55487  Destination port: 17784
2   0.000851    192.168.0.105   255.255.255.255 UDP Source port: 17784  Destination port: 55487



这是我的 c# 代码:

    private static byte[] SendBuffer = new byte[] { 1, 2, 3 };

    public static void SendAndReceiveBroadcast( byte[] data, IPEndPoint broadcastEndpoint )
    {

        using( Socket broadcastSocket = new Socket( AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp ) )
        {
            broadcastSocket.SetSocketOption( SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1 );
            broadcastSocket.SendTo( data, broadcastEndpoint );
            receivePort = broadcastSocket.LocalEndPoint.ToString().Split( ':' )[1];
            Console.WriteLine( "Sent {0} from Port {1}", CollectionsHelper.ItemsToString( data, "{0:X2}" ), broadcastSocket.LocalEndPoint.ToString() );
            broadcastSocket.Close();
        }

        using( Socket receiveSocket = new Socket( AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp ) )
        {
            IPEndPoint broadcastAddress = new IPEndPoint( IPAddress.Any, Convert.ToInt32( receivePort ) );
            UdpClient udpClient = new UdpClient();
            udpClient.Client.SetSocketOption( SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true );
            udpClient.Client.Bind( broadcastAddress );
            IPEndPoint remoteIP = new IPEndPoint( IPAddress.Any, Convert.ToInt32( receivePort ) );
            byte[] answer = udpClient.Receive( ref remoteIP );
        }
    }

程序在调用 udpClient.Receive 时停止。有人可以帮我吗? :)

【问题讨论】:

    标签: c# udp broadcast


    【解决方案1】:

    由于您使用相同的过程来发送和接收,因此您需要在发送消息之前打开接收器,并且您需要使用 udpClient.ReceiveAsync() 并等待答案,然后才能让您的程序关闭.

    【讨论】:

      【解决方案2】:
      1. 您应该使用ReceiveFromReceive 用于 TCP。
      2. 如果我没记错的话,广播消息不会排队。直播前拨打BeginReceiveFrom,播出后拨打EndReceiveFrom

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-07
        • 1970-01-01
        相关资源
        最近更新 更多