2017-08-29 232 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