我在三台不同的计算机上有三个进程。
进程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。
我该如何解决这个问题?
非常感谢!
答案 0 :(得分:0)
如果在getpeername()
调用进程3套接字后检测到该地址是本地主机,则可以为进程1套接字调用getsockname()
以获取用于连接进程的IP进程1 2.只要进程3在同一台机器上运行时正在侦听与进程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);
}
答案 1 :(得分:0)
我不知道进程2如何连接进程3:
int connect (int sockfd,struct sockaddr * serv_addr,int addrlen);
如果 connect 函数中的* serv_addr *参数是localhost,那么如果* serv_addr *是PC的IP,那么进程 getpeername 将获得localhost,所以你可以获得PC的IP。
答案 2 :(得分:0)
如果进程3使用127.0.0.1,并且进程1位于不同的计算机上,则进程1将永远无法与进程3通信,因为进程3将无法访问网络,因为127.0。 0.1仅隔离到本地计算机。进程3必须使用机器的实际网络IP,以便网络上的其他机器可以访问。