Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Releasing bound ports on process exit

How do I make sure that a socket bound to a port is properly released on process exit such that the port can be reused without bind() failing with EADDRINUSE? I've written a tiny program which just creates a socket, binds it to a fixed port, waits for a connection and then immediately terminates. When I rerun the program, the bind() call fails with EADDRINUSE, but if I wait a few minutes, it succeeds.

Is there a way I can explicitly "unbind" the socket, thereby freeing the port number?

like image 616
JesperE Avatar asked Feb 14 '09 10:02

JesperE


People also ask

What is a bound port?

A port binding is the configuration information that determines where and how a message will be sent or received. Depending on its type, a port binding might refer to physical locations, pipelines, or other orchestrations.


2 Answers

Using SO_REUSEADDR socket option will allow you to re-start the program without delay.

int iSetOption = 1;
...
sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
setsockopt(_sockfd, SOL_SOCKET, SO_REUSEADDR, (char*)&iSetOption,
        sizeof(iSetOption))
...         
like image 199
Ivo Bosticky Avatar answered Sep 18 '22 19:09

Ivo Bosticky


TCP/IP stack keeps port busy for sometime even after close() - socket will stay in TIME_WAIT and TIME_WAIT2 state.

If I'm not mistaken, usually it takes 2 minutes so if you need to use the same port immediately set SO_REUSEADDR option on your socket before binding, just like Ivo Bosticky suggested.

like image 39
qrdl Avatar answered Sep 20 '22 19:09

qrdl