12.5. Переносимость исходного кода

12.5. Переносимость исходного кода

Большинство существующих сетевых приложений написаны для IPv4. Структуры sockaddr_in размещаются в памяти и заполняются, а функция socket задает AF_INET в качестве первого аргумента. При переходе от листинга 1.1 к листингу 1.2 мы видели, что эти приложения IPv4 можно преобразовать в приложения IPv6 без особых усилий. Многие показанные нами изменения можно выполнить автоматически, используя некоторые сценарии редактирования. Программы, более зависящие от IPv4, использующие такие свойства, как многоадресная передача, параметры IP или символьные (неструктурированные) сокеты, потребуют больших усилий при преобразовании.

Если мы преобразуем приложение для работы с IPv6 и распространим его исходный код, нам придется думать о том, поддерживает ли принимающая система протокол IPv6. Типичный способ решения этой проблемы — применять в коде #ifdef, используя по возможности IPv6 (поскольку мы видели в этой главе, что клиент IPv6 может взаимодействовать с серверами IPv4 и наоборот). Проблема такого подхода в том, что код очень быстро засоряется директивами #ifdef, и его становится сложнее отслеживать и обслуживать.

Наилучшим подходом будет рассмотрение перехода на IPv6 как возможности сделать программу не зависящей от протокола. Первым шагом здесь будет удаление вызовов функций gethostbyname и gethostbyaddr и использование функций getaddrinfo и getnameinfo, описанных в предыдущей главе. Это позволит нам обращаться со структурами адресов сокетов как с непрозрачными объектами, ссылаться на которые можно с помощью указателя и размера, что как раз и выполняют основные функции сокетов: bind, connect, recvfrom и т.д. Наши функции sock_XXX из раздела 3.8 помогут работать с ними независимо от IPv4 и IPv6. Очевидно, эти функции содержат #ifdef для работы с IPv4 и IPv6, но если мы скроем эту зависимость от протокола в нескольких библиотечных функциях, наш код станет проще. В разделе 21.7 мы разработаем ряд функций mcast_XXX, которые помогут сделать приложения многоадресной передачи не зависящими от версии протокола IP.

Другой момент, который нужно учесть, — что произойдет, если мы откомпилируем наш исходный код в системе, поддерживающей и IPv4, и IPv6, затем распространим либо исполняемый код, либо объектные файлы (но не исходный код) и кто-то запустит наше приложение в системе, не поддерживающей IPv6. Есть вероятность, что сервер локальных имен поддерживает записи типа AAAA и возвращает как записи типа AAAA, так и записи типа А некоему собеседнику, с которым пытается соединиться наше приложение. Если наше приложение, работающее с IPv6, вызовет функцию socket для создания сокета IPv6, она не будет работать, если узел не поддерживает IPv6. Мы решаем этот вопрос с помощью функций, описанных в следующей главе, игнорируя ошибку функции socket и пытаясь использовать следующий адрес в списке, возвращаемом сервером имен. Если предположить, что у собеседника имеется запись типа А и что сервер имен возвращает запись типа А в дополнение к любой записи типа AAAA, то сокет IPv4 успешно создастся. Этот тип функциональности имеется в библиотечной функции, но не в исходном коде каждого приложения.

Чтобы получить возможность передавать дескрипторы сокетов, программам, работающим только с одним из протоколов, в стандарте RFC 2133 [37] предлагается использовать параметр сокета IPV6_ADDRFORM, позволяющий получить или изменить семейство сокета. Однако семантика параметра не была описана полностью, да и использоваться он мог только в очень специфических ситуациях, поэтому в следующей версии интерфейса сокетов данный параметр был отменен.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

3.4. Установка программ из исходного кода

Из книги Fedora 8 Руководство пользователя автора Колисниченко Денис Николаевич

3.4. Установка программ из исходного кода 3.4.1. Идея открытого кода Знаете, почему Linux называется открытой операционной системой? Потому что любому желающему доступен исходный код ее ядра и большинства Linux-приложений. Вы можете загрузить исходный код любой программы и


1.5.4. Сообщество открытого исходного кода

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

1.5.4. Сообщество открытого исходного кода Сообщество, первоначально сформированное вокруг ранних дистрибутивов Unix, уже никогда не исчезало. После бурного роста Internet в начале 90-х годов в его ряды было вовлечено все новое поколение увлеченных хакеров с домашними


16.5. Поиск открытого исходного кода

Из книги Asterisk™: будущее телефонии Второе издание автора Меггелен Джим Ван

16.5. Поиск открытого исходного кода Ввиду того, что в Unix-мире доступно огромное количество открытого исходного кода, навыки поиска такого кода для повторного использования могут иметь неоценимое значение — гораздо большее, чем в случае других операционных систем.


17.2.3. Стандарты Unix в мире открытого исходного кода

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

17.2.3. Стандарты Unix в мире открытого исходного кода В середине 1990-х годов сообщество открытого исходного кода начало собственную работу по стандартизации. Эти усилия основывались на совместимости на уровне кода, закрепленной стандартом POSIX и его потомками. В частности Linux,


Получение исходного кода

Из книги TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security) автора Фейт Сидни М

Получение исходного кода Лучше всего взять исходный код для Asterisk и его пакетов прямо на веб-сайте http://www.asterisk.org или


Получение исходного кода Asterisk

Из книги Разработка ядра Linux автора Лав Роберт

Получение исходного кода Asterisk Проще всего получить самую последнюю выпущенную версию с помощью программы


Извлечение исходного кода из архива

Из книги автора

Извлечение исходного кода из архива Пакеты, загружаемые с FTP-сервера, являются архивами, в которых содержится исходный код; таким образом, перед компиляцией код требуется извлечь из архива. Если пакеты загружены в другую папку, не /usr/src/, их надо или перенести туда или


1.5.4. Сообщество открытого исходного кода

Из книги автора

1.5.4. Сообщество открытого исходного кода Сообщество, первоначально сформированное вокруг ранних дистрибутивов Unix, уже никогда не исчезало. После бурного роста Internet в начале 90-х годов в его ряды было вовлечено все новое поколение увлеченных хакеров с домашними


16.5. Поиск открытого исходного кода

Из книги автора

16.5. Поиск открытого исходного кода Ввиду того, что в Unix-мире доступно огромное количество открытого исходного кода, навыки поиска такого кода для повторного использования могут иметь неоценимое значение — гораздо большее, чем в случае других операционных систем.


17.2.3. Стандарты Unix в мире открытого исходного кода

Из книги автора

17.2.3. Стандарты Unix в мире открытого исходного кода В середине 1990-х годов сообщество открытого исходного кода начало собственную работу по стандартизации. Эти усилия основывались на совместимости на уровне кода, закрепленной стандартом POSIX и его потомками. В частности Linux,


19.6.14 Просмотр исходного кода HTML

Из книги автора

19.6.14 Просмотр исходного кода HTML Чтобы хорошо изучить HTML, нужно познакомиться с исходными кодами документов. Обычно браузер имеет для этого специальный режим, иначе придется сохранить документ на диске и затем просмотреть его в обычном текстовом


Получение исходного кода ядра

Из книги автора

Получение исходного кода ядра Исходный программный код последней версии ядра всегда доступен как в виде полного архива в формате tar (tarball), так и виде инкрементной заплаты по адресу http://www.kernel.org.Если нет необходимости по той или другой причине работать со старыми версиями


Инсталляция исходного кода ядра

Из книги автора

Инсталляция исходного кода ядра Архив исходного кода ядра в формате tar распространяется в сжатых форматах GNU zip (gzip) и bzip2. Формат bzip2 наиболее предпочтителен, так как обеспечивает больший коэффициент сжатия по сравнению с форматом gzip. Архив ядра в формате bzip2 имеет имя


Стиль написания исходного кода

Из книги автора

Стиль написания исходного кода Как и для любого большого программного проекта, для ядра Linux определен стиль написания исходного кода, который определяет форматирование и размещение кода. Это сделано не потому, что стиль написания, который принят для Linux, лучше других