gpt4 book ai didi

c# - 本地机器上的 UdpClient

转载 作者:太空宇宙 更新时间:2023-11-03 13:10:17 24 4
gpt4 key购买 nike

我是 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 地址时,即使它未分配给任何 pc(例如 192.168.10.10),它也运行良好:它发送字符串并且 Receive() 一直在等待传入数据。

最佳答案

发生错误是因为在您要发送到的端口上没有打开套接字。

为了简单地测试 UDP 通信,您可以通过更改要发送到的端口来修复您的代码示例。 IE。将 Connect() 方法调用更改为:

udpClient.Connect(IPAddress.Parse(IPADDR), 11000);

这将导致套接字发送给它自己。只需进行此更改,您的代码就可以成功运行。


作为记录,这里是使用 UdpClient 的最简单的演示代码:

UdpClient client = new UdpClient(0, AddressFamily.InterNetwork);

byte[] datagram = Encoding.ASCII.GetBytes("hello world!");

IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Loopback, ((IPEndPoint)client.Client.LocalEndPoint).Port);

client.Send(datagram, datagram.Length, ipEndPoint);
datagram = client.Receive(ref ipEndPoint);

Console.WriteLine("Received: \"" + Encoding.ASCII.GetString(datagram) + "\"");

当然,在真实的网络 I/O 情况下,您将有两个端点,每个端点都绑定(bind)到自己的本地端口,发送到另一个端点的端口。因此,无论是您的代码示例,还是我提供的这个更简单的代码示例,都不是非常有用的实际工作程序。但它确实能让您了解一些有关套接字 API 工作原理的知识。

关于c# - 本地机器上的 UdpClient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29098611/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com