防止getpeername()返回127.0.0.1

时间:2013-01-07 12:29:35

标签: c linux sockets tcp

我有一个用C语言编写的服务器(A)和客户端(B),在同一台Linux机器上运行。 服务器将端口绑定到INADDR_ANY,客户端将另一个端口绑定到INADDR_ANY。 当另一个在另一台 Linux机器上运行的客户端(C)连接到服务器时,我希望服务器获取客户端B的IP地址并将其发送到客户端C.

当我从服务器使用getpeername()时,它返回“127.0.0.1”,这是正确的,但我无法将此地址发送到客户端C-它将无法连接到客户端B那个地址。

有没有聪明的方法来获取客户端B的实际IP? 如果它更容易一些,我可以让每个客户端将它的IP发送到服务器。

谢谢!

2 个答案:

答案 0 :(得分:0)

使用getifaddrs()获取接口IP地址,手册页中有一个示例。请注意,您可以使用INADDR_ANY发送服务器绑定的任何接口的IP地址,以便侦听所有接口。来自人ip(7)

  

当在bind调用中指定INADDR_ANY时,套接字将是   绑定到所有本地接口。

如果您想要公共 IP地址,请参阅此问题:

Get public/external IP address?

答案 1 :(得分:0)

您实际想知道的是接口的IP地址,该地址将用于路由到客户端C.
使用Linux命令行,您可以执行此操作(假设C为10.0.0.1):

# ip route show match 10.0.0.1
default via 20.0.0.2 dev eth0
# ifconfig eth0
eth0        Link encap:Ethernet  HWaddr 00:00:00:00:00:00
            inet addr:20.0.0.3  Bcast:20.0.0.255  Mask:255.255.255.0

在这种情况下,您需要使用20.0.0.3

问题仍然是如何在C中获得所有这些。 一种方法是连接到C上的某个服务,并在生成的套接字上运行getsockname