У меня есть клиентская программа UDP, которая использует сокеты Berkley и Winsock (в зависимости от платформы).
В основном он использует getaddrinfo()
, затем socket()
, затем sendto()
. sendto()
принимает информацию об адресе, возвращаемую getaddrinfo()
. Мой код выглядит так:
struct addrinfo hint;
memset(&hint, 0, sizeof(hint));
hint.ai_socktype = SOCK_DGRAM;
struct addrinfo *address;
getaddrinfo("127.0.0.1", "9999", &hint, &address);
SOCKET s = socket(address->ai_family, address->ai_socktype, address->ai_protocol);
sendto(s, "test", 4, 0, address->ai_addr, address->ai_addrlen);
Мой вопрос: когда установлен локальный / временный номер порта? Это установлено с вызовом на sendto()
? Если я отправлю больше данных на другой сервер, будет ли sendto()
повторно использовать тот же самый эфемерный номер порта? Как я могу получить эфемерный номер порта (независимо от протокола)? Я знаю, что знание этого может быть бесполезным, и NAT все равно может его изменить, но я просто пытаюсь понять, как все это работает лучше.
Я также знаю, что могу использовать bind()
для установки локального порта, но мой вопрос о том, что происходит, когда ОС выбирает для меня локальный порт.