繁体   English   中英

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

[英]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_instruct sockaddr_in6
  • 您应该检查getpeername()的返回值是否有错误。
  • 您必须传递指向inet_ntop()struct in_addrstruct 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM