如何找到套接字的IP地址c ++ / c

时间:2011-10-28 00:28:50

标签: c++ c sockets

我想知道如何使用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;

3 个答案:

答案 0 :(得分:5)

接受的第二个参数有此信息。

答案 1 :(得分:3)

您有几个错误:

  • 您不应创建struct sockaddr类型的对象。相反,您应该使用struct sockaddr_instruct sockaddr_in6,具体取决于套接字的类型;
  • 您应该检查getpeername()的错误返回值。
  • 您必须将指针传递给struct in_addrstruct in6_addrinet_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之类的例程来格式化并显示结果。