Подтвердить что ты не робот

Проверьте, прослушивает ли сокет в C

Во время итерации через дескрипторы файлов сокетов, как я могу проверить, является ли один из них пассивным сокетом (прослушивание соединений)?

4b9b3361

Ответ 1

Это можно проверить с помощью getsockopt (SO_ACCEPTCONN). Например:

#include <sys/socket.h>

int val;
socklen_t len = sizeof(val);
if (getsockopt(fd, SOL_SOCKET, SO_ACCEPTCONN, &val, &len) == -1)
    printf("fd %d is not a socket\n", fd);
else if (val)
    printf("fd %d is a listening socket\n", fd);
else
    printf("fd %d is a non-listening socket\n", fd);

Ответ 2

Строго говоря, вы можете попробовать выполнить операцию в сокете, которая случайно определит тип сокета, например, попытаться принять соединение с ним. Если accept() не работает с EINVAL, это довольно хороший признак того, что он не прослушивает.:)

Отслеживание того, какие сокеты являются лучшим решением в целом. Если вы не создаете действительно тривиальное приложение, скорее всего, вам нужно будет хранить какие-то дополнительные данные на каждом сокете.

Ответ 3

Вы не можете сказать. Вы должны сами отслеживать это, и когда вы хотите проверить, является ли сокет прослушивающим сокетом, который вы сравниваете с тем, который вы сохранили.

Ответ 4

Вы можете запустить в командной строке (в среде Mac/Linux):

lsof -i

и/или (среда Linux/Mac/Windows)

netstat -a