2013-07-11 2 views
1

3 가지 컴퓨터에서 3 가지 프로세스가 있습니다.C - 파일 설명자의 공용 IP 주소

과정 1, 클라이언트는, 프로세스 이전 2 프로세스에 연결 3.

프로세스 3의 IP와 PORT를위한 프로세스 2를 요청하고 프로세스 2는 파일 기술자 (공정 3에서 프로세스 3의 IP를 가져옵니다 이미 프로세스 2의 IP와 포트를 알고 있습니다.

이 잘 작동하지만 동일한 컴퓨터에서 프로세스 2 및 프로세스 3을 실행하려고하면, 프로세스 3의 IP는 항상 일을 처리 127.0.0.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

IP가 127.0.0.1이면 프로세스 2가 로컬 시스템의 네트워크 인터페이스 주소를 조회 할 수 있습니다. 그러나 하나 이상의 프로세스가있을 수 있으므로 프로세스 1에 보내도록 선택해야합니다. – Barmar

답변

0

getpeername() 프로세스 3 소켓을 호출 한 후 주소가 로컬 호스트임을 감지하면 프로세스 1 소켓에 대해 getsockname()을 호출하여 프로세스 2에 연결하는 데 사용되는 IP 프로세스 1을 가져올 수 있습니다. 프로세스 3 동일한 머신에서 실행될 때 프로세스 2와 동일한 인터페이스를 청취하는 경우 프로세스 1은 프로세스 3에 동일한 주소로 연결할 수 있어야합니다.

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

경우 *대로 serv_addr * 에 인수 기능은 localhost입니다 연결, 그렇다면, localhost를 얻을 것이다 getpeername는를 처리 :

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); 
} 
+0

프로세스 3이 127.0.0.1에 바인드된다는 사실은 프로세스가 네트워크 액세스 가능한 인터페이스에 바인딩되지 않으므로 프로세스 1은 프로세스 3과 직접 통신 할 수 있어야합니다. –

+0

프로세스 3은 INADDR_ANY에 바인딩되지만 로컬 호스트를 사용하여 프로세스 2에 연결될 가능성이 더 높습니다. – jxh

+0

이는 내가 말한 것을 변경하지 않습니다. 일단'connect()'가 호출되면 설정된 연결은 여전히 ​​127.0.0.1에 바인드되어 네트워크를 통해 프로세스 1이 액세스 할 수 없게됩니다. –

0

나는 과정이 연결 과정 (3)이 방법을 모른다 * serv_addr *은 PC의 IP이므로 PC의 IP를 얻을 수 있습니다.

0

프로세스 3이 127.0.0.1을 사용하고 프로세스 1이 다른 시스템에있는 경우 프로세스 1은 프로세스 3과 통신 할 수 없습니다. 프로세스 3은 127.0 .0.1은 로컬 시스템에만 격리됩니다. 프로세스 3은 네트워크의 다른 컴퓨터가 연결할 수 있도록하기 위해 컴퓨터의 실제 네트워크 IP를 사용해야합니다.