Как получить свой собственный IP-адрес из структуры addrinfo - PullRequest
2 голосов
/ 07 декабря 2011

Я привязываю сокет к своему адресу для прослушивания соединений.Для этого я получаю информацию об адресе с помощью системного вызова getaddrinfo(), который дает мне независимый от ip способ делать то, что я хочу.Проблема в том, что структуры, возвращаемые этим системным вызовом, имеют пустое поле IP-адреса.Например:

struct addrinfo hints, *servinfo, *p;
int sock;

memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;

getaddrinfo(NULL, port, &hints, &servinfo)

for (p = servinfo; p != NULL; p = p->ai_next)
   if (p->ai_family == AF_INET6)
      break;

sock = socket(p->ai_family, p->sock_type, p->protocol);
bind(sock, p->ai_addr, p->ai_addrlen)

В коде выше.переменная *p должна иметь какую-то информацию об IPv6-адресе моей машины, поскольку привязка завершается успешно, но поле p->ai_addr->sin6_addr (предположим, это будет работать без приведения) пустоКак я могу точно знать, какой адрес я буду использовать?

Ответы [ 2 ]

4 голосов
/ 07 декабря 2011

Адрес не пустой - это все нули, что 0::0. Это специальный подстановочный адрес, который означает привязку к всем локальным интерфейсам.

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

После подключения клиента вы можете использовать getsockname() в сокете, возвращаемом accept(), чтобы определить, к какому из ваших локальных адресов подключился этот клиент.

2 голосов
/ 07 декабря 2011

Почему бы вам не выполнить привязку к localhost (т. Е. IPV4 127.0.0.1) или ip6-localhost (т. Е. IPV6 ::1), если вы хотите прослушивать только локальные соединения?

В противном случае,оставьте все нули в адресе, как предложено @caf.

...