2017-08-29 234 views
-1

服务器有多个接口。服务器绑定到0.0.0.0这意味着它正在监听它所有的接口。因此,客户端可以使用这些服务器IP中的任何一个进行连接。 因此,在服务器端如何获取客户端连接的IP。在服务器端,获取客户端连接的服务器IP

+0

@UlugToprak,我想服务器的IP和客户端的不是IP。 – user2137306

+0

措辞不清楚,我删除了重复的标志。 –

回答

1

在由accept()返回的套接字上使用getsockname(),它将被绑定到您的服务器用于与接受客户端进行通信的本地地址。

NAME 
    getsockname — get socket name 
LIBRARY 
    Standard C Library (libc, -lc) 
SYNOPSIS 
    #include <sys/types.h> 
    #include <sys/socket.h> 

    int 
    getsockname(int s, struct sockaddr * restrict name, 
    socklen_t * restrict namelen); 

DESCRIPTION 
    The getsockname() system call returns the current name for the specified 
    socket. The namelen argument should be initialized to indicate the 
    amount of space pointed to by name. On return it contains the actual 
    size of the name returned (in bytes). 
+0

它将* *返回的地址*客户端*是使用带有*此服务器进行通信* – EJP

+0

@EJP:不,你完全错了,**在服务器端** getsockname返回服务器地址,我写。它是返回客户端地址的getpeername。我不明白你为我的答案(getsockname)投票-1,然后给出相同的答案(getsockname)!不公平,你与SO合作的方式不公平。 –

+0

在服务器上,'getsockname()返回客户端用来连接服务器的地址,服务器可以是任何服务器的IP地址,这就是问题所在:哪一个。这里没有矛盾。服务器用来与客户端通信的客户端自己的地址由服务器上的getpeername()返回。 – EJP

0

此信息可通过getsockname()致电。在服务器端调用时,它提供服务器accept编辑客户端的本地服务器地址。

请注意,这受限于一个叫做'弱端系统模型'的深奥的东西,这实质上意味着连接被接收到的本地接口不一定对应于客户端使用的IP地址(想一想当代理/路由器位于客户端和服务器之间时发生)。在这种情况下,您将无法使客户端实际使用connect的IP(除非客户端使用数据包将其发送到服务器),而只能使用接受客户端的服务器上的IP。

+0

@downvoter不要欺骗自己。看看它。所有的。这里没有错误。 – EJP