Как я могу получить локальный порт TCP и IP-адрес моей клиентской программы? - PullRequest
3 голосов
/ 23 марта 2010

Я готовлюсь к простому рабочему проекту и пытаюсь ознакомиться с основами сокетного программирования в среде Unix dev. На данный момент у меня есть некоторый базовый серверный код и настройка клиентского кода для связи. В настоящее время мой клиентский код успешно подключается к коду сервера и серверный код отправляет ему тестовое сообщение, после чего оба завершаются. Отлично! Это именно то, чего я хотел достичь. Сейчас я играю с функциями, используемыми для получения информации о двух средах (сервер и клиент). Я хотел бы получить локальный IP-адрес и динамически назначенный TCP-порт клиента. Для этого я нашел функцию getsockname() ...

//setup the socket
if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) 
{
   perror("client: socket");
   continue;
}

//Retrieve the locally-bound name of the specified socket and store it in the sockaddr structure
sa_len = sizeof(sa);
getsock_check = getsockname(sockfd,(struct sockaddr *)&sa,(socklen_t *)&sa_len) ;
if (getsock_check== -1) {
    perror("getsockname");
    exit(1);
}

printf("Local IP address is: %s\n", inet_ntoa(sa.sin_addr));
printf("Local port is: %d\n", (int) ntohs(sa.sin_port));

но на выходе всегда ноль ...

Local IP address is: 0.0.0.0
Local port is: 0

кто-нибудь видит что-то, чем я могу быть, или я определенно делаю неправильно?

Заранее большое спасибо за вашу помощь!

Ответы [ 2 ]

7 голосов
/ 23 марта 2010

Судя по виду вашего кода, вы не делаете connect или accept в сокете.Пока вы не сделаете это, данные, которые вы получите от getsockname, не определены.

3 голосов
/ 23 марта 2010

Я не думаю, что вы можете осмысленно вызывать getsockname в этом контексте до тех пор, пока не вызовете connect () - ядро ​​не привязывает его к определенному порту до тех пор, пока это не понадобится (или не будет сказано явно) и локальный адрес выбирается на основе таблицы маршрутизации и, следовательно, пункта назначения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...