Главная страница
Навигация по странице:

  • Выбор соответствующего протокола

  • 0-Ю23

  • InternetAddr.sin_addr s_addr = inet_addr("136.149.3 29), // Переменная nPortld хранится в системном порядке. Преобразование

  • Программирование в сетях Windows. Э. Джонс, Д. Оланд


    Скачать 2.88 Mb.
    НазваниеЭ. Джонс, Д. Оланд
    АнкорПрограммирование в сетях Windows.pdf
    Дата12.10.2017
    Размер2.88 Mb.
    Формат файлаpdf
    Имя файлаПрограммирование в сетях Windows.pdf
    ТипКнига
    #9346
    страница12 из 50
    1   ...   8   9   10   11   12   13   14   15   ...   50
    ГЛАВА 5 Сетевые
    Протокол
    SOCK SEQ-
    PACKET
    SOCKJTREAM
    SOCK SEQ-
    PACKET
    SOCKJTREAM
    SOCK SEQ-
    PACKET
    SOCKDGRAM
    SOCKJUDM
    SOCKJTREAM
    SOCK_RDM
    SOCKJDGRAM
    SOCKJDGRAM
    SOCKJtAW
    SOCK_RAW
    SOCKJTREAM
    протоколы ,117
    NSPROTOJPX
    NSPROTO SPX
    NSPROTOJPXII
    NSPROTOJPXII
    Номер LANA
    Номер LANA
    ATPROTOADSP
    ATPROTOADSP
    ATPROTOPAP
    DDPPROTO
    RTMP
    DDPPROTOZIP
    ATMPROTO_AAL5
    ATMPROTO_AAL5
    IRDA PROTO
    SOCK_ STREAM
    Начальные три параметра для создания сокета подразделены на три уров- ня Первый и самый важный — семейство адресов Он указывает используе- мый в настоящее время протокол и ограничивает применение второго и третьего параметров Например, семейство адресов ATM (AF_ATM) позволя- ет использовать только простые сокеты (SOCKJZAW) Аналогично, выбор се- мейства адресов и типа сокета ограничивает выбор протокола
    Впрочем, можно передать в параметре protocol значение О В этом случае истема выбирает поставщика транспорта, исходя из других двух парамет- ров — of и type Перечисляя записи каталога для протоколов, проверьте зна- чение поля dwProviderFlags из структуры WSAPROTOCOLJNFO Если оно рав- но PFL_ MATCHES'_PROTOCOL_ZERO — это стандартный транспорт, применя- емый, если в параметре протокола socket или WSASocket передано значение О
    еречислив все протоколы с помощью WSAEnumProtocols, передайте струк-
    РУ WSAPROTOCOLJNFO в функцию WSASocket как параметр ipProtocolInfo

    118 ЧАСТЬ II Интерфейс прикладного программирования Winsock
    Затем укажите константу FROMPROTOCOLJNFO во всех трех параметрах (а/,
    type и protocol) — для них будут использоваться значения из переданной структуры WSAPROTOCOL_INFO Так указывается определенная запись про- токола
    Теперь рассмотрим два последних флага из WSASocket Параметр группы всегда равен 0, так как ни одна из версий Winsock не поддерживает группы сокетов В параметре dwFlags указывают один или несколько следующих флагов
    WSA_FLAG_OVERLAPPED,
    Ш WSA_FLAG_MULTIPOINT_C_ROOT,
    Щ WSA_FLAG_MULT1POINT_C_LEAF,
    Ш WSA_FLAG_MULTIPOINT_D_ROOT,
    Ш WSA_FLAG_MULTIPOINT_D_LEAF
    Первый флаг — WSA_FLAG_OVER1APPED, указывает, что данный сокет до- пускает перекрытый ввод-вывод — это один из механизмов связи, предус- мотренных в Winsock (см главу 8) Если вы создаете сокет функцией socket,
    флаг WSA_FLAG_OVERLAPPED задан по умолчанию В общем, рекомендуется всегда задавать этот флаг при использовании WSASocket Последние четыре флага относятся к сокетам многоадресного вещания
    Простые сокеты
    При создании сокета функцией WSASocket вы можете передать вызову струк- туру WSAPROTOCOLJNFO, чтобы определить тип сокета, который хотите создать Впрочем, вы можете создавать типы сокетов, для которых нет запи- си в каталоге поставщиков транспорта Лучшим пример тому — простые
    сокеты (raw socket) под протоколом IP Это одна из форм связи, позволяю- щая инкапсулировать другие протоколы, например Internet Control Message
    Protocol (ICMP) в пакеты UDP Протокол ICMP доставляет управляющие и информационные сообщения, а также уведомления об ошибках между узла- ми в Интернете Поскольку ICMP не предусматривает средств доставки дан- ных, он работает не на том же уровне, что и протоколы UDP или TCP, а от- носится к уровню протокола IP Подробнее о простых сокетах — в главе 13
    Информация о платформах
    Windows 95 изначально поддерживает спецификацию Winsock 1 1 Корпора- ция Microsoft предоставила возможность бесплатно загружать обновления для
    Winsock 2 по адресу http //wwwmicrosoftcom/windows95/downloads/ Кроме того, доступен комплект разработчика — Winsock 2 SDK, содержащий заголо- вочные файлы и библиотеки, необходимые для компиляции приложений
    Winsock 2 Платформы Windows 98, Windows NT 4 и Windows 2000 изначаль- но поддерживают Winsock 2 Windows СЕ поддерживает только Winsock 1 1
    Поставщики транспорта поддерживаются с рядом ограничений Windows
    СЕ поддерживает только протоколы TCP/IP и Infrared Sockets (инфракрасные сокеты) В Windows 95 и Windows 98 поставщики транспорта NetBIOS (транс-

    Г Л А В А 5 Сетевые протоколы i119
    порты с семейством адресов AF NETBIOS) недоступны из Winsock При вы- зове WSAEnumProtocols ни один из поставщиков транспорта NetBIOS не бу- дет перечислен, даже если установлен на компьютере Впрочем, обратиться к
    NetBIOS можно через «родной» интерфейс NetBIOS (см главу 1) Упомяну- тые поставщики RSVP (предоставляет функции QoS) и ATM изначально под- держиваются в Windows 98 и Windows 2000
    Winsock и модель 0SI
    Теперь обсудим, как некоторые из понятий, описанных в этой главе, отно- сятся к модели OSI (рис 1-1) Поставщики транспорта из каталога Winsock,
    перечисленные WSAEnumProtocols, работают на транспортном уровне моде- ли OSI, то есть каждый из них обеспечивает обмен данными Впрочем, все они относятся к какому-то протоколу, а сетевой протокол работает на сете- вом уровне, поскольку обусловливает способ адресации каждого узла в сети
    Например, UDP и TCP — это транспорты, хотя оба относятся к протоколу IP
    Интерфейс Winsock расположен между сеансовым и транспортным уров- нями Winsock позволяет открывать и закрывать сеанс связи и управлять им для любого данного транспорта Под управлением Windows три верхних уровня прикладной, представительский и сеансовый, — в основном относят- ся к вашему приложению Winsock Другими словами, приложение Winsock управляет всеми аспектами сеанса связи и при необходимости форматиру- ет данные согласно целям программы
    Выбор соответствующего протокола
    При разработке сетевого приложения вы можете выбрать базовый протокол из числа имеющихся Если приложению необходимо осуществлять связь по определенному протоколу, выбор не богат Однако разрабатывая приложе- ние «с нуля», лучше выбрать TCP/IP, поскольку этот протокол распространен и широко применяется в продуктах Microsoft AppleTalk, NetBIOS и IPX/SPX
    Microsoft поставляет для совместимости с другими операционными системами и существующими приложениями Например, вместе с Windows 95 по умолча- нию устанавливаются протоколы NetBEUI и IPX/SPX
    По мере роста популярности Интернета большинство организаций все шире используют TCP/IP Это также основной протокол Windows 2000 В
    связи с этим NetBIOS будет применяться все реже Учтите и активную под- держку Microsoft-реализации TCP/IP ошибки в нем исправляются значитель- но чаще и быстрее, чем в других протоколах
    Таким образом, TCP/IP — это стратегический протокол для сетевых при- ложений Помимо этого Microsoft активно поддерживает сети ATM Если вы можете позволить себе разрабатывать приложение, функционирующее ис- ключительно в сетях ATM, возьмите за основу ATM-функции из Wmsock.
    Пользователям TCP/IP следует иметь в виду, что сети ATM можно сконфигу- рировать для эмуляции TCP/IP, и этот механизм работает довольно хорошо,
    стественно,
    3
    Д
    е сь мы привели далеко не все факторы, учитываемые при
    Разработке сетевого приложения

    120 ЧАСТЬ II Интерфейс прикладного программирования Winsock \
    Резюме
    В этой главе мы обсудили основные характеристики, которые обязательно нужно учитывать при выборе базово1 о сетевого транспорта для проектиру- емого приложения Мы рассмотрели, как программным путем получить спи- сок установленных в системе поставщиков транспорта и информацию об определенном свойстве протокола И наконец, дали рекомедации как со- здать сокет для любого сетевого транспорта с помощью параметров функ- ции WSASocket или socket, а также опрашивать запись каталога транспортов функцией WSAEnumProtocols и передавать структуру WSAPROTOCOLJNFO
    функции WSASocket
    В следующей главе мы расскажем о способах адресации для всех широ- ко распространенных протоколов

    Г Л А В А
    Семейства адресов и разрешение имен
    Для связи средствами Winsock важны механизмы адресации рабочих стан- ций в конкретных протоколах В этой главе рассматриваются протоколы,
    поддерживаемые Winsock, а также порядок разрешения адресов разных се- мейств каждым протоколом В Winsock 2 реализовано несколько новых не- зависимых от протокола функций, которые можно использовать с сокета- ми любых семейств адресов Впрочем, в большинстве случаев у каждого се- мейства свой механизм разрешения адресов с помощью функции либо че- рез параметр, переданный функции getsockopt
    Материал этой главы содержит лишь основные понятия, рассказывает о фор- мировании структуры адресов для каждого семейства протоколов В главе 10
    рассматриваются функции регистрации и разрешения имен, оповещающие о службе данного семейства протоколов (это не совсем то же, что разрешение имени) Там же вы найдете дополнительную информацию о различиях между прямым и обычным разрешением имен и оповещением о службе
    Для каждого семейства имен мы рассмотрим основы адресации компью- тера в сети Затем покажем, как создать сокет для каждого семейства Кроме этого, будет описана специфика каждого протокола в методике разрешения имен
    Протркол IP
    Internet Protocol (IP) широко используется в Интернете, поддерживается большинством ОС и применяется как в локальных (local area networks, LAN),
    так и в глобальных сетях (wide area networks, WAN) IP не требует установ- ления соединения и не гарантирует доставку данных Поэтому для переда- чи данных поверх IP используются два протокола более высокого уровня
    TCP и UDP
    Протокол TCP
    ransrmssion Control Protocol (TCP) реализует связь с установлением соеди- е
    ния, обеспечивает надежную безошибочную передачу данных между дву- мя компьютерами Когда приложения связываются по TCP, осуществляется
    Ртуальное соединение исходного компьютера с целевым, после чего меж-
    У ними возможен двунаправленный обмен данными

    122
    ЧАСТЬ II Интерфейс прикладного программирования Winsock
    Протокол UDP
    Связь без установления соединения выполняется при помощи User Datagram
    Protocol (UDP). He гарантируя надежности, UDP может осуществлять пере- дачу данных множеству адресатов и принимать данные от множества источ- ников. Например, данные, отправляемые клиентом на сервер, передаются немедленно, независимо от того, готов ли сервер к приему. При получении данных от клиента, сервер не подтверждает их прием. Данные передаются в виде дейтаграмм.
    И TCP, и UDP передают данные по IP, поэтому обычно говорят об исполь- зовании TCP/IP или UDP/IP. В Winsock для IP-соединений предусмотрено семейство адресов AFJNET, определенное в файлах Winsock.h и Winsock2.h.
    Адресация
    При использовании IP компьютерам назначается IP-адрес, состоящий из
    32 бит, официально называемый IP-адресом версии 4 (IPv4). Для взаимодей- ствия с сервером по TCP или UDP клиент должен указать IP-адрес сервера и номер порта службы. Чтобы прослушивать входящие запросы клиента, сер- вер также должен указать IP-адрес и номер порта. В Winsock IP-адрес и порт службы задают в структуре SOCKADDRJN-.
    struct sockaddr_in
    {
    short sin_family;
    u_short sin_port;
    struct in_addr sin_addr;
    char sin_zero[8];
    Поле sinjamily должно быть равно AFJNET: этим Winsock сообщают об использовании семейства адресов IP.
    IP версии 6
    IP версии б — обновленная спецификация, позволяющая использовать большее адресное пространство. Оно понадобится в недалеком буду- щем, когда возможности IP4 будут исчерпаны. Множество заголовков файлов Winsock содержит условное описание структур IPv6, однако ни одна из 32-битных платформ, включая Windows 2000, не обеспечивает работу сетевого стека IPv6. Исследователи из Microsoft Research предста- вили экспериментальный стек IPv6 по адресу http://research.microsoft.com/
    msripv6/. Впрочем, он не поддерживается, а потому здесь мы не будем обсуждать особенности версии 6.
    Поле sin_port задает, какой коммуникационный порт TCP или UDP будет использован для идентификации службы сервера. Приложения должны быть очень внимательны при выборе порта, поскольку некоторые доступные пор- ты зарезервированы для использования популярными службами: такими, как
    File Transfer Protocol (FTP) и Hypertext Transfer Protocol (HTTP). Эти порты

    Г Л А В А 6 Семейства адресов и разрешение имен il23
    обслуживаются и распределяются центром Internet Assigned Numbers Authority
    (IANA), ИХ описание см. в RFC 1700. По сути, номера портов делят на три ка- тегории: стандартные, зарегистрированные и динамические и (или) частные порты. Диапазоны портов:
    щ 0-Ю23 — управляются IANA и зарезервированы для стандартных служб;
    щ 1024-49151 — зарегистрированы IANA и могут использоваться процес- сами и программами;
    — являются динамическими и (или) частными.
    Во избежание накладок с портами, уже занятыми системой или другим при- ложением, ваша программа должна выбирать зарегистрированные порты в диапазоне 1024-49151- Порты 49152-65535 также можно задействовать сво- бодно — с ними не связаны никакие стандартные службы. Если при использо- вании API-функции bind ваше приложение попытается выбрать порт, уже заня- тый другим приложением на узле, то система вернет ошибку WSAEADDRINUSE.
    Подробнее о процедуре привязки к порту в Winsock — в главе 7.
    Поле sin_addr структуры SOCKADDRJN хранит IP-адрес в 4-байтном виде с типом unsigned long int. В зависимости от того, как это поле использова- но, оно может представлять и локальный, и удаленный IP-адрес. IP-адреса обычно задают в точечной нотации: a.b.c.d. Здесь каждая буква представляет число для каждого байта и задается слева направо (все четыре байта с типом unsigned long int). И наконец, поле sinjzero играет роль простого заполни- теля, чтобы структура SOCKADDRJN по размеру равнялась структуре
    SOCKADDR.
    Полезная вспомогательная функция inet_addr преобразует IP-адрес из точечной нотации в 32-битное длинное целое без знака:
    unsigned long inet_addr(
    const char FAR *cp
    );
    Поле ср является строкой, заканчивающейся нулевым символом, здесь задается IP-адрес в точечной нотации. Заметьте, что эта функция в качестве результата возвращает IP-адрес, представленный 32-битным числом с сете- вым порядком следования байт (network-byte order). Краткое описание это- го порядка см. в разделе «Порядок байт».
    Специальные адреса
    В некоторых ситуациях на поведение сокета влияют два специальных 1Р-ад-
    Реса. Специальный адрес INADDR_ANY позволяет серверному приложению слушать клиента через любой сетевой интерфейс на несущем компьютере.
    бычно приложения сервера используют этот адрес, чтобы привязать сокет к локальному интерфейсу для прослушивания соединений. Если на компь- тере несколько сетевых адаптеров, то этот адрес позволит отдельному при-
    °жению получать отклики от нескольких интерфейсов.
    Второй специальный адрес — INADDR BROADCAST, позволяет широкове-
    Щательно рассылать UDP-дейтаграммы по IP-сети. Для его использования

    1 24 ЧАСТЬ II Интерфейс прикладного программирования Winsock необходимо в приложении задать параметр сокета SO BROADCAST (см так- же главу 9)
    Порядок байт
    Разные процессоры в зависимости от конструкции представляют числа в одном из двух порядков байт big-endian или little-endian Например, процес- соры Intel х8б представляют многобайтные числа, следуя от менее значимо- го к более значимому байту (little-endian) Если номер порта и IP-адрес хра- нятся в памяти компьютера как многобайтные числа, они представляются в
    системном порядке (host-byte-order) Впрочем, когда IP-адрес или номер порта задаются по сети, стандарты Интернета требуют, чтобы многобайтные значения представлялись от старшего байта к младшему (в порядке big- endian), что обычно называется сетевым порядком (network-byte order)
    Есть целый ряд функций для преобразования многобайтных чисел из системного порядка в сетевой и обратно Например, четыре следующих API- функции преобразуют числа из системного порядка в сетевой u_long htonl(u_long hostlong),
    int WSAHtonK
    SOCKET s,
    u_long hostlong,
    u_long FAR * lpnetlong u_short htons(u_short hostshort);
    int WSAHtons(
    SOCKET s,
    u_short hostshort,
    u_short FAR * lpnetshort
    );
    Параметры hostlong функций htonl и WSAHtonl — четырехбайтные числа с системным порядком следования байт Функция htonl возвращает число с сетевым порядком, a WSAHtonl — число с сетевым порядком через параметр
    lpnetlong Параметр hostshort функций htons и WSAHtons является двухбайтным числом с системным порядком Функция htons возвращает число, как двухбай- тное значение с сетевым порядком, тогда как функция WSAHtons возвраща- ет такое число через параметр lpnetshort
    Следующие четыре функции решают обратную задачу переставляют бай- ты из сетевого порядка в системный
    u_long ntohl(u_long netlong);
    int WSANtohl(
    SOCKET s,
    u_long netlong,
    u_long FAR • lphostlong

    Г Л А В А 6 Семейства адресов и разрешение имен i 125
    u_short ntohs(u_short netshort);
    mt WSANtohs(
    SOCKET s,
    u_short netshort,
    u_short FAR • lphostshort
    );
    А сейчас продемонстрируем, как создать структуру SOCKADDRJN при
    помощи уже описанных функций inet_addr и htons.
    SOCKADDR_IN InternetAddr,
    INT nPortld = 5150;
    InternetAddr.sin_family = AF_INET,
    // Преобразование адреса 136.149.3.29 из десятично-точечной нотации в
    // 4-байтное целое число и присвоение результата sm_addr
    InternetAddr.sin_addr s_addr = inet_addr("136.149.3 29'),
    // Переменная nPortld хранится в системном порядке. Преобразование
    1   ...   8   9   10   11   12   13   14   15   ...   50


    написать администратору сайта