我正在发送一个UDP组播消息来查找网络上的某些设备。然后我在5001端口上监听响应。
我的工作流程如下:
1. 发送一个多播“查找”消息到本地子网。 2. 网络上的任何wiznet设备都会响应一个信息包,我希望能够接收到它们。
在Windows XP上一切正常,但在Windows 7上,我会得到一个SocketException异常:
“通常只允许使用每个套接字地址(协议/网络地址/端口)一次。”
我的工作流程如下:
1. 发送一个多播“查找”消息到本地子网。 2. 网络上的任何wiznet设备都会响应一个信息包,我希望能够接收到它们。
在Windows XP上一切正常,但在Windows 7上,我会得到一个SocketException异常:
“通常只允许使用每个套接字地址(协议/网络地址/端口)一次。”
我可以在Wireshark中看到组播消息的发送,也能看到设备的响应,但我的代码没有响应。我的代码如下:
public void StartListen()
{
SendFind();
try {
IPEndPoint localEp = new IPEndPoint(IPAddress.Any, 0);
UdpClient listenClient = new UdpClient(5001);
UdpState s = new UdpState();
s.endpoint = localEp;
s.client = listenClient;
//allow time for the find to work - aka clutching at straws
Thread.Sleep(500);
while (listenClient.Available > 0)
{
listenClient.BeginReceive(ReceiveCallback, s);
Thread.Sleep(500);
}
}
catch (SocketException e)
{
Trace.WriteLine("Could not bind to socket on " + _localPort);
}
listenClient.Close();
}
..和RecieveCallBack..
private void ReceiveCallback(IAsyncResult ar)
{
UdpClient u = (UdpClient)((UdpState)(ar.AsyncState)).client;
IPEndPoint e = (IPEndPoint)((UdpState)(ar.AsyncState)).endpoint;
Byte[] receiveBytes = u.EndReceive(ar, ref e);
rxByteList.Add(receiveBytes);
messageRxed = true;
}
**更新**
我尝试了多种代码结构方式,似乎问题与在不同的UdpClients上发送和接收有关。我的异常是由于在打开一个用于发送的UdpClient后立即创建一个用于接收的UdpClient - 在发送和接收之间添加延迟可以解决此问题。
我已更改代码,使用相同的UdpClient进行发送和接收,但仍未在接收端收到任何内容。
UdpClient
构造函数的调用,或者是由于对BeginReceive
的调用。你能告诉我们是哪个吗? - Jim Mischel