Получите ответ на UDP Broadcast (C #) - PullRequest
4 голосов
/ 27 мая 2011

Я пытаюсь отправить трансляцию 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. Кто-нибудь может мне помочь плз? :)

Ответы [ 2 ]

1 голос
/ 27 мая 2011

Поскольку вы используете один и тот же процесс для отправки и получения, вам нужно открыть получатель перед отправкой сообщения, а также использовать udpClient.ReceiveAsync () и дождаться ответа, прежде чем разрешить закрытие программы. .

0 голосов
/ 27 мая 2011
  1. Вы должны использовать ReceiveFrom. Receive для TCP.
  2. Если я не ошибаюсь, широковещательные сообщения не ставятся в очередь. Звоните BeginReceiveFrom до трансляции и EndReceiveFrom после.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...