getpeername () возвращает неверные данные - PullRequest
0 голосов
/ 10 сентября 2010

Я пишу свою первую программу для сокетов в Linux и пытаюсь напечатать IP-адрес и порт узла, к которому я подключился. Я использую getpeername () вместе с inet_ntop () и ntohs (), чтобы получить данные из структуры sockaddr_in. Когда я смотрю на результаты, я получаю IP-адрес, который не идет ни на один из известных мне серверов (сбой проверки связи) и говорит, что я слушаю порт, который, по словам netstat, не используется.

Что я делаю не так? Я должен получить 130.215.28.181:39000, но вместо этого я получаю 209.94.72.137:18825 каждый раз, когда я запускаю программу. Просмотр netstat показывает, что я действительно слушаю порт 39000.

Вот фрагмент из моей клиентской программы:

connect(sockfd,&serv_addr,sizeof(serv_addr))

// print welcome message
char ipstr[INET6_ADDRSTRLEN];
bzero(ipstr, 50);
struct sockaddr_in *address;
socklen_t address_len = sizeof(*address);
getpeername(sockfd, (struct sockaddr *) address, &address_len);
inet_ntop(AF_INET, &address->sin_addr, ipstr, sizeof(ipstr));
printf("Connection established successfully with %s:%i!\n", ipstr, ntohs(address->sin_port));

1 Ответ

5 голосов
/ 10 сентября 2010

Вы не выделяете никакой памяти для своей sockaddr_in структуры, вы просто передаете указатель на какое-то случайное место в памяти.Вместо этого выделите структуру адреса в стеке:

struct sockaddr_in addr;
socklen_t addr_len = sizeof(addr);
int err = getpeername(sockfd, (struct sockaddr *) &addr, &addr_len);
if (err != 0) {
   // error
}

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

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