Не существует простого или переносимого способа сделать то, что вы пытаетесь сделать.Поведение bind()
и getsockname()
в вашем случае правильное.
Ваша программа никоим образом не должна зависеть или требовать IP-адрес хоста.Если это произойдет, возможно, у вас возникла проблема с дизайном в вашей программе.
Спросите себя, каков IP-адрес компьютера с двумя сетевыми интерфейсами, подключенными к двум разным сетям и несколькими IP-адресами?
Network 1 Network 2
...-----------+-- --+-----------...
\ /
192.0.2.1 \ / 198.51.100.2
eth0 +------------+ eth1
| Computer |
+------------+
В: Какой IP-адрес вы ожидаете увидеть в этом случае?
Ответ заключается в том, что нет правильного ответа, и ваша программа не должна даже беспокоиться об этом.Ваша программа должна больше заботиться об установлении связи, и для этого вам нужен только целевой IP или имя хоста.Операционная система найдет способ установить связь (а для потоков, ориентированных на соединение, она может сможет дать вам локальный адрес, выбранный для связи с этой целью).
Вы можете получить текущее имя хоста, используя gethostname()
, и с этим именем вы можете попытаться найти IP-адрес, но есть еще много ошибок:
- Этоне требуется или не гарантируется, что имя хоста имеет какой-либо связанный IP-адрес.
- Во многих случаях, чем вы думаете, IP-адрес, связанный с именем хоста, равен 127.0.0.1, что бесполезно (большинство дистрибутивов Linux добавляют это кваш файл / etc / hosts).
- Даже если вы получите IP-адрес от имени хоста, маловероятно, что он будет полезен (как в случае 2 выше, или локальный IP-адрес за NAT,или IP неверного сетевого интерфейса).
Таким образом, вы не должны полагаться на эту информацию в первую очередь.