服務器有多個接口。服務器綁定到0.0.0.0這意味着它正在監聽它所有的接口。因此,客戶端可以使用這些服務器IP中的任何一個進行連接。 因此,在服務器端如何獲取客戶端連接的IP。在服務器端,獲取客戶端連接的服務器IP
回答
在由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).
它將* *返回的地址*客戶端*是使用帶有*此服務器進行通信* – EJP
@EJP:不,你完全錯了,**在服務器端** getsockname返回服務器地址,我寫。它是返回客戶端地址的getpeername。我不明白你爲我的答案(getsockname)投票-1,然後給出相同的答案(getsockname)!不公平,你與SO合作的方式不公平。 –
在服務器上,'getsockname()返回客戶端用來連接服務器的地址,服務器可以是任何服務器的IP地址,這就是問題所在:哪一個。這裏沒有矛盾。服務器用來與客戶端通信的客戶端自己的地址由服務器上的getpeername()返回。 – EJP
此信息可通過getsockname()
致電。在服務器端調用時,它提供服務器accept
編輯客戶端的本地服務器地址。
請注意,這受限於一個叫做'弱端系統模型'的深奧的東西,這實質上意味着連接被接收到的本地接口不一定對應於客戶端使用的IP地址(想一想當代理/路由器位於客戶端和服務器之間時發生)。在這種情況下,您將無法使客戶端實際使用connect
的IP(除非客戶端使用數據包將其發送到服務器),而只能使用接受客戶端的服務器上的IP。
@downvoter不要欺騙自己。看看它。所有的。這裏沒有錯誤。 – EJP
- 1. 客戶端連接或服務器端?
- 2. 客戶端 - 服務器UDP連接
- 3. Oracle客戶端服務器連接
- 4. MySQL連接服務器客戶端
- 5. 獲取Web服務客戶端IP
- 6. 服務器/客戶端服務器連接
- 7. 如何使用Rails獲取客戶端IP和服務器IP
- 8. 確定服務器上連接的客戶端的IP地址
- 9. C#公共IP客戶端/服務器
- 10. c#TCP/IP服務器和客戶端
- 11. 如何在NanoHTTPD(HTTP服務器)中獲取客戶端的IP?
- 12. 獲取客戶端IP的Web服務在Java 6 embbeded HTTP服務器
- 13. 如何在鏢架-rpc服務器中獲取客戶端IP
- 14. PHP使用客戶端IP連接到SMTP服務器
- 15. 如何在服務器端捕獲客戶端的連接和斷開連接?
- 16. 從服務器獲取客戶端的IP地址
- 17. Web服務客戶端和服務器
- 18. 服務器/客戶端C#
- 19. TCP客戶端服務器
- 20. 客戶端服務器 - (TCP)
- 21. Android客戶端服務器
- 22. 服務器客戶端java
- 23. 客戶端服務器C++
- 24. 服務器客戶端iphone
- 25. JXTA客戶端 - 服務器
- 26. 服務器和客戶端
- 27. 在服務器端獲取本地IP地址的非服務器端方法?
- 28. 如何通過xinetd從java服務器獲取客戶端IP?
- 29. CSocket服務器獲取客戶端IP地址
- 30. 從服務器JSP獲取客戶端IP [安全]
@UlugToprak,我想服務器的IP和客戶端的不是IP。 – user2137306
措辭不清楚,我刪除了重複的標誌。 –