[英]how to find a socket's ip address c++/c
我想知道如何获得使用accept连接到服务器上套接字的客户端的IP地址。 我该怎么做? getpeername返回了错误的IP地址,我似乎找不到另一种方法。
在服务器上,接受返回后,我正在这样做:
char buf[INET_ADDRSTRLEN];
struct sockaddr name; socklen_t len = sizeof(name);
getpeername(sock_fd, &name, &len); //sock_fd is the socket im using
inet_ntop(AF_INET, &name, buf, INET_ADDRSTRLEN);
string ip = buf;
accept的第二个参数具有此信息。
您有几个错误:
struct sockaddr
类型的对象。 相反,您应该根据套接字的类型使用struct sockaddr_in
或struct sockaddr_in6
。 getpeername()
的返回值是否有错误。 inet_ntop()
的struct in_addr
或struct in6_addr
的指针,而不是sockaddr的指针。 它应该看起来像:
char buf[INET_ADDRSTRLEN] = "";
struct sockaddr_in name;
socklen_t len = sizeof(name);
if (getpeername(sock_fd, (struct sockaddr *)&name, &len) != 0) {
perror("getpeername");
} else {
inet_ntop(AF_INET, &name.sin_addr, buf, sizeof buf);
}
但是,您不需要使用getpeername()
,而是可以传递(struct sockaddr *)&name
和&len
作为accept()
的第二和第三参数,然后从那里继续。
根据当前可用的有限信息进行大胆的猜测:确保在接受的连接上而不是在侦听套接字上调用getpeername()
。
当getpeername()
返回时,它将写入可能是in_addr_t
(或in6_addr
!)结构的内容。 使用inet_ntoa
这样的例程来格式化和显示结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.