Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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++;
        }
    } 
    
  • like image 445
    Murhaf Sousli Avatar asked Mar 27 '12 18:03

    Murhaf Sousli


    People also ask

    How do I find available ports?

    Run the Command Prompt as administrator. Type the command: netstat -ab and hit Enter. Wait for the results to load. Port names will be listed next to the local IP address.

    How do I find the socket port?

    If it's a server socket, you should call listen() on your socket, and then getsockname() to find the port number on which it is listening: struct sockaddr_in sin; socklen_t len = sizeof(sin); if (getsockname(sock, (struct sockaddr *)&sin, &len) == -1) perror("getsockname"); else printf("port number %d\n", ntohs(sin.

    How do I find the client port number for server socket programming?

    This can be done using a bind() system call specifying a particular port number in a client-side socket. Below is the implementation Server and Client program where a client will be forcefully get assigned a port number.

    Why do we bind socket to port?

    By binding the socket to a specific port number, you avoid having an ephemeral port number assigned to the socket. Servers find it inconvenient to have an ephemeral port number assigned, because clients have to connect to a different port number for every instance of the server.


    1 Answers

    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.

    like image 114
    Hans Avatar answered Oct 29 '22 02:10

    Hans