首页 文章

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

提问于
浏览
1

对,希望快速提问和回答 . 我的应用程序应该监听UDP端口和某个showcontrol服务器的任何IP地址 . 它只发送纯ASCII文本/字符串 .

由于我们办公室没有这样的S.C.服务器,我还写了一个非常小的简单控制台应用程序,只是广播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并使用套接字连接,两者都给了我完全相同的问题,我将在下面的两个监听器代码中描述:

套接字版本:

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发送器(类似于来自hw-group.com的Hercules)时,它根本无法工作,>直到<我用我的控制台应用程序发送一个命令 . 只有这样,在我的控制台应用程序发送文本/数据包/数据后,我的applcation才会接受来自hercules应用程序的数据 .

有没有人看到我做错了什么?我已经阅读了多个代码示例,从这里,codeproject和guru-something,它们都使用了我使用的相同类型的编程 .

此外,抱歉文本墙 .

1 回答

  • 0

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

相关问题