我有一個服務器與來自客戶端的傳入套接字。 我需要獲取遠程客戶端的IP地址。 嘗試谷歌搜索in_addr
,但它有點麻煩。 有什麼建議嗎?獲取傳入套接字連接的源地址
回答
您需要getpeername
函數。偉大的Beej的網絡指南有一個page about it。下面是有一個代碼示例:
// assume s is a connected socket
socklen_t len;
struct sockaddr_storage addr;
char ipstr[INET6_ADDRSTRLEN];
int port;
len = sizeof addr;
getpeername(s, (struct sockaddr*)&addr, &len);
// deal with both IPv4 and IPv6:
if (addr.ss_family == AF_INET) {
struct sockaddr_in *s = (struct sockaddr_in *)&addr;
port = ntohs(s->sin_port);
inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);
} else { // AF_INET6
struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr;
port = ntohs(s->sin6_port);
inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof ipstr);
}
printf("Peer IP address: %s\n", ipstr);
+1。但是,我們不必爲此釋放任何內存? – iammilind 2014-07-27 17:19:55
我注意到'struct sockaddr_in * s'在外部範圍中隱藏套接字's'。有一個陰影變量並不理想。 – 2015-06-22 23:12:53
有沒有辦法從地址 – Bionix1441 2016-12-06 09:01:19
既然你說,這是來自客戶端的傳入連接,以替代getpeername
你可以只保存由accept()
調用返回的地址,在第二和第三參數。
假設您使用accept()
接受傳入的套接字連接,則不需要getpeername()
。地址信息可通過accept()
呼叫的第二個和第三個參數獲得。
這裏是禮的回答修改,以做沒有getpeername()
:
int client_socket_fd;
socklen_t len;
struct sockaddr_storage addr;
char ipstr[INET6_ADDRSTRLEN];
int port;
len = sizeof addr;
client_socket_fd = accept(server_socket_fd, (struct sockaddr*)&addr, &len);
// deal with both IPv4 and IPv6:
if (addr.ss_family == AF_INET) {
struct sockaddr_in *s = (struct sockaddr_in *)&addr;
port = ntohs(s->sin_port);
inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);
} else { // AF_INET6
struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr;
port = ntohs(s->sin6_port);
inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof ipstr);
}
printf("Peer IP address: %s\n", ipstr);
+1得到socketDescriptor直接使用'accept()'。但是,我們不必爲此釋放任何內存? – iammilind 2014-07-27 17:19:09
@iammilind:我不認爲任何內存需要被釋放 - 我看不到任何動態分配正在完成。這一切都是用靜態分配的變量完成的。 – 2014-07-31 00:42:22
- 1. 如何獲取接受的入站套接字的IP地址?
- 2. 獲取地址IP並使用套接字連接到它
- 3. 連接與id地址ip - 套接字
- 4. 從套接字獲取地址族。 Linux
- 5. 獲取套接字/網絡接口的本地IP地址
- 6. 在接受連接之前獲取套接字的IP地址C++
- 7. 檢測傳入的套接字連接
- 8. 如何從Windows套接字(C++)獲取連接主機的IP地址?
- 9. 將套接字連接到設備上的本地地址
- 10. Python套接字獲取連接重置
- 11. 獲取Java套接字連接
- 12. 獲取套接字的本地IP地址
- 13. 從套接字獲取IP從本地主機連接到java
- 14. 如何確保UNIX套接字連接到相同的地址
- 15. 建立tcp連接時,什麼樣的地址給套接字?
- 16. 創建沒有IP地址的套接字連接(TCP或UDP)
- 17. 套接字只接受特定地址?
- 18. AIR(Flex的)本地套接字連接
- 19. 如何獲取套接字的IP地址C
- 20. 獲取套接字編程請求的地址爲C
- 21. Akka ZeroMQ - 獲取套接字地址的任何方式?
- 22. 獲取遠程套接字端點的IP地址
- 23. 如何使用套接字地址獲取自己的IP地址?
- 24. C#TCP套接字連接,輸出IP地址
- 25. 使用connect()函數連接到IP地址 - 套接字編程
- 26. 獲取傳入TCP連接的端口
- 27. 從地址獲取套接字描述符?
- 28. 如何從原始套接字獲取IP src地址
- 29. 從URL獲取IP地址時出現套接字錯誤
- 30. 如何從套接字獲取IP地址在Windows中
組in_addr是IPv4的特定,反正 – bortzmeyer 2010-01-14 18:15:57
man getpeername
– 2010-01-14 14:18:28看到在linux INET_NTOA(..)函數.. '男人INET_NTOA'。在我看來,它比inet_ntop更容易,並且需要包括arpa/inet.h。這裏是一個例子:http://www.binarytides.com/programming-udp-sockets-c-linux/ – mhk 2016-08-11 07:51:53