Важно помнить, что, если сокет не подключен (или для сокета без установления соединения не передал данные), с этим сокетом может не быть никаких локальных или удаленных IP-адресов.
Допустим, компьютер является многосетевым и имеет как локальные, так и интернет-IP-адреса. Может быть, даже несколько IP-адресов локальной сети. Если вы решите связать сокет с «любым» локальным адресом (используя флаг типа INADDR_ANY) или никогда не вызывать bind (), то у API сокета нет ни одного локального IP-адреса, связанного с сокетом, просто Максимальный номер порта. Когда вы вызываете connect () для сокета, система выбирает, какой локальный IP-адрес использовать, в зависимости от того, к кому вы подключаетесь. Поэтому, если вы подключаетесь к машине через Интернет, ваш IP-адрес в Интернете связан с сокетом, а если вы подключаетесь к машине в локальной сети, используется ваш IP-адрес в локальной сети.
Поэтому вы можете быть уверены, что подключили () к удаленному компьютеру или привязали () к определенному локальному IP-адресу, прежде чем использовать getsockname (). Интересно, вызвало ли включение IPv6 вашу машину, чтобы увидеть несколько потенциальных локальных IP-адресов для использования. Очевидно, что вы сильно подключены к машине, чтобы использовать getpeername ().