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

时间:2013-07-11 00:16:15

标签: c sockets ip

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

进程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 个答案:

答案 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,以便网络上的其他机器可以访问。

相关问题