C# UdpClient.Receive(…)不';我没有收到任何数据
我有一个套接字服务器(用C++编写),它接收来自客户机的请求并发送响应。因此,我的测试客户端应用程序(C#)非常简单:C# UdpClient.Receive(…)不';我没有收到任何数据,c#,sockets,udp,C#,Sockets,Udp,我有一个套接字服务器(用C++编写),它接收来自客户机的请求并发送响应。因此,我的测试客户端应用程序(C#)非常简单: try { UdpClient udpClient = new UdpClient(10241); // Connect udpClient.Connect(server_ip_address, 10240); // prepare the packet to
try {
UdpClient udpClient = new UdpClient(10241);
// Connect
udpClient.Connect(server_ip_address, 10240);
// prepare the packet to send
iWritableBuff wbuff = new iWritableBuff();
[ ... ]
// Send
udpClient.Send(wbuff.GetBuff(), (int)wbuff.Written());
// Receive a response
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
Console.WriteLine("We've got some data from the server!!! " + receiveBytes.Length + " bytes.");
udpClient.Close();
} catch (Exception e) {
Console.WriteLine("ERROR: " + e.ToString());
}
我在同一台计算机上运行这两个应用程序。服务器从客户端端口10241接收到对端口10240的请求,并将响应发送回客户端端口10241,但客户端从未收到该请求。所以,我确信服务器发送包回来,因为所有的工作都与C++客户端完美地结合在一起。这意味着我在对我的客户做错事。有什么想法吗
谢谢
另外,只需使用Berkley Socket C#客户端进行测试:
它工作得很好!UdpSocket有什么问题吗?不确定这是否适用于不广播数据包但只将数据包发送到指定地址的UDP客户端,但我遇到了类似的障碍 我有一个UDPClient,它广播一个udp数据包,用于发现我们网络上的一些自定义机器。当我试图接收服务器将简单地回显的消息时,它不会接收信息,并且会超时。事实证明,如果您使用的UDPClient向外广播消息,它将无法接收回消息。除了我幸运地遇到的一个msdn论坛主题外,其他地方都没有记录 解决方案是发送消息,立即关闭套接字,在同一端口上打开一个新的UDPClient,然后使用这个新的UDPClient接收回显的UDP数据包。很烦人
试一试,看看是否有效。它确实适用于发送广播数据包 我认为在您的案例中,问题在于您使用了
Connect
或ConnectAsync
,将远程端点设置为广播地址。不连接,但向远程端点提供Send
或sendsync
调用,您将能够使用相同的UdpClient进行接收。有一种更好的方法可以做到这一点,如下图所示
try {
// Create socket
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
// Bind
IPEndPoint myEP = new IPEndPoint(IPAddress.Any, 0);
s.Bind(myEP);
// prepare the packet to send
iWritableBuff wbuff = new iWritableBuff();
[ ... ]
// Send it
IPEndPoint sEP = new IPEndPoint(IPAddress.Parse(server_ip_address), 10240);
int res = s.SendTo(wbuff.GetBuff(), (int)wbuff.Written(), 0, sEP);
// Receive the response
byte[] receiveBytes = new Byte[1024];
EndPoint recEP = new IPEndPoint(IPAddress.Any, 0);
res = s.ReceiveFrom(receiveBytes, ref recEP);
Console.WriteLine("We've got some data from the server!!! " + res + " bytes.");
} catch (Exception e) {
Console.WriteLine("ERROR: " + e.ToString());
}