【发布时间】:2013-12-01 01:56:57
【问题描述】:
由于某种原因,我很难从同一个套接字发送和接收数据。无论如何,这是我的客户端代码:
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
基本上我想创建一个协议,在该协议中我发送一个 udp 数据包,然后我期望得到响应。就像每个请求的 HTTP 协议都有一个响应。 如果服务器位于不同的计算机上,则此代码有效。但是,可能存在服务器和客户端在同一台计算机上的情况。
这里是服务器:
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();
【问题讨论】: