Получить клиентский порт (в C) после вызова для подключения

Я просматриваю исходный код, который подключается к удаленному хосту через порт P (используя TCP). После вызова для подключения (при условии успешного выполнения) я хотел бы обнаружить клиентский порт соединения (т.е. клиентский порт). По правде говоря, я просматриваю исходники openssh, в sshconnect.c есть функция ssh_connect, которая вызывает timeout_connect. У меня есть IP-адрес удаленного хоста, порт, локальный IP-адрес, но я хотел бы знать локальный (клиентский) порт после успешного подключения.

Я надеюсь, что я был ясен, и спасибо за ваши ответы С уважением Сапси


person Fishy    schedule 02.03.2010    source источник


Ответы (2)


Попробуйте передать дескриптор файла клиентского сокета в getsockname, что-то вроде этого

struct sockaddr_in local_address;
int addr_size = sizeof(local_address);
getsockname(fd, &local_address, &addr_size);

Затем вы можете выделить структуру адреса для IP и порта.

person JustJeff    schedule 02.03.2010

Вы можете использовать struct sockaddr_in для хранения информации о клиенте. Кроме того, вы можете использовать функцию getsockname, чтобы получить текущий адрес вашего клиента. Так:

struct sockaddr_in client;
socklen_t clientsz = sizeof(client);

[... after connect() ...]

getsockname(socket_descriptor, (struct sockaddr *) &client, &clientsz);

printf("[%s:%u] > ", inet_ntoa(client.sin_addr), ntohs(client.sin_port));
                   /* client address                  client port      */

Результат:

[127.0.0.1:58168] > (я запускал программу локально)

person Erick Giffoni    schedule 19.05.2021