我知道这个论坛上已经有很多查询。我进行了搜索,最后我被这个问题困扰,这就是为什么我要问这个问题。 我有许多可以通过UDP进行通信的设备。 我想查询他们的状态更新。这是我的代码。
List<IPAddress> iPAdd = new List<IPAddress>();
foreach (string s in ipaddress)
{
IPAddress ips = IPAddress.Parse(s);
iPAdd.Add(ips);
}
//The main socket on which the server listens to the clients
byte[] byteData = new byte[1024];
Byte[] dataToSend = new Byte[] { 0x8B, 0xB9, 0x00, 0x03, 0x05, 0x01, 0x09 };
try
{
serverSocket = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
//Assign the any IP of the machine and listen on port number 1200
IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, 0);
//Bind this address to the server
serverSocket.Bind(ipEndPoint);
foreach(IPAddress ip in iPAdd)
{
IPEndPoint ipe = new IPEndPoint(ip, 1024);
EndPoint e = (EndPoint)ipe;
eps.Add(e);
}
//Start sending data
foreach(EndPoint ep in eps)
{
serverSocket.BeginSendTo(dataToSend, 0, dataToSend.Length, SocketFlags.None, ep,
new AsyncCallback(OnSend), ep);
Thread.Sleep(50);
Receive(ep);
}
}
catch (Exception ex)
{
string mess = ex.Message;
}
接收方法-
private void Receive(EndPoint ep)
{
Byte[] receiveBytes = new Byte[1024];
IPEndPoint localip = new IPEndPoint(IPAddress.Any, 1200);
UdpClient receivingUdpClient = new UdpClient(localip);
receivingUdpClient.Client.Receive(receiveBytes);
receivingUdpClient.Dispose();
}
receiveUdpClient收到的错误是-
“由于未连接套接字,并且(在使用sendto调用在数据报套接字上发送时,未提供地址),不允许发送或接收数据的请求”
我做错了什么?如果我完全错了,也欢迎您提出任何建议。
答案 0 :(得分:0)
我有办法去做自己想做的事。 这是我正在尝试做的代码和解释。希望它能帮助别人。 我的任务-需要在多个同类设备之间建立udp连接,这些设备在1024接收查询并在1200回复。 最后,我意识到它很简单,因为它适用于单个客户端。现在,我在想我对这些可用的众多选择感到困惑,真是愚蠢。 这是代码-
public byte[] serverSocket(String IPadd)
{
Socket serverSocket = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
Socket receiveClient = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
byte[] receivebytes = new byte[100] ;
try
{
byte[] dataToSend = new byte[] { 0x8B, 0xB9, 0x00, 0x03, 0x05, 0x01, 0x09 };
IPAddress iPAddress = IPAddress.Parse(IPadd);
int port = 1024;
IPEndPoint iPEnd = new IPEndPoint(iPAddress, port);
//Assign the any IP of the machine and listen on port number 1200
IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, 1200);
serverSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
serverSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, 2000);
serverSocket.Bind(ipEndPoint);
EndPoint ep = (EndPoint)iPEnd;
serverSocket.SendTo(dataToSend, ep);
Thread.Sleep(1000);
serverSocket.Receive(receivebytes);
}
catch(Exception ex)
{
}
finally
{
serverSocket.Dispose();
}
return receivebytes;
}
字符串IPadd是来自数据库的ipaddress列表中的字符串。因此,在这里,我要做的是-调用udp Connection并在接收数据后对其进行处理,以便可以将同一套接字对象用于其他IP地址。
看到它就这么简单。
最后但并非最不重要的是,这个论坛上的人。非常感谢,因为您的建议给了我不同的想法。