我想知道如何使用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;
答案 0 :(得分:5)
接受的第二个参数有此信息。
答案 1 :(得分:3)
您有几个错误:
struct sockaddr
类型的对象。相反,您应该使用struct sockaddr_in
或struct sockaddr_in6
,具体取决于套接字的类型; getpeername()
的错误返回值。struct in_addr
或struct in6_addr
至inet_ntop()
,而不是指向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()
的第二个和第三个参数传递,然后从那里继续。< / p>
答案 2 :(得分:1)
疯狂猜测,基于当前可用的有限信息:确保您在接受的连接上呼叫getpeername()
,而不是在侦听套接字上。
当getpeername()
返回时,它正在写入可能是in_addr_t
(或in6_addr
!)结构的内容。使用inet_ntoa
之类的例程来格式化并显示结果。