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:
[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++;
}
}
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.
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.
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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With