在一个端口中使用udpclient并发发送和接收数据

7
我正在尝试与本地端口50177的特定端点发送和接收数据。发送数据非常好,但当程序尝试接收数据时,它无法接收任何数据。当我使用Wireshark嗅探网络时,我看到服务器向我发送了数据。我知道我不能同时在一个端口上拥有2个UdpClient。

有人能帮助我吗?

UdpClient udpClient2 = new UdpClient(50177);
IPEndPoint Ip2 = new IPEndPoint(IPAddress.Parse("255.255.255.255"), 1005);
udpClient2.Send(peerto255, peerto255.Length, Ip2);

IPEndPoint Ip = new IPEndPoint(IPAddress.Parse("10.10.240.1"), 1005); 
var dgram = udpClient2.Receive(ref Ip);
2个回答

8

您可以在一个端口上拥有两个UdpClient,但是在将其绑定到终结点之前,需要设置套接字选项。

private static void SendAndReceive()
{
  IPEndPoint ep1 = new IPEndPoint(IPAddress.Any, 1234);
  ThreadPool.QueueUserWorkItem(delegate
  {
    UdpClient receiveClient = new UdpClient();
    receiveClient.ExclusiveAddressUse = false;
    receiveClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
    receiveClient.Client.Bind(ep1);
    byte[] buffer = receiveClient.Receive(ref ep1);
  });

  UdpClient sendClient = new UdpClient();
  sendClient.ExclusiveAddressUse = false;
  sendClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
  IPEndPoint ep2 = new IPEndPoint(IPAddress.Parse("X.Y.Z.W"), 1234);
  sendClient.Client.Bind(ep1);
  sendClient.Send(new byte[] { ... }, sizeOfBuffer, ep2);
}

sendClient.Client.Bind(ep1); 应该改为 sendClient.Client.Bind(ep2); 吗? - Alex Johnson
@AlexJohnson 不,ep1是正确的。它是关于将两个UdpClients绑定到一个端口上的问题。 - Farzan
@Farzan,但当您将多个套接字绑定到同一端点,并仅使用一个套接字进行接收时,您不会开始丢失传入的数据吗? 数据只会出现在第一个创建的套接字的输入缓冲区中还是所有套接字的输入缓冲区中都会出现? - Mariusz Schimke
这非常有帮助。但是我发现如果在绑定接收器之前将发射器绑定到终点,它将无法工作。像这个例子一样,先绑定接收器就可以工作。 - Greg
进一步解释我的上面的评论,我的意思是在将发送客户端绑定到端点之前,我必须先调用receiveClient.Receive(ref ep1)。 - Greg
这段代码是可行的。 - undefined

1

在接收时使用与发送相同的IPEndPoint。

UdpClient udpClient2 = new UdpClient(50177);
IPEndPoint Ip2 = new IPEndPoint(IPAddress.Parse("255.255.255.255"), 1005);
udpClient2.Send(peerto255, peerto255.Length, Ip2);
var dgram = udpClient2.Receive(ref Ip2);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接