Почему мой ip_address [] перезаписывается? - PullRequest
1 голос
/ 26 июня 2011

Я пытаюсь написать код сервера / клиента, и все работает правильно, за исключением случаев, когда я пытаюсь сохранить IP-адреса входящих и исходящих соединений.

getpeername(new_fd[client],(struct sockaddr*) &client_addr[client],&addr_size);
ip_address[client] = inet_ntoa(client_addr[client].sin_addr);

В этом случае, когдасоединение установлено, содержимое каждого индекса будет изменено на самое последнее выполненное соединение.Таким образом, каждая ячейка ip_address [] будет содержать IP-адрес последнего соединения.В чем может быть проблема?

Ответы [ 2 ]

4 голосов
/ 26 июня 2011

inet_ntoa обычно выглядит примерно так:

char *
inet_ntoa(struct in_addr ina)
{
    static char buf[some_size];
    /* a series of sprintfs */
    return bufl
}

Что означает, что при каждом вызове содержимое buf будет перезаписываться.Очевидно, что вы не можете использовать возвращаемое значение inet_ntoa напрямую;вам придется использовать memcpy или что-то в этом роде.

Реальное решение

Вместо этого использовать inet_ntop.Он более новый, поддерживает IPv6 из коробки и должен быть поточно-ориентированным (о да, inet_ntoa нет).

2 голосов
/ 26 июня 2011

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

...