Bind multiple listener to the same port

shujaat siddiqui picture shujaat siddiqui · Apr 2, 2014 · Viewed 8.1k times · Source

I am using UdpClient class in .net 3.5 I need to bind multiple applications to the same port .

So, if UDP servers broadcast any request - all the applications thats listen on the port can receive the message but the problem is, when I try bind to an application to the same port, only one application receive the message and the other does not.

Below is some sample code for the two application:

    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 : I am unable to figure out the reason or am I missing something. ?

Answer

John C picture John C · Apr 2, 2014

That's the nature of sockets. Even in cases (such as UDP) where multiple applications can access the same port, the data is handed out first-come, first-serve. UDP is also designed with minimum overhead, so there isn't even an opportunity to "check the queue," like you (hypothetically) could with TCP.

It's designed around having multiple processes share a server load, alternating who receives the request based on who's idle.

You'd need to build something external to get around this, like a retransmission protocol or a database to make sure every inbound message is shared.

If you can deal with the changes, a smarter way to handle this would be UDP Multicast, where multiple programs essentially enroll to receive group messages. In that case, the single-port restriction can (and should) be abandoned.