how do i find an available port before bind the socket with the endpoint?

Murhaf Sousli picture Murhaf Sousli · Mar 27, 2012 · Viewed 17k times · Source

I'm developing a server-client application that uses 3 ports [TCP SOCKET .Net 4.0]..
So the application gives the user the choice to set the port for the main socket only. but I want to let the server application to automatically find available port for the other 2 sockets so it sends the port value to the client using the main socket connection. then the client connect to the other socket using the received port value.

here's a little explanation:

  • the main socket listens on a configurable port. this socket accepts client to start send/receive commands. (file explorer/task manager/properties/shutdown/chat)
  • the second socket is for file transfer only to transfer files and it closes when its done.
  • the third socket is only for receive/send a screenshot.
  • [i know you might say that i should use the same socket for file transfer and screenshot but its a little complicated. i just use separate sockets for each one of them.]

    so how do i find an available port before bind the socket with the endpoint? something like this :

    int port = 10000;
    bool isAvailable = false;
    while(!isAvailable)
    {
        try
        { 
            // check if the port is available to use.
            isAvailable = true;
        }
        catch
        {
            port++;
        }
    } 
    

    Answer

    Hans picture Hans · Mar 27, 2012

    If the port number doesn't matter you could pass 0 for the port to the IPEndPoint. In this case the operating system (TCP/IP stack) assigns a free port number for you.

    Socket sock = new Socket(AddressFamily.InterNetwork,
                             SocketType.Stream, ProtocolType.Tcp);
    sock.Bind(new IPEndPoint(IPAddress.Parse("192.168.0.1"), 0)); // Pass 0 here.
    
    Console.Out.WriteLine("Assigned port: {0}",
                          ((IPEndPoint)sock.LocalEndPoint).Port);
    

    As @GrokSrc pointed out in the comments section you should of course dispose the socket when you're done with the socket by using the Dispose() method or the using statement.