通过套接字发送UDP广播不断引发异常

时间:2018-08-23 13:17:58

标签: c# sockets udp

我要做的就是用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));
}

0 个答案:

没有答案