Привязать несколько слушателей к одному и тому же порту

Я использую класс UdpClient в классе .net 3.5. Мне нужно связать несколько приложений с одним и тем же портом.

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

Ниже приведен пример кода для двух приложений:

    UdpClient udpClient = new UdpClient();
    Thread thread;
    IPEndPoint endPoint = new IPEndPoint(IPAddress.Loopback, 11000);
    public Form1()
    {
        //CheckForIllegalCrossThreadCalls = false;

        InitializeComponent();
        udpClient.ExclusiveAddressUse = false;
        udpClient.Client.SetSocketOption(
        SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
        udpClient.Client.Bind(endPoint);
    }

    private void MainForm_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Escape)
        {
            thread.Abort();
            udpClient.Close();
            Close();
        }
    }

    private void ReceiveMessage()
    {
        //while (true)
        //{
        // IPEndPoint remoteIPEndPoint = new IPEndPoint(IPAddress.Any, 11000);
        //  byte[] content = udpClient.Receive(ref endPoint);
        udpClient.BeginReceive(new AsyncCallback(Read_Callback), null);

        //if (content.Length > 0)
        //{
        //    string message = Encoding.ASCII.GetString(content);

        //    this.Invoke(myDelegate, new object[] { message });
        //}
        // }
    }

    public void Read_Callback(IAsyncResult ar)
    {
        try
        {
            byte[] buffer = udpClient.EndReceive(ar, ref endPoint);
            // Process buffer
            string s = Encoding.ASCII.GetString(buffer);
            // richTextBox1.Text = s;
            udpClient.BeginReceive(new AsyncCallback(Read_Callback), null);

        }
        catch (Exception ex)
        { }
    }

PS: Я не могу понять причину или я что-то упускаю. ?


person shujaat siddiqui    schedule 02.04.2014    source источник


Ответы (1)


Такова природа сокетов. Даже в случаях (например, UDP), когда несколько приложений могут получить доступ к одному и тому же порту, данные передаются в порядке поступления. UDP также разработан с минимальными накладными расходами, поэтому нет даже возможности «проверить очередь», как вы (гипотетически) могли бы с TCP.

Он разработан для того, чтобы несколько процессов разделяли нагрузку на сервер, чередуя тех, кто получает запрос, в зависимости от того, кто бездействует.

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

Если вы можете справиться с изменениями, более разумным способом справиться с этим будет многоадресная рассылка UDP, где несколько программ по существу регистрируются для получения групповых сообщений. В этом случае от ограничения на один порт можно (и нужно) отказаться.

person John C    schedule 02.04.2014