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

1

19

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++;
        }
    } 
    
  • Clava answered 27/3, 2012 at 18:9 Comment(2)
    It should be !isAvailable, otherwise it won't even enter the while-loopSerpigo
    Possible duplicate of #570598Anthemion
    S
    37

    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.

    Segregate answered 27/3, 2012 at 18:30 Comment(1)
    Thanks for the code, I used it. Btw, don't forget to dispose the socket if you're actually going to use the port!Uncrown

    © 2022 - 2024 — McMap. All rights reserved.