c# UDP监听器不接受数据包,直到另一个程序发送一些东西

本文关键字:程序 另一个 监听器 UDP 不接受 数据包 | 更新日期: 2023-09-27 18:02:52

好的,希望有一个快速的问题&的答案。我的应用程序应该侦听UDP端口和来自某个showcontrol服务器的任何IP地址。它只发送纯ASCII文本/字符串。

由于我们办公室没有这样的sc服务器,我还编写了一个非常小的简单控制台应用程序,它只广播UDP数据包。

这是控制台应用:

    static void Main(string[] args)
    {
        Thread.Sleep(1000);
        Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        IPEndPoint e = new IPEndPoint(IPAddress.Broadcast, 35000);
        IPAddress broadcast = IPAddress.Parse("192.168.1.255");
        e = new IPEndPoint(broadcast, 35000);
        string s;
        Byte[] sendBytes;
        while ("exit" != (s = Console.ReadLine()))
        {
            sendBytes = Encoding.ASCII.GetBytes((s.EndsWith("'n") ? s : s + "'n"));
            soc.SendTo(sendBytes, e);
        }
        sendBytes = Encoding.ASCII.GetBytes("EXIT'n");
        soc.SendTo(sendBytes, e);
        soc.Close();
    }

我尝试了两种方法。使用UdpClient和使用套接字连接,两者都给了我完全相同的问题,我将在下面描述我的两个侦听器代码:

Socket版本:

    public MediaPlayer(Output outputWindow)
    {
        Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, i_inPort);
        serverSocket.Bind(ipEndPoint);
        IPEndPoint ipeSender = new IPEndPoint(IPAddress.Any, 0);
        EndPoint epSender = (EndPoint)ipeSender;
        SocketState state = new SocketState();
        state.e = epSender;
        state.s = serverSocket;
        beginReceiveFrom(state);
    }
    public void beginReceiveFrom(SocketState state)
    {
        state.byteData = new byte[state.byteData.Length];
        IPEndPoint ipeSender = new IPEndPoint(IPAddress.Any, 0);
        state.e = (EndPoint)ipeSender;
        state.s.BeginReceiveFrom(state.byteData, 0, state.byteData.Length, SocketFlags.None, ref state.e, onReceiveFrom, state);
    }
    public void onReceiveFrom(IAsyncResult ar)
    {
        SocketState state = (SocketState)ar.AsyncState;
        Socket serverSocket = state.s;
        //EndPoint epSender = state.e;
        IPEndPoint ipeSender = new IPEndPoint(IPAddress.Any, 0);
        EndPoint epSender = (EndPoint)ipeSender;
        try
        {
            serverSocket.EndReceiveFrom(ar, ref epSender);
            string s = Encoding.ASCII.GetString(state.byteData);
        }
        catch (System.Exception ex)
        {
            Console.WriteLine(ex);
        }
        finally
        {
            beginReceiveFrom(state);
        }
    }

UdpClient版本:

    public MediaPlayer(Output outputWindow)
    {
        UdpClient client = new UdpClient(i_inPort);
        IPEndPoint endPoint = null;
        UdpState state = new UdpState();
        state.e = endPoint;
        state.u = client;
    }
    private void BeginReceive(UdpState state)
    {
        state.u.BeginReceive(new AsyncCallback(ReceiveCallback), state);
    }
    private void ReceiveCallback(IAsyncResult ar)
    {
        UdpState state = null;
        try
        {
            state = (UdpState)ar.AsyncState;
            Byte[] receiveBytes = state.u.EndReceive(ar, ref state.e);
            string receiveString = Encoding.ASCII.GetString(receiveBytes);
            executive.Receive(receiveString);
            BeginReceive(state);
        }
        catch(System.Exception ex)
        {
            SetText(ex.ToString());
        }       
    }

在UpdClient ReceiveCallback版本中有一些额外的代码,因为那是我最初使用的。问题是,当我用控制台应用发送/广播内容时,无论如何,在我公司的网络和任何计算机上,它都可以正常工作,没有问题。多个媒体播放器可以在任意数量的电脑上播放,没有问题。

然而,当我使用不同的UDP发送者(像赫拉克勒斯从hhwgroup.com),然后它根本不会工作,>直到

有没有人看到我做错了什么?我读了很多代码示例,从这里,codeproject和guru之类的,他们都使用了我使用的相同类型的编程。

还有,很抱歉这一墙的文字

c# UDP监听器不接受数据包,直到另一个程序发送一些东西

可能是数据包的头,它不存在于您发送到设备的消息中,请仔细检查并确保您的消息被正确解码。

相关文章: