c# - 从同一个套接字发送和接收数据的简单 UDP 示例

标签 c# udp

出于某种原因,我很难从同一个套接字发送和接收数据。无论如何,这是我的客户端代码:

var client = new UdpClient();
IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 11000); // endpoint where server is listening (testing localy)
client.Connect(ep); 

// send data
client.Send(new byte[] { 1, 2, 3, 4, 5 }, 5);

// then receive data
var receivedData = client.Receive(ref ep);  // Exception: An existing connection was forcibly closed by the remote host

基本上我想创建一个协议(protocol),我发送一个 udp 数据包然后我期待一个响应。就像每个请求都有一个响应的 HTTP 协议(protocol)一样。 如果服务器位于不同的计算机上,则此代码有效。虽然可能存在服务器和客户端位于同一台计算机上的情况。

这是服务器:

UdpClient udpServer = new UdpClient(UDP_LISTEN_PORT);

while (true)
{
    var groupEP = new IPEndPoint(IPAddress.Any, 11000); // listen on any port
    var data = udpServer.Receive(ref groupEP);
    udpServer.Send(new byte[] { 1 }, 1); // if data is received reply letting the client know that we got his data          
}

编辑

我不能使用 tcp 的原因是因为有时客户端在 NAT(路由器)后面,并且 UDP 打洞比 TCP 更简单。


解决方案:

感谢 markmnl 的回答,这是我的代码:

服务器:

UdpClient udpServer = new UdpClient(11000);

while (true)
{
    var remoteEP = new IPEndPoint(IPAddress.Any, 11000); 
    var data = udpServer.Receive(ref remoteEP); // listen on port 11000
    Console.Write("receive data from " + remoteEP.ToString());
    udpServer.Send(new byte[] { 1 }, 1, remoteEP); // reply back
}

客户端代码:

var client = new UdpClient();
IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 11000); // endpoint where server is listening
client.Connect(ep);

// send data
client.Send(new byte[] { 1, 2, 3, 4, 5 }, 5);

// then receive data
var receivedData = client.Receive(ref ep);

Console.Write("receive data from " + ep.ToString());

Console.Read();

最佳答案

(我假设您知道使用 UDP(用户数据报协议(protocol))不能保证交付、检查重复项和拥塞控制,只会回答您的问题。

在你的服务器中这一行:

var data = udpServer.Receive(ref groupEP);

groupEP 从您所拥有的重新分配给您收到东西的地址。

这一行:

udpServer.Send(new byte[] { 1 }, 1); 

将不起作用,因为您没有指定将数据发送给谁。 (它适用于您的客户端,因为您调用了连接,这意味着发送将始终发送到您连接的端点,当然我们不希望在服务器上出现这种情况,因为我们可能有很多客户端)。我会:

UdpClient udpServer = new UdpClient(UDP_LISTEN_PORT);

while (true)
{
    var remoteEP = new IPEndPoint(IPAddress.Any, 11000);
    var data = udpServer.Receive(ref remoteEP);
    udpServer.Send(new byte[] { 1 }, 1, remoteEP); // if data is received reply letting the client know that we got his data          
}

此外,如果您在同一台机器上有服务器和客户端,您应该将它们放在不同的端口上。

关于c# - 从同一个套接字发送和接收数据的简单 UDP 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20038943/

相关文章:

audio - 将多个 RTP 流混合成一个流

c++ - 如何在存在 2 个网卡的情况下为 UDP 多播设置套接字?

c# - SQL Server报告对齐到网页中心

c# - 调试时是否可以将 "see"放入 C# foreach 循环的迭代集合中?

c - sendto() 缓冲区满时阻塞,如何解决?

c++ - Windows,UDP 数据包静默丢弃

c# - DOC 到 PDF 库(不一定免费)

c# - Unity : Issue with serialization since version 5. 0(父/子关系)

c# - 为什么 HttpClient.PostAsync 缓冲响应?

java - Android 通过UDP套接字发送对象