Генерация уникального IP-порта с использованием bind (0)

Мне нужно сгенерировать номера портов для некоторых программ. Google сообщает, что связывание с нулевым портом порождает связывание неиспользуемого порта. Я хочу привязать нулевой порт, запомнить его номер, закрыть порт. Пытаетесь это сделать? но netstat не видит порт моей программы. Linux 2.6.27

int sfd;
struct sockaddr_in my_addr;

sfd = socket(PF_INET , SOCK_STREAM, 0);
if (sfd == -1)
{
printf("socket error\n");
return -1;
}

memset(&my_addr, 0, sizeof(struct sockaddr_in ));
my_addr.sin_family = AF_INET;
my_addr.sin_addr.s_addr = INADDR_ANY;
my_addr.sin_port = 0;

if (bind(sfd, (struct sockaddr_in *) &my_addr,
sizeof(struct sockaddr_in)) == -1)
printf("bind error\n");

if (listen(sfd, LISTEN_BACKLOG) == -1)
printf("listen error\n");

0

Решение

bind() ожидает sockaddr* не sockaddr_in*:

bind(sfd, (struct sockaddr *) &my_addr, sizeof(my_addr))

Кроме этого, я не вижу других ошибок. Привязка к порту 0 — это правильный способ привязки к произвольно доступному порту. Если bind() а также listen() не сообщайте об ошибке, тогда netstat должен видеть открытый порт. использование getsockname() выяснить какой порт bind() на самом деле выбрал, например:

int sfd = socket(PF_INET , SOCK_STREAM, 0);
if (sfd == -1)
{
printf("socket error: %d\n", errno);
return -1;
}

struct sockaddr_in my_addr;
memset(&my_addr, 0, sizeof(my_addr));
my_addr.sin_family = AF_INET;
my_addr.sin_addr.s_addr = INADDR_ANY;
my_addr.sin_port = 0;

if (bind(sfd, (struct sockaddr *) &my_addr, sizeof(my_addr)) == -1)
{
printf("bind error: %d\n", errno);
close(sfd);
return -1;
}

if (listen(sfd, LISTEN_BACKLOG) == -1)
{
printf("listen error: %d\n", errno);
close(sfd);
return -1;
}

memset(&my_addr, 0, sizeof(my_addr));
socklen_t my_addrlen = sizeof(my_addr);

if (getsockname(sfd, (struct sockaddr *) &my_addr, &my_addrlen ) == -1)
{
printf("getsockname error: %d\n", errno);
close(sfd);
return -1;
}

printf("listening on port: %hu\n", ntohs(my_addr.sin_port));
1

Другие решения


По вопросам рекламы [email protected]