繁体   English   中英

C-来自文件描述符的公共IP

[英]C - Public IP from file descriptor

我在三台不同的计算机上有三个进程。

客户端的过程1向过程2询问过程3的IP和PORT。

进程3较早地连接到进程2,并且进程2从文件描述符获取进程3的IP(进程3已经知道进程2的ip和端口)。

这可以正常工作,但是如果我尝试在同一台计算机上运行进程2和进程3,则进程3的IP始终为127.0.0.1,因此进程1永远找不到进程3。

    socklen_t len;
    struct sockaddr_storage addr;
    char ipstr[INET_ADDRSTRLEN];

    len = sizeof addr;
    getpeername(fd, (struct sockaddr*) &addr, &len);

    struct sockaddr_in *s = (struct sockaddr_in *) &addr;

    inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);

这是我正在使用的代码,而ipstr是我获得的IP。

我该如何解决?

非常感谢!

如果在对进程3套接字进行getpeername()调用后您检测到该地址是本地主机,则可以为进程1套接字调用getsockname()以获取用于连接到进程2的IP进程1。当它们在同一台计算机上运行时,如果正在侦听与进程2相同的接口,则进程1应该能够使用相同的地址连接到进程3。

len = sizeof addr;
getpeername(p3_socket, (struct sockaddr*) &addr, &len);
struct sockaddr_in *s = (struct sockaddr_in *) &addr;
inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);

if (strcmp(ipstr, "127.0.0.1") == 0) {
    len = sizeof(addr);
    getsockname(p1_socket, (struct sockaddr *)addr, &len);
    inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);
}

我不知道流程2如何连接流程3:

int connect (int sockfd,struct sockaddr * serv_addr,int addrlen);

如果connect函数中的* serv_addr *参数是localhost,则进程getpeername将获得localhost,如果* serv_addr *是PC的IP,则可以获取PC的IP。

如果进程3使用127.0.0.1,并且进程1在另一台计算机上,则进程1将永远无法与进程3通信,因为进程3将无法访问网络,因为127.0.0.1被隔离了仅限本地计算机。 进程3必须改为使用计算机的实际网络IP才能被网络上的其他计算机访问。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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