1

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

进程 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。

我该如何解决这个问题?

非常感谢!

4

3 回答 3

0

如果在getpeername()调用进程 3 套接字之后您检测到地址是本地主机,则可以改为调用getsockname()进程 1 套接字以获取用于连接进程 2 的 IP 进程 1。只要进程 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);
}
于 2013-07-11T00:33:24.340 回答
0

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

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

如果connect函数中的*serv_addr*参数是localhost,那么进程getpeername会得到localhost,如果*serv_addr*是PC的IP,那么就可以得到PC的IP。

于 2013-07-11T01:16:34.323 回答
0

如果进程 3 使用 127.0.0.1,而进程 1 位于另一台计算机上,则进程 1 将永远无法与进程 3 通信,因为进程 3 一开始就无法访问网络,因为 127.0.0.1 是隔离的仅限本地机器。进程 3 必须使用机器的实际网络 IP,以便网络上的其他机器可以访问。

于 2013-07-11T05:37:44.383 回答