如何从struct addrinfo获取我自己的IP地址

时间:2011-12-07 04:27:29

标签: c linux sockets ip

我正在将套接字绑定到我的地址以侦听连接。为此,我使用getaddrinfo()系统调用来获取我的地址信息,这使我能够以独立的方式执行我想要的操作。问题是这个系统调用返回的结构的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 个答案:

答案 0 :(得分:4)

地址不是空白 - 全为零,即0::0。这是特殊的通配符地址,表示绑定到所有本地接口。

您不应该关心您的主机有哪些地址 - 此列表可能随时更改,包括您在检查后立即更改。

连接客户端后,可以在getsockname()返回的套接字上使用accept()来确定客户端连接到哪个本地地址。

答案 1 :(得分:2)

如果您只想收听本地连接,为什么不绑定localhost(即IPV4 127.0.0.1)或ip6-localhost(即IPV6 ::1)?

否则,将所有零保留在地址中,如@caf建议。