2013-07-11 2 views
1

У меня три процесса на трех разных компьютерах.C - Открытый IP-адрес из файлового дескриптора

Процесс 1, клиент, запрашивает процесс 2 для IP и порт процесса 3.

Process 3 подключен к процессу 2 раньше, и процесс 2 получает IP процесса 3 из файлового дескриптора (Process 3 уже знает ip и порт процесса 2).

Это прекрасно работает, но если я пытаюсь запустить процесс 2 и 3 процесса в том же самом компьютере, то IP процесса 3 всегда 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

Если IP-адрес 127.0.0.1, процесс 2 может искать адрес сетевых интерфейсов локальной сети. Но может быть больше одного, ему нужно будет выбрать один для отправки в процесс 1. – Barmar

ответ

0

Если после вызова getpeername() вызова для сокета процесса 3 вы обнаруживаете, что адрес является локальным хостом, вы можете вместо этого позвонить getsockname() для сокета процесса 1, чтобы получить процесс 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); 
} 
+0

Тот факт, что процесс 3 связан с 127.0.0.1, означает, что он НЕ привязан к сетевому интерфейсу, поэтому Process 1 не будет иметь возможность напрямую связываться с процессом 3. –

+0

Скорее всего, процесс 3 привязан к INADDR_ANY, но использует localhost для подключения к процессу 2. – jxh

+0

Это не меняет то, что я сказал. Установленное соединение все равно будет привязано только к 127.0.0.1 после вызова 'connect()' и, следовательно, не будет доступно для процесса 1 по сети. –

0

Я не знаю, как процесс 2 подключения процесс 3:

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

если * serv_addr * аргумент в подключения функция локальный, поэтому обрабатывать getpeername получит локальный, если * serv_addr * - это IP-адрес ПК, поэтому вы можете получить IP-адрес ПК.

0

Если процесс 3 использует 127.0.0.1, а процесс 1 находится на другом компьютере, то процесс 1 никогда не сможет связываться с процессом 3, так как процесс 3 не будет иметь доступа к сети, так как 127.0 .0.1 изолирован только от локальной машины. Процесс 3 должен был бы использовать фактический сетевой IP-адрес машины, чтобы быть доступным другими машинами в сети.

Смежные вопросы