В1. Я читал на нескольких веб-сайтах, где говорилось, что установка «0» для порта говорит ОС, что вы хотите следующий доступный порт, а не 0. Это правда?
Да, но только после того, как вы использовали bind()
, чтобы прикрепить адрес к реальному сокету.В этот момент используйте getsockname()
, чтобы получить связанный адрес из сокета;порт будет частью этого.
Q2: Я также читал, что gethostbyname (gethostname (...)) может дать вам IP-адрес машины, но Бидж сказал, что они заменены getaddrinfo().Итак, я должен использовать getaddrinfo?Или gethostbyname?
Использование getaddrinfo()
;он делает все, что сделал gethostbyname()
и более, и интерфейс отстой намного меньше.(Например, обычно он ориентирован на многопотоковое исполнение.)
Q3: Есть ли что-то еще, что я делаю неправильно?
Нет четкого определения IP-адреса сервера.адрес.Серверов может быть много из-за таких вещей, как множественные сетевые карты (гораздо более распространенные для серверов, чем настольные системы), и тот, который знает об этом внешний мир, может и не быть одним из них (благодаря межсетевым экранам NAT).Иногда вы можете точно знать, откуда поступают сообщения до подключения клиента - наиболее распространенный вариант - знать, что клиент будет на localhost
, что является частью информации, которую вы установили во время bind()
, но это редко.Вы можете найти адрес клиента после установления соединения, используя getpeername()
, но NAT все еще может сделать это функционально бесполезным.Такие адреса обычно задаются в файле конфигурации приложения во время развертывания.
Если вам нужна только информация для ведения журнала, продолжайте.Но остерегайтесь использовать его для чего-то еще, так как на самом деле это мало что говорит вам.