2013-01-07 97 views
0

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

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

有什么聪明的方法来获得客户端B的实际IP? 如果稍微容易些,我可以让每个客户端发送它的IP给服务器。

谢谢!

回答

0

使用getifaddrs()来获取接口IP地址,手册页中有一个例子。请注意,您可以发送任何接口的IP地址,因为服务器使用INADDR_ANY进行绑定,因此它会侦听所有接口。从人ip(7)

当INADDR_ANY在绑定调用指定的插座将 绑定到所有本地接口。

如果你想那么公共 IP地址是指这样一个问题:

Get public/external IP address?

+0

mux- getifaddrs()的问题是一台计算机可能有多个IP地址,所以我只是不能捕捉到第一个不是127.0.0.1的IP。 – bomba6

+0

@ bomba6我认为任何人都会这样做,因为服务器绑定到INADDR_ANY,它会监听所有接口,以便接收数据包。 – iabdalkader

+0

感谢您的澄清。但客户端C位于另一个网络上的另一台计算机上。我没有冒险返回“内部”IP地址? – bomba6

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