从套接字描述符获取IP地址?

8
我已经开启了一个TCP套接字服务器(我省略了一些内容,这些内容来自这里)。
sockfd = socket(p->ai_family, p->ai_socktype,
            p->ai_protocol))

是否可以从sockfd获取服务器的IP地址?如果不行,我应该在哪里查找?

编辑:我想知道服务器的地址(这是在任何客户端连接之前)。


哪一端的IP地址?你自己,还是你连接的地方?还是两者都有?! - Joe
1
这个套接字没有连接,因此没有地址可获取。在accept之后,getsockname会有所帮助。 - ugoren
1
accept()本身(可选)返回连接的对等方地址(请参见man accept)。 - alk
成功调用 socket() 后返回的值既未连接到任何客户端,也未绑定到任何接口,因此无法从任何地方确定客户端 IP 地址或服务器端 IP 地址。 - alk
2
如果p不是NULL,则在for()循环后立即使用p->ai_addr, p->ai_addrlen获取IP地址。这是因为这是代码将套接字绑定的方式。 - Heath Hunnicutt
4个回答

13
如果你想知道你的套接字另一端是谁,可以在 Linux 中使用 getpeername。而 getsockname 则可以告诉你自己是谁。不过在使用 bind 时,你需要决定服务器最初所在的地址。
你也可以参考这个 Stack Overflow 的问题:bind socket to network interface,以及 W. Richard Stevens 所写的书籍《Unix Network Programming, vol 1》。

4

在客户端连接之前,您不能使用套接字获取服务器的地址,因为它是未知的。

原则上,主机可能有多个IP。用于与服务器建立连接的IP是属于到达连接的接口的那个IP。在连接到达之前,它是未知的。
即使您只有一个IP,连接也可能来自机器内部,在这种情况下,地址将为127.0.0.1

因此,监听套接字没有关于IP的信息。
您需要找出机器有哪些接口以及它们的IP地址。


这只是部分内容,即在使用INADDR_ANY调用bind()的特殊情况下。请参见Davide Berra给出的正确答案。 - alk
@alk,我认为如果他使用特定地址调用了bind()函数,他就不会问这个地址是什么了。 - ugoren

1
服务器的地址由您决定。 取决于传递给bind()函数的参数。 您可以指定一个单一的IP或将套接字绑定到主机的每个地址。 请查看Bind man page

0
服务器的地址是成功调用bind()时传递的那个地址(如您所链接的源代码中所示)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接