使用udp将数据发送到多个客户端C#

时间:2018-08-09 02:35:11

标签: c# udp

我知道这个论坛上已经有很多查询。我进行了搜索,最后我被这个问题困扰,这就是为什么我要问这个问题。 我有许多可以通过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调用在数据报套接字上发送时,未提供地址),不允许发送或接收数据的请求”

我做错了什么?如果我完全错了,也欢迎您提出任何建议。

1 个答案:

答案 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地址。

看到它就这么简单。

最后但并非最不重要的是,这个论坛上的人。非常感谢,因为您的建议给了我不同的想法。