获取传入套接字连接的源地址

我有一个服务器,来自客户端的传入套接字。 我需要获取远程客户端的IP地址。 尝试在谷歌搜索in_addr但它有点麻烦。 有什么建议?

你需要getpeername函数。 伟大的Beej网络指南有一个关于它的页面 。 这是一个代码示例:

 // 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); 

假设您使用accept()接受传入的套接字连接,则不需要getpeername() 。 地址信息可通过accept()调用的第2和第3个参数获得。

以下是Eli的答案修改,没有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); 

既然你说它是来自客户端的传入连接,作为getpeername的替代,你可以在第二个和第三个参数中保存accept()调用返回的地址。