#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. вы должны сначала «получить» внутри другого потока, а затем отправить сообщение