Как определить IP, используемый клиентом, подключающимся к сокету слушателя INADDR_ANY в C - PullRequest
3 голосов
/ 15 июня 2010

У меня есть приложение сетевого сервера, написанное на C, слушатель связан с использованием INADDR_ANY, поэтому он может принимать соединения через любой из IP-адресов хоста, на котором он установлен.

Мне нужно определить, какой из IP-адресов сервера использовал клиент при установлении соединения - на самом деле мне просто нужно знать, подключены ли они через петлевой адрес 127.0.0.1 или нет.

ЧастичноПример кода следующим образом (я могу опубликовать все, если это поможет):

static struct sockaddr_in serverAddress;
serverAddress.sin_family = AF_INET;
serverAddress.sin_addr.s_addr = INADDR_ANY;
serverAddress.sin_port = htons(port);

bind(listener, (struct sockaddr *) &serverAddress, sizeof(serverAddress));

listen(listener, CONNECTION_BACKLOG);

SOCKET socketfd;
static struct sockaddr_in clientAddress;
...
socketfd = accept(listener, (struct sockaddr *) &clientAddress, &length);

Решение моей конкретной проблемы (благодаря zildjohn01) на случай, если кому-то понадобится, показано ниже:

int isLocalConnection(int socket){
    struct sockaddr_in sa;
    int sa_len = sizeof(sa);
    if (getsockname(socket, &sa, &sa_len) == -1) {
        return 0;
    }
    // Local access means any IP in the 127.x.x.x range
    return (sa.sin_addr.s_addr & 0xff) == 127;
}

Ответы [ 2 ]

8 голосов
/ 15 июня 2010

Вы можете использовать функцию getsockname .

Функция getsockname () извлекает локально связанное имя указанного сокета

0 голосов
/ 15 июня 2010

Из вашего кода

socketfd = accept(listener, (struct sockaddr *) &clientAddress, &length);

Анализ возвращенного clientAddressЭто то, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...