Во время итерации через дескрипторы файлов сокетов, как я могу проверить, является ли один из них пассивным сокетом (прослушивание соединений)?
Проверьте, прослушивает ли сокет в C
Ответ 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