2012-03-25 2 views
2

Я пишу программу клиент/сервер, используя C-сокеты. Я указываю, что сервер может прослушивать любой сетевой интерфейс, используя INADDR_ANY в sockaddr_in.sin_addr.s_addr. Это эквивалентно IP 0.0.0.0. Возможно ли получить фактический IP-адрес, который прослушивает сервер? (например, 192.168.1.100)C Получить IP-адрес для сервера прослушивания

+0

До или после установления соединения? Сервер может прослушивать несколько адресов. – blueshift

+0

До этого. В моем случае у меня будет только один IP-адрес. Просто я разрешаю системе решить. Но я все еще хочу знать, что он решает. – Gigi

+3

Сервер будет прослушивать * все * интерфейсы, которые доступны. Даже один интерфейс может иметь несколько IP-адресов. –

ответ

0

Я наконец-то смог найти solution that works.

Редактировать: link is dead so see: Internet Archive link.

Надеюсь, это может быть полезно для других, как и для меня.

+0

Надеюсь, вам не нужна поддержка IPv6, потому что это не будет работать для IPv6. –

+0

Нет, не знаю. Но это может помочь тем, кто это делает, если вы объясните, почему это не подходит. Я думаю, что используемые вызовы функций имеют эквиваленты IPv6. – Gigi

+1

Функция 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 и выполняет ту же функцию. –

1

Когда вы связываете прослушивающий сокет с INADDR_ANY, сокет прослушивает все доступные локальные IP-адреса. Невозможно определить из сокета, который IP (s) он прослушивает. Если вам нужна эта информация, вам необходимо отдельно указывать локальные IP-адреса (в этом случае вы можете просто указать bind() каждый IP-адрес в свой собственный сокет, если вам нужно отследить предварительные данные привязки). Однако после того, как accept() вернул установленное клиентское соединение, вы можете использовать getsockname() в принимаемом сокете, чтобы узнать, какой конкретный IP-адрес принял соединение.