Лучший способ предоставить опции для указания NIC, определения IP в подсети? - PullRequest
0 голосов
/ 06 октября 2010

Я пишу библиотеку C, которая включает в себя указание другим компьютерам в подсети отправлять мне сообщения. Поэтому я должен сообщить им мой IP-адрес. Эта библиотека должна работать в Linux, OS X и Windows. В настоящее время я думаю в основном о слое POSIX.

Учитывая, что компьютер может иметь более одного адреса (например, если он имеет более одного сетевого интерфейса),

  1. Как лучше всего найти мой IP-адрес по умолчанию (например, в простейшем наиболее распространенном случае компьютера с одним подключением к подсети.) В настоящее время я перебираю систему Сетевые адаптеры, использующие getifaddrs и возвращающие первый связанный (с предпочтением non-loopback), но я думаю, что это, вероятно, не достаточно.

  2. Каким будет хороший API, позволяющий пользователям библиотеки выбирать, какой интерфейс отправлять? Я предполагаю какое-то перечисление сетевых карт и IP-адресов компьютера, затем выбираю сетевой адаптер по имени и нахожу его IP-адрес. Это кажется довольно сложным с точки зрения пользователя. Возможно, какой-нибудь способ определить маршрут системы к подсети по маске подсети, учитывая IP другого компьютера в подсети? Я понятия не имею, как это сделать.

Для 2 мы можем в конечном итоге предположить, что может существовать опция графического интерфейса или командной строки, позволяющая пользователям выбирать сетевой адаптер, но в целом я хочу, чтобы он как можно проще позволял другим компьютерам автоматически указывать, как управлять UDP. сообщения к нему.

Любые мнения приветствуются, спасибо!

Ответы [ 2 ]

2 голосов
/ 06 октября 2010

Если вы уже общаетесь с другими компьютерами, используя IP, пакеты уже будут объявлять обратный адрес, который удаленный конец может использовать, чтобы определить, куда должны отправляться его сообщения.

Попытка определить правильный интерфейсадрес для использования и встраивание его в сообщение не является хорошей идеей по четырем причинам (возможно, больше).Во-первых, в конечном итоге вы будете реализовывать всю логику, которую использует ваша ОС, чтобы выяснить, как маршрутизировать исходящие пакеты.Во-вторых, если таблица маршрутизации изменяется между временем, когда вы принимаете это решение, и временем, когда вам действительно нужно подключиться к другим компьютерам и указать им, куда отправлять трафик, вы отправите им неправильный адрес.В-третьих, конечные компьютеры не всегда могут находиться в одной подсети, и в этом случае ни один из интерфейсов не будет совпадать.В-четвертых, если пакеты подвергаются какой-либо форме перезаписи (например, NAT) между вами и пунктом назначения, то программное обеспечение, которое делает это, не будет знать, что ему нужно погрузиться в ваши пакеты, и системы на дальнем конце не будут использоватьправильный адрес.

0 голосов
/ 07 октября 2010

1.IP-адрес по умолчанию

На самом деле не существует такого понятия, как IP-адрес хоста по умолчанию.В целом, хотя большинство хостов сконфигурировано с маршрутом по умолчанию, который ОС решает использовать, если не может найти, рассматривая свою таблицу маршрутизации вместе с целевым IP-адресом пакета, другим интерфейсом для отправки пакета.Этот интерфейс будет иметь IP-адрес, и я полагаю, вы можете считать его IP-адресом по умолчанию.Но в случае многоузлового хоста используемый IP-адрес источника зависит от IP-адреса назначения в заголовке IP, который определяется операционной системой в сочетании с таблицей маршрутизации.Вот почему нет такого понятия, как IP-адрес по умолчанию.И даже если вы использовали IP-адрес, связанный с маршрутом по умолчанию, и сказали пользователям других хостов об этом адресе, нет гарантии, что пакет с их конца на ваш хост будет доставлен, потому что их хосты могут находиться в другой подсети (т.е. недоступен по маршруту по умолчанию).

2.API маршрутизации:

Похоже, вы хотите реализовать какую-то маршрутизацию на уровне приложения.Эта логика - кое-что, что операционная система обрабатывает, решая, куда отправить пакет, поэтому я не думаю, что вам нужно это реализовать.

3.Рекламные сервисы и mDNS:

Если вы знаете, что другие хосты находятся в той же подсети, посмотрите mDNS (mulitcast dns).Это позволит вам рекламировать сервисы (IP-адрес, номер порта), которые есть у вашего хоста, и другие хосты, которые связываются с той же группой многоадресной рассылки, могут обнаружить эту информацию.avahi - это реализация mDNS.

...