接收UDP广播(C#)的答案

时间:2011-05-27 12:52:12

标签: c# udp broadcast

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

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

  3. 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时程序停止。任何人都可以帮助我PLZ? :)

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

  1. 您应该使用ReceiveFromReceive用于TCP。
  2. 如果我没弄错的话,广播消息不会排队。广播前请致电BeginReceiveFrom,之后致电EndReceiveFrom