Я новичок в кодировании C # UDP, и у меня есть некоторое «странное» поведение при локальном использовании клиента UDP на моем компьютере. Я хочу отправить данные UDP с одного порта (11000) на моем компьютере на другой порт (12000) на том же компьютере.
Это фрагмент моего кода:
public class MyClass
{
//Creates a UdpClient for reading incoming data.
private UdpClient udpClient;
private Thread thread;
private const String IPADDR = "127.0.0.1";
public MyClass()
{
udpClient = new UdpClient(11000);
udpClient.Connect(IPAddress.Parse(IPADDR), 12000);
this.thread = new Thread(new ThreadStart(this.Execute));
this.thread.Name = "Udp";
this.thread.Start();
SendData("The quick brown fox jumps over the lazy dog");
}
private void Execute()
{
try
{
// Blocks until a message returns on this socket from a remote host.
IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
Byte[] receiveBytes = this.udpClient.Receive(ref remoteIpEndPoint);
Console.WriteLine("Data received");
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
public void SendData(String data)
{
Console.WriteLine("Sending...");
try
{
this.udpClient.Send(System.Text.Encoding.ASCII.GetBytes(data), data.Length);
}
catch (Exception e)
{
Console.WriteLine(String.Format("Exception {0}", e.Message));
}
}
}
Если я запускаю это, я получаю исключение:
Sending...
System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host
at System.Net.Sockets.Socket.ReceiveFrom(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, EndPoint& remoteEP)
at System.Net.Sockets.UdpClient.Receive(IPEndPoint& remoteEP)
at test.MyClass.Execute() in C:\Temp\test\Class1.cs:line 40
Исключение, кажется, происходит в этой строке:
Byte[] receiveBytes = this.udpClient.Receive(ref remoteIpEndPoint);
В момент SendData() Receive генерирует исключение. Когда я не выполняю отправку, я не получаю исключения. Похоже, что отправка вызывает возврат с исключением.
Когда я использую реальный IP-адрес своего компьютера, у меня такое же поведение. Однако, когда я использую любой другой IP-адрес, даже если он не назначен ни одному компьютеру (например, 192.168.10.10), он работает хорошо: он отправляет строку, а Receive() продолжает ждать входящих данных.
MyClass
? - person Jack Hughes   schedule 17.03.2015