无法在c#中使用udp发送数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法在c#中使用udp发送数据相关的知识,希望对你有一定的参考价值。
您好我正在开发示例应用程序,用于演示udp客户端将数据从客户端发送到服务器。我已经创建了控制台应用程序,下面是我的代码。
class Program
{
static void Main(string[] args)
{
senddata();
while (true)
{
try {
UdpClient udpClient = new UdpClient(9999);
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
string returnData = Encoding.ASCII.GetString(receiveBytes);
string result;
result = returnData.ToString();
}
catch(Exception e)
{
}
}
void senddata()
{
UdpClient udpClient = new UdpClient(9999);
udpClient.Connect("10.170.84.163", 9999);
Byte[] senddata1 = Encoding.ASCII.GetBytes("Hello World");
udpClient.Send(senddata1, senddata1.Length);
}
}
}
每当Byte [] receiveBytes被执行时,我得到我的空白黑屏,什么都不会发生。谁能告诉我如何解决这个问题?任何帮助,将不胜感激。谢谢。
答案
这里有几个问题:
- 您在该端口上启动侦听器之前将数据发送到udp端口(通过
senddata()
),并且您只执行一次,因此侦听器无法接收它。 - 在发送数据时,无需将
UdpClient
绑定到特定端口,尤其是在您使用另一个UdpClient
监听的同一端口上。只需使用UdpClient udpClient = new UdpClient();
让它使用任何可用的端口进行发送。 - 由于您正在测试 - 不需要将数据发送到外部IP,而是发送到loopback接口:
udpClient.Connect(IPAddress.Loopback, 9999);
。 UdpClient
实施IDisposable
,所以在你完成后处理它。- 你的
while (true)
循环不起作用,因为你没有处理UdpClient
,所以在循环的第二次迭代,第二次UdpClient
将尝试绑定到同一个9999端口并失败,因为已经有侦听器(你没有处置)在同一个港口。
您的代码上面有修复(显然不是“生产”代码所以我不会添加取消等内容,只修复以便能够看到消息即将到来):
static void senddata() {
// send message every 100 ms
while (true) {
// wrap in using
using (UdpClient udpClient = new UdpClient()) {
// loopback
udpClient.Connect(IPAddress.Loopback, 9999);
Byte[] senddata1 = Encoding.ASCII.GetBytes("Hello World");
udpClient.Send(senddata1, senddata1.Length);
}
Thread.Sleep(100);
}
}
static void Main(string[] args) {
// run sending in background
Task.Run(() => senddata());
try {
// wrap in using
using (UdpClient udpClient = new UdpClient(9999)) {
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
// move while loop here
while (true) {
// this blocks until message is received
Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
string returnData = Encoding.ASCII.GetString(receiveBytes);
Console.WriteLine(returnData);
}
}
}
catch (Exception e) {
// do something meaningful
}
}
另一答案
它看起来不像是在输出收到的字符串。
像这样......
string result;
result = returnData.ToString();
Console.WriteLine(result);
另一答案
尝试更改以下内容:
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
使用端口9999而不是随机端口。老实说有点惊讶,不会抛出异常。
请注意,绑定到随机端口作为服务器不是非典型的,但远程端需要某种方式来发现随机端口I..E。 ftp使用第二个端口进行实际文件数据传输的方式,该端口号作为开始传输的消息的一部分发送。
以上是关于无法在c#中使用udp发送数据的主要内容,如果未能解决你的问题,请参考以下文章