El sistema operativo es Linux. Tengo un proceso de servidor que puede cambiar su puerto en tiempo real. Sin embargo, me gustaría saber con anticipación si un puerto es libre antes de la vinculación.¿cómo encuentro en C que un puerto es libre de usar?
Escenario: El servidor enlaza localhost: 5000 y recibe una solicitud para enlazar en localhost: 6000. El servidor debe verificar si el puerto es libre. Esta pregunta busca respuestas que proporcionen una rutina que verifique si un puerto es libre o no.
Para el registro, estoy editando mi pregunta con un fragmento de código que comprueba si un puerto es libre de usar. Esto no significa que será usado. El siguiente código responde a la pregunta "si el puerto está disponible ahora", no lo usa. Abre un socket, verifique si bind devuelve EADDRINUSE y cierra el socket.
#include <iostream>
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <errno.h>
int main(int argc, char **argv) {
struct sockaddr_in serv_addr;
if(argc < 2)
return 0;
int port = atoi(argv[1]);
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0) {
printf("socket error\n");
return 0;
} else {
printf("Opened fd %d\n", sockfd);
}
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 = htons(port);
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
if(errno == EADDRINUSE)
{
printf("the port is not available. already to other process\n");
} else {
printf("could not bind to process (%d) %s\n", errno, strerror(errno));
}
}
if (close (sockfd) < 0) {
printf("did not close fd: %s\n", strerror(errno));
return errno;
}
return 0;
}
Estas son algunas tandas de muestras (resultados parciales)
[bash{1051}{51}]:[~/some_sources/checkbind]::./a.out 41067
the port is not available. already to other process
[bash{1052}{52}]:[~/some_sources/checkbind]::./a.out 22
could not bind to process (13) Permission denied
[bash{1053}{53}]:[~/some_sources/checkbind]::./a.out 22000
Opened fd 3
Pruebe unirse a él, si no funciona, no es gratis ... – Nick
Nicks sugerencia es probablemente la solución más portátil, pero puede haber formas específicas del OS que hacer también. ¿Qué sistema operativo usarás? –
@Nick ve que bind devuelve EADDRINUSE (errno) si el puerto no es libre. – cateof