我有一個服務器與來自客戶端的傳入套接字。 我需要獲取遠程客戶端的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. 在接受連接之前獲取套接字的IP地址C++
- 5. 檢測傳入的套接字連接
- 6. 將套接字連接到設備上的本地地址
- 7. Python套接字獲取連接重置
- 8. 獲取套接字的本地IP地址
- 9. 套接字只接受特定地址?
- 10. AIR(Flex的)本地套接字連接
- 11. 獲取遠程套接字端點的IP地址
- 12. 如何使用套接字地址獲取自己的IP地址?
- 13. 獲取傳入TCP連接的端口
- 14. 從URL獲取IP地址時出現套接字錯誤
- 15. 如何從套接字獲取IP地址在Windows中
- 16. 從地址獲取套接字描述符?
- 17. 連接到本地套接字
- 18. Python套接字 - 連接套接字
- 19. 在接受套接字連接之前很熱得到請求的IP地址?
- 20. 得到一個設備的黑莓IP地址,從那裏有傳入的套接字連接到我
- 21. AIR本地套接字連接 - 錯誤#2031:套接字錯誤。網址:本地主機
- 22. 在python套接字中指定socket.connect()的源IP地址
- 23. 設置UDP套接字的源IP地址
- 24. Sql連接地址
- 25. 上次連接關閉後,如何通過套接字監聽傳入連接?
- 26. 使用套接字連接獲取網站的狀態代碼
- 27. 無法連接到本地套接字,連接被拒絕
- 28. 從C套接口提取IP地址
- 29. 將本地winsock套接字傳遞給java套接字
- 30. JPA本地連接獲取
組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