The OS is Linux. I have a server process that can change its port realtime. However I would like to know in advance if a port is free before binding.
Scenario: Server bi
I struggled with this myself and have slightly modified your code.
The solution is to set serv_addr.sin_port = 0
(auto assign port).
Note In the bind()
and the getsockname()
lines there are unclean casts from sockaddr_in
to sockaddr
. I have seen it done many places and I'm looking for a safer solution.
#include
#include
#include
// ... snip ...
int sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock < 0) {
printf("socket error\n");
return;
}
printf("Opened %d\n", sock);
struct sockaddr_in serv_addr;
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = 0;
if (bind(sock, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
if(errno == EADDRINUSE) {
printf("the port is not available. already to other process\n");
return;
} else {
printf("could not bind to process (%d) %s\n", errno, strerror(errno));
return;
}
}
socklen_t len = sizeof(serv_addr);
if (getsockname(sock, (struct sockaddr *)&serv_addr, &len) == -1) {
perror("getsockname");
return;
}
printf("port number %d\n", ntohs(serv_addr.sin_port));
if (close (sock) < 0 ) {
printf("did not close: %s\n", strerror(errno));
return;
}
Opened 4
port number 59081