UDPClient сообщения не получают - PullRequest
0 голосов
/ 11 марта 2019

Я новичок в 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 в качестве отправителя и получателя, я получал «кто» в окне консоли ... Что я делаю не так?Что происходит?

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

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

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

...