【问题标题】:How to get my own IP address from a struct addrinfo如何从 struct addrinfo 获取我自己的 IP 地址
【发布时间】:2012-01-14 16:10:02
【问题描述】:

我将一个套接字绑定到我的地址以监听连接。为此,我使用getaddrinfo() syscall 获取我的地址信息,这使我能够以一种独立于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(假设这将在没有强制转换的情况下工作)为空白。我怎样才能确切知道我将使用哪个地址?

【问题讨论】:

    标签: c linux sockets ip


    【解决方案1】:

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

    您不应该关心您的房东拥有什么地址 - 此列表可能随时更改,包括在您检查后立即更改。

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

    【讨论】:

    • 您可能需要关心机器是否连接到多个网络,并且您不想监听来自所有网络的连接。在这种情况下,您必须绑定到您想要监听的特定 IP。
    • @RemyLebeau-TeamB:在这种情况下,您应该从用户那里获取 IP,并在 node 参数中将它们提供给 getaddrinfo()。
    【解决方案2】:

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

    否则,请像@caf 建议的那样在地址中保留所有零。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-08
      • 2023-04-11
      • 2013-04-01
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      • 2011-10-14
      • 1970-01-01
      相关资源
      最近更新 更多