Слушатель UDP C # не принимает пакеты, пока другая программа не отправит что-либо - PullRequest
1 голос
/ 18 июля 2011

Да, надеюсь, быстрый вопрос и ответ.Мое приложение должно прослушивать UDP-порт и любой IP-адрес с определенного сервера showcontrol.Который просто отправляет простой текст / строки 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 и использование сокетного соединения и то и другое дают мне точно такую ​​же проблему, которую я опишу ниже, и мой код слушателя:

Версия сокета:

    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 (что-то вроде Hercules с hw-group.com), он просто не будет работать,> до <Я посылаю одну команду с моим консольным приложением.Только тогда, после отправки текста / пакета / данных с помощью моего консольного приложения, мое приложение примет данные из приложения hercules. </p>

Кто-нибудь видит, что я делаю неправильно?Я прочитал несколько примеров кода, отсюда, codeproject и guru-что-то, и они все используют один и тот же тип программирования, который я использовал.

Также, извините за стену текста.

1 Ответ

0 голосов
/ 30 декабря 2013

Вероятно, заголовок пакетов отсутствует в сообщении, которое вы отправляете на устройства, дважды проверьте его и убедитесь, что ваше сообщение правильно декодируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...