Сообщения UdpClient не принимаются

#c# #visual-studio #sockets #udp #udpclient

#c# #visual-studio #сокеты #udp #udpclient

Вопрос:

Я почти новичок в C #, VS и .NET. У меня есть некоторые базовые ошибки, однако мне действительно сложно общаться с UDP с помощью сервоконтроллера, который у меня есть.

Я надеюсь, что кто-нибудь сможет объяснить мне, что не так с моим кодом, как это работает и каков наилучший подход для получения сообщений.

Мой первый шаг — передать сообщение «кто», и когда мой сервомотор увидит это, я получу ответ с информацией об этом сервомоторе.

 public void Discover()
        {
            byte[] message = Encoding.ASCII.GetBytes("who");
            IPEndPoint targetEndPoint = new IPEndPoint(IPAddress.Broadcast, LINKPORT);
            IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);

            System.Console.WriteLine("New Transimission Sequence:");
            foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
            {
                if (ni.NetworkInterfaceType == NetworkInterfaceType.Ethernet)
                {
                    foreach (UnicastIPAddressInformation ip in ni.GetIPProperties().UnicastAddresses)
                    {
                        if (ip.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                        {
                            IPEndPoint localEndpoint = new IPEndPoint(IPAddress.Parse(ip.Address.ToString()), LINKPORT);

                            UdpClient udpClient = new UdpClient(localEndpoint);
                            udpClient.Send(message, message.Length, targetEndPoint);

                            UdpClient udpClientB = new UdpClient(remoteEndPoint);
                            udpClientB.Client.ReceiveTimeout = 1000;
                            string recvMessage;
                            try
                            {
                                recvMessage = System.Text.Encoding.UTF8.GetString(udpClientB.Receive(ref remoteEndPoint));
                            }
                            catch (Exception e)
                            {
                                recvMessage = e.Message;
                            }

                            System.Console.WriteLine(recvMessage);

                            udpClient.Close();
                            udpClientB.Close();
                        }
                    }
                }
            }

            System.Console.WriteLine("==========================================================================================");

            return;
        }
  

Это то, что у меня есть на данный момент. Я понимаю, что на данный момент это очень грубо, однако я даже не могу заставить это работать… Я пытаюсь передать сообщение «кто» на все мои сетевые карты в приведенном выше коде. И затем, используя udpClientB , я хочу получить сообщение. Я пытался использовать udpClient , но это не сработало, и именно поэтому я создал udpClientB . Я также пытался создать отдельный поток, который просто прослушивает этот порт, и ничего…

Прямо сейчас это то, что я получаю в окне моей консоли.

 New Transimission Sequence:
Exception thrown: 'System.Net.Sockets.SocketException' in System.dll
A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond
Exception thrown: 'System.Net.Sockets.SocketException' in System.dll
A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond
Exception thrown: 'System.Net.Sockets.SocketException' in System.dll
A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond
==========================================================================================
  

Когда я попытался использовать udpClient в качестве отправителя и получателя, я получал «who» в окне моей консоли… Что я делаю не так? Что происходит?

Я утроил проверку, и сообщения отправляются, и я отвечаю на сообщение, когда оно достигает моего сервоконтроллера, что и происходит.

Также вопрос после того, как это будет сделано, каков наилучший подход для такого рода вещей? На этот код нажимается кнопка формы Windows, в конечном итоге я хочу отобразить всех, кто ответил, в списке форм Windows. Должен ли я создавать асинхронные вызовы функций? Использовать «Таймер» для постоянного прослушивания и опорожнения буфера ethernet? Создать новый поток для прослушивания? Или то, что я сейчас делаю, просто в строке?

Спасибо, что уделили время чтению этого.

Комментарии:

1. Удалите свой receivetimeout или просто немного увеличьте его и попробуйте еще раз.

2. udp не требует передачи их на другую сторону..

3. Я увеличил время ожидания до 5 секунд, и я получаю то же самое. Глядя на передачу в WireShark, я отвечаю со средним временем обработки 0,00035 секунды… Это не в сети, я подключен к ней напрямую (через небольшой маршрутизатор).

4. У кого-нибудь еще есть эта проблема или какое-то понимание? Я все еще не могу понять, что происходит.

5. вы должны сначала «получить» внутри другого потока, а затем отправить сообщение