UDP侦听器c#

时间:2018-08-14 08:09:10

标签: asp.net udp

今天早上我问了一个问题,这是链接-thread interrupt in udp

但是在这个问题上花了更多时间后-我得出的结论是,我需要做的是-

我需要创建一个udp服务器,其工作是侦听和接收来自端口1200的数据。 并且我需要创建另一个udp套接字以使用任何其他端口发送数据。

我希望此udp侦听器连续作为后台进程进行侦听。 所以我尝试这样做,但是却遇到了这个错误-而且该声明还说,使用sendto方法发送数据时甚至没有在这里发送任何数据。

  

“由于未连接套接字,并且(未使用sendto调用在数据报套接字上发送时,未提供地址),因此不允许发送或接收数据的请求”

  StackTrace  "   at System.Net.Sockets.Socket.get_RemoteEndPoint()"  string
  SocketErrorCode NotConnected    System.Net.Sockets.SocketError

我使用此代码在任何远程客户端的端口1200上接收-

  public void button1_Click()
    {
        this.serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        this.serverSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
        this.serverSocket.Bind(new IPEndPoint(IPAddress.Any, this.port));
        EndPoint newClientEP = new IPEndPoint(IPAddress.Any, 0);
        this.serverSocket.BeginReceiveFrom(this.byteData, 0, this.byteData.Length, SocketFlags.None, ref newClientEP, DoReceiveFrom, serverSocket);

    }

    private void DoReceiveFrom(IAsyncResult iar)
    {


        try
        {
            EndPoint clientEP = new IPEndPoint(IPAddress.Any, 0);

            int dataLen = 0;
            byte[] data = null;
            try
            {
                dataLen = this.serverSocket.EndReceiveFrom(iar, ref clientEP);
                data = new byte[dataLen];
                Array.Copy(this.byteData, data, dataLen);
                string ips = ((IPEndPoint)clientEP).Address.ToString();
                server sss = new server();
                sss.updateData(data, ips);
            }
            catch (Exception e)
            {
            }
            finally
            {
                EndPoint newClientEP = new IPEndPoint(IPAddress.Any, 0);
                this.serverSocket.BeginReceiveFrom(this.byteData, 0, this.byteData.Length, SocketFlags.None, ref newClientEP, DoReceiveFrom, serverSocket);
            }

            if (!this.clientList.Any(client => client.Equals(clientEP)))
                this.clientList.Add(clientEP);



            string s = Encoding.ASCII.GetString(data);


        }
        catch (Exception ex)
        {
            string m = ex.Message;
        }
    }

    public void Stop()
    {
        this.serverSocket.Close();
        this.serverSocket = null;
        this.clientList.Clear();
    }

我现在应该做什么?我的问题是这个- 我只想获取任何东西,只要1200接收到数据,然后从中找到远程IP,然后执行一些任务即可。我有执行类似操作的示例,但是它们在TCP上,TCP连接到每个设备,而UDP没有。

那么我该如何处理udp ??

代码已更新-

  static void OnUdpData(IAsyncResult result)
    {
        // this is what had been passed into BeginReceive as the second parameter:
        UdpClient socket = result.AsyncState as UdpClient;
        // points towards whoever had sent the message:
        IPEndPoint source = new IPEndPoint(0, 0);
        // get the actual message and fill out the source:
        byte[] message = socket.EndReceive(result, ref source);
        string ip = source.Address.ToString();
        server cs = new server();
        cs.updateData(message, ip);

        socket.BeginReceive(new AsyncCallback(OnUdpData), socket);
    }
    public static void ReceiveData()
    {
        UdpClient socket = new UdpClient(1200); 
        socket.BeginReceive(new AsyncCallback(OnUdpData), socket);


    }

这可用于控制台应用程序,但不能以网络形式使用。作为套接字的抛出错误可以使用1次。

所以我又改变了几行-

public static void ReceiveData()
    {
        IPEndPoint iPEnd = new IPEndPoint(IPAddress.Any, 1200);
        UdpClient socket = new UdpClient(iPEnd);
        EndPoint ep = iPEnd;
        socket.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
        socket.Client.Bind(ep);
        socket.BeginReceive(new AsyncCallback(OnUdpData), socket);
    }

但这也给出了错误。那么为什么会这样呢? 如果代码可以在控制台应用程序中工作,那么为什么不能在Web窗体中使用?

0 个答案:

没有答案