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

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

4 ответов


Это можно проверить с помощью 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);

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

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


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


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

lsof -i

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

netstat -a