Я пишу программу клиент/сервер, используя C-сокеты. Я указываю, что сервер может прослушивать любой сетевой интерфейс, используя INADDR_ANY в sockaddr_in.sin_addr.s_addr. Это эквивалентно IP 0.0.0.0. Возможно ли получить фактический IP-адрес, который прослушивает сервер? (например, 192.168.1.100)C Получить IP-адрес для сервера прослушивания
ответ
Я наконец-то смог найти solution that works.
Редактировать: link is dead so see: Internet Archive link.
Надеюсь, это может быть полезно для других, как и для меня.
Надеюсь, вам не нужна поддержка IPv6, потому что это не будет работать для IPv6. –
Нет, не знаю. Но это может помочь тем, кто это делает, если вы объясните, почему это не подходит. Я думаю, что используемые вызовы функций имеют эквиваленты IPv6. – Gigi
Функция getaddrinfo ([linux docs] (http://linux.about.com/library/cmd/blcmdl3_getaddrinfo.htm), [Документы Windows] (http://msdn.microsoft.com/en-us/ библиотека/windows/desktop/ms738520 (v = vs.85) .aspx)) поддерживает IPv6 и выполняет ту же функцию. –
Когда вы связываете прослушивающий сокет с INADDR_ANY
, сокет прослушивает все доступные локальные IP-адреса. Невозможно определить из сокета, который IP (s) он прослушивает. Если вам нужна эта информация, вам необходимо отдельно указывать локальные IP-адреса (в этом случае вы можете просто указать bind()
каждый IP-адрес в свой собственный сокет, если вам нужно отследить предварительные данные привязки). Однако после того, как accept()
вернул установленное клиентское соединение, вы можете использовать getsockname()
в принимаемом сокете, чтобы узнать, какой конкретный IP-адрес принял соединение.
До или после установления соединения? Сервер может прослушивать несколько адресов. – blueshift
До этого. В моем случае у меня будет только один IP-адрес. Просто я разрешаю системе решить. Но я все еще хочу знать, что он решает. – Gigi
Сервер будет прослушивать * все * интерфейсы, которые доступны. Даже один интерфейс может иметь несколько IP-адресов. –