Проверьте, прослушивает ли сокет 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