我要做的就是用ASCII编码的命令发出广播消息,然后等待答案。
我找到了许多有关如何执行此操作的教程,几乎可以理解所有内容。我研究了有关套接字及其SendTo
方法的MSDN文章,但是无论我做什么或尝试使用它,都会在我的SendTo
调用中引发此异常:
System.Net.Sockets.SocketException :“所引用的对象类型不支持尝试的操作”
提供的错误代码为10045。在底层API中并不那么详细。
我认为应该正确。我在任何可用端口上绑定到我的以太网适配器(连接到我要与之联系的设备所在的Intranet的那个适配器),并广播到我要寻找的端口。
到目前为止,这是我的代码:
byte[] encoded = Encoding.ASCII.GetBytes(cast);
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
ProtocolType.Udp);
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontRoute, 1);
socket.Bind(new IPEndPoint(IPAddress.Parse("192.168.10.87"), 0));
IPEndPoint broadcastPartner = new IPEndPoint(IPAddress.Broadcast, 32001);
int sent = socket.SendTo(encoded, SocketFlags.Broadcast, broadcastPartner);
Console.WriteLine($"Sent {sent} bytes.");
SpinWait wait = new SpinWait();
while (true)
{
byte[] buffer = new byte[2048];
int read = 0;
try
{
read = socket.Receive(buffer, SocketFlags.Broadcast);
}
catch (Exception)
{
wait.SpinOnce();
continue;
}
if (read == 0) continue;
Console.WriteLine("Received message: " + Encoding.ASCII.GetString(buffer));
}