назначение программных интерфейсов сокетов windows и netbios

Назначение программных интерфейсов сокетов windows и netbios

Набор многоуровневых протоколов, или как называют стек TCP/IP (табл. 2.1), предназначен для использования в различных вариантах сетевого окружения. Стек TCP/IP с точки зрения системной архитектуры соответствует эталонной модели OSI (Open Systems Interconnection – взаимодействие открытых систем) и позволяет обмениваться данными по сети приложениям и службам, работающим практически на любой платформе, включая Unix, Windows, Macintosh и другие.

Таблица 2.1. Семейство протоколов TCP/IP

Название протокола

Описание протокола

Сетевой программный интерфейс

Связь с приложениями ОС Windows

Интерфейс транспортного драйвера (Transport Driver Interface) позволяет создавать компоненты сеансового уровня.

Протокол управления передачей (Transmission Control Protocol)

Протокол пользовательских дейтаграмм (User Datagram Protocol)

Протокол разрешения адресов (Address Resolution Protocol)

Протокол обратного разрешения адресов (Reverse Address Resolution Protocol)

Протокол Internet(Internet Protocol)

Протокол управляющих сообщений Internet (Internet Control Message Protocol)

Протокол управления группами Интернета (Internet Group Management Protocol),

Интерфейс взаимодействия между драйверами транспортных протоколов

Протокол пересылки файлов (File Transfer Protocol)

Простой протокол пересылки файлов (Trivial File Transfer Protocol)

Реализация TCP/IP фирмы Microsoft соответствует четырехуровневой модели вместо семиуровневой модели, как показано на рис. 2.2. Модель TCP/IP включает большее число функций на один уровень, что приводит к уменьшению числа уровней. В модели используются следующие уровни:

— уровень Приложения модели TCP/IP соответствует уровням Приложения, Представления и Сеанса модели OSI;

— уровень Транспорта модели TCP/IP соответствует аналогичному уровню Транспорта модели OSI;

назначение программных интерфейсов сокетов windows и netbios. image001. назначение программных интерфейсов сокетов windows и netbios фото. назначение программных интерфейсов сокетов windows и netbios-image001. картинка назначение программных интерфейсов сокетов windows и netbios. картинка image001. Набор многоуровневых протоколов, или как называют стек TCP/IP (табл. 2.1), предназначен для использования в различных вариантах сетевого окружения. Стек TCP/IP с точки зрения системной архитектуры соответствует эталонной модели OSI (Open Systems Interconnection – взаимодействие открытых систем) и позволяет обмениваться данными по сети приложениям и службам, работающим практически на любой платформе, включая Unix, Windows, Macintosh и другие.

Рис. 2.2. Соответствие семиуровневой модели OSI и четырехуровневой модели TCP/IP

— межсетевой уровень модели TCP/IP выполняет те же функции, что и уровень Сети модели OSI;

— уровень сетевого интерфейса модели TCP/IP соответствует Канальному и Физическому уровням модели OSI.

Через уровень Приложения модели TCP/IP приложения и службы получают доступ к сети. Доступ к протоколам TCP/IP осуществляется посредством двух программных интерфейсов (API – Application Programming Interface):

Интерфейс сокетов Windows, или как его называют WinSock, является сетевым программным интерфейсом, предназначенным для облегчения взаимодействия между различными TCP/IP – приложениями и семействами протоколов.

Интерфейс NetBIOS используется для связи между процессами (IPC – Interposes Communications) служб и приложений ОС Windows. NetBIOS выполняет три основных функции: определение имен NetBIOS; служба дейтаграмм NetBIOS; служба сеанса NetBIOS.

Уровень транспорта TCP/IP отвечает за установления и поддержания соединения между двумя узлами. Основные функции уровня:

— подтверждение получения информации;

— управление потоком данных;

— упорядочение и ретрансляция пакетов.

В зависимости от типа службы могут быть использованы два протокола:

— TCP (Transmission Control Protocol – протокол управления передачей);

— UDP (User Datagram Protocol – пользовательский протокол дейтаграмм).

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

Протокол управления передачей (TCP)

Протокол управления передачей данных – TCP (Transmission Control Protocol) – обеспечивает надежную передачу сообщений между удаленными прикладными процессами за счет образования виртуальных соединений [6]. Появился в начальный период создания сетей, когда глобальные сети не отличались особой надежностью.

Надежность протокола TCP заключается в следующем:

– он диагностирует ошибки,

– при необходимости посылает данные повторно,

– если не может самостоятельно исправить ошибку, сообщает о ней на другие уровни.

Перед отправкой сегментов информации вниз по модели отправляющий протокол TCP контактирует с принимающим протоколом TCP с целью установления связи. В результате создается виртуальный канал. Такой тип коммуникации называется ориентированным на соединение.

Установление соединения происходит в три шага:

1. Клиент, запрашивающий соединение, отправляет серверу пакет, указывающий номер порта, который клиент желает использовать, а также код (определенное число) ISN (Initial Sequence number).

2. Сервер отвечает пакетом, содержащий ISN сервера, а также ISN клиента, увеличенный на 1.

3. Клиент должен подтвердить установление соединения, вернув ISN сервера, увеличенный на 1.

Принцип работы TCP:

— берет из приложения большие блоки информации, разбивает их на сегменты,

— нумерует и упорядочивает каждый сегмент так, чтобы протокол TCP на принимающей стороне мог правильно соединить все сегменты в исходный большой блок;

— согласовывает с протоколом принимающей стороны количество информации, которое должно быть отправлено до получения подтверждения от принимающего TCP;

— после отправки сегментов TCP ждет подтверждения от целевого TCP о получении каждого из них;

— заново отправляет те сегменты, получение которых не было подтверждено.

Трехступенчатое открытие соединения устанавливает номер порта, а также ISN клиента и сервера. Каждый, отправляемый TCP-пакет содержит номера TCP-портов отправителя и получателя, номер фрагмента для сообщений, разбитых на меньшие части, а также контрольную сумму, позволяющую убедиться, что при передаче не произошло ошибок. Протокол TCP отвечает за надежную передачу данных от одного узла сети к другому. Он создает сеанс с установлением соединения, иначе говоря, виртуальный канал между машинами.

Пользовательский протокол дейтаграмм (UDP)

Протокол UDP предназначен для отправки небольших объемов данных (дейтаграмм) без установки соединения и используется приложениями, которые не нуждаются в подтверждении адресатом их получения [6]. UDP считается более простым протоколом, так как не загромождает сеть служебной информацией и выполняет не все функции TCP. Однако он успешно справляется с передачей информации, не требующей гарантированной доставки, и при этом использует намного меньше сетевых ресурсов. UDP не создает виртуальных каналов и не контактирует с целевым устройством перед отправкой информации. Поэтому он считается протоколом без постоянного соединения, или не ориентированным на соединение [3].

Принцип работы UDP:

— получает с верхних уровней блоки информации, разбивает их на сегменты;

— нумерует каждый из сегментов, чтобы все сегменты можно было воссоединить в требуемый блок в пункте назначения, но не упорядочивает сегменты и не заботится о том, в каком порядке они поступят в место назначения,

— отправляет сегменты и «забывает» о них;

— не ждет подтверждений о получении и даже не допускает таких подтверждений и потому считается ненадежным протоколом. Но это не значит, что UDP неэффективен – просто он не относится к надежным протоколам.

UDP также использует номера портов для определения конкретного процесса по указанному IP-адресу. Однако UDP-порты отличаются от TCP-портов и, следовательно, могут использовать те же номера портов, что и TCP, без конфликта между службами.

Межсетевой уровень отвечает за маршрутизацию данных внутри сети и между различными сетями. На этом уровне работают маршрутизаторы, которые зависят от используемого протокола и используются для отправки пакетов из одной сети (или ее сегмента) в другую (или другой сегмент сети). В стеке TCP/IP на этом уровне используется протокол IP.

Протокол Интернета IP

Протокол IP обеспечивает обмен дейтаграммами между узлами сети и является протоколом, не устанавливающим соединения и использующим дейтаграммы для отправки данных из одной сети в другую. Данный протокол не ожидает получение подтверждения (ASK, Acknowledgment) отправленных пакетов от узла адресата. Подтверждения, а также повторные отправки пакетов осуществляется протоколами и процессами, работающими на верхних уровнях модели.

К его функциям относится фрагментация дейтаграмм и межсетевая адресация. Протокол IP предоставляет управляющую информацию для сборки фрагментированных дейтаграмм. Главной функцией протокола является межсетевая и глобальная адресация. В зависимости от размера сети, по которой будет маршрутизироваться дейтаграмма или пакет, применяется одна из трех схем адресации.

Адресация в IP-сетях

Каждый компьютер в сетях TCP/IP имеет адреса трех уровней: физический (MAC-адрес), сетевой (IP-адрес) и символьный (DNS-имя) [3].

Сетевой, или IP-адрес, состоящий из 4 байт, например, 109.26.17.100. Этот адрес используется на сетевом уровне. Он назначается администратором во время конфигурирования компьютеров и маршрутизаторов. IP-адрес состоит из двух частей: номера сети и номера узла. Номер сети может быть выбран администратором произвольно, либо назначен по рекомендации специального подразделения Internet (Network Information Center, NIC), если сеть должна работать как составная часть Internet. Обычно провайдеры услуг Internet получают диапазоны адресов у подразделений NIC, а затем распределяют их между своими абонентами. Номер узла в протоколе IP назначается независимо от локального адреса узла. Деление IP-адреса на поле номера сети и номера узла гибкое, и граница между этими полями может устанавливаться произвольно. Узел может входить в несколько IP-сетей. В этом случае узел должен иметь несколько IP-адресов, по числу сетевых связей. IP-адрес характеризует не отдельный компьютер или маршрутизатор, а одно сетевое соединение.

При разработке протокола IP на основе размера сетей были выделены их классы (табл. 2.2):

· Класс а – немногочисленные сети с очень большим количеством узлов; номер сети занимает один байт, остальные 3 байта интерпретируются как номер узла в сети.

· Класс В – сети средних размеров; под адрес сети и под адрес узла отводится по 16 битов (по 2 байта).

· Класс С – сети с малым числом узлов; под адрес сети отводится 24 бита (3 байта), а под адрес узла – 8 битов (1 байт).

Источник

NetBIOS через TCP/IP

Службы NetBIOS

Далее не будет лишним посмотреть, какие же сетевые порты используются сервисами NetBIOS:

Подобная структура отражает требование RFC 1001, RFC 1002, регламентирующее наличие трех базовых сервисов, которые реализуют эмуляцию NetBIOS в системе Windows.

Реализация NetBIOS

назначение программных интерфейсов сокетов windows и netbios. netbios interaction. назначение программных интерфейсов сокетов windows и netbios фото. назначение программных интерфейсов сокетов windows и netbios-netbios interaction. картинка назначение программных интерфейсов сокетов windows и netbios. картинка netbios interaction. Набор многоуровневых протоколов, или как называют стек TCP/IP (табл. 2.1), предназначен для использования в различных вариантах сетевого окружения. Стек TCP/IP с точки зрения системной архитектуры соответствует эталонной модели OSI (Open Systems Interconnection – взаимодействие открытых систем) и позволяет обмениваться данными по сети приложениям и службам, работающим практически на любой платформе, включая Unix, Windows, Macintosh и другие.

Принципы работы NetBIOS

Собственно, как же работает NetBIOS? Я попытаюсь дать, пока что, собственное объяснение принципов работы стандарта. Все мы понимаем, что для того, чтобы станции могли взаимодействовать по сети, они должны подчиняться определенным правилам, выполнять предписанные действия на различных этапах работы. Этими этапами являются: заявление о себе (регистрация), попытка взаимодействия (обнаружение имен, установление сеанса, управление сеансом), отключение себя (освобождение имени). Поэтому, все узлы, использующие NetBIOS через TCP/IP, применяют регистрацию, обнаружение и освобождение имен, а так же многие другие методы, предоставляемые стандартом. Давайте рассмотрим их детальнее:

Для того, чтобы лучше понять логику работы NetBIOS через TCP/IP, давайте немного отступим от основной линии рассуждений, и рассмотрим по-отдельности некоторые сущности стандарта.

Имя NetBIOS

Полный перечень типов общих ресурсов NetBIOS

Методы разрешения имени NetBIOS

Очевидно, что тут мы будем говорить о том, какими средствами NetBIOS удается найти соответствие имени и IP-адреса ресурса? Какие же методы определения имен доступны интерфейсу NetBIOS? Сразу обращу ваше внимание на то, что не все из перечисленных методов относятся непосредственно к стандарту NetBIOS. Я считаю, что к NetBIOS относятся только лишь: LMHOSTS, WINS, кеш имен NetBIOS, широковещательный запрос в подсети. Такие же понятия как HOSTS и DNS относятся уже к TCP/IP Direct Hosting. Но поскольку понятия «NetBIOS имя станции» и «имя хоста» довольно тесно взаимосвязаны в современных ОС Windows, то resolver (модуль, разрешающий имена) использует все доступные методы для нахождения соответствия, умело комбинируя разнородные методы определения имен.

Тип узла NetBIOS (NodeType)

Поскольку методы регистрации имен в сети у NetBIOS тоже не стояли на месте, и если изначально все сводилось, как мы уже упоминали, к широковещательным запросам, то со временем начали появляться и другие способы зарегистрировать имя (например, с использованием WINS-сервера). В связи с необходимостью разделять логику работы станций, было введено понятие NodeType (NBT-узел) для описания разницы в способах регистрации и распознавания имен. Проще говоря, разные типы узлов имеют свои обособленные алгоритмы разрешения имен в IP-адреса:

Источник

Стек TCP/IP: уровень Приложения, уровень транспорта

Через уровень Приложения модели TCP/IP приложения и службы получают доступ к сети. Доступ к протоколам TCP/IP осуществляется посредством двух программных интерфейсов API: сокеты Windows и NetBIOS.

Интерфейс сокетов Windows, или как его называют WinSock, является сетевым программным интерфейсом, предназначенным для облегчения взаимодействия между различными TCP/IP – приложениями и семействами протоколов.

ИнтерфейсNetBIOS используется для связи между процессами (IPC – Interposes Communications) служб и приложений ОС Windows. NetBIOS выполняет три основных функции:

— определение имен NetBIOS;

— служба дейтаграмм NetBIOS;

— служба сеанса NetBIOS.

Транспортный уровень TCP/IP отвечает за установление и поддержание соединения между двумя узлами. Основные функции уровня:

— подтверждение получения информации;

— управление потоком данных;

— упорядочение и ретрансляция пакетов.

В зависимости от типа службы могут быть использованы два протокола:

— TCP (Transmission Control Protocol – протокол управления передачей);

— UDP (User Datagram Protocol – пользовательский протокол дейтаграмм).

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

Протокол управления передачей, TCP отвечает за надежную передачу данных от одного узла сети к другому. Он создает сеанс с установлением соединения, иначе говоря, виртуальный канал между машинами. Установление соединения происходит в три шага.

1. Клиент, запрашивающий соединение, отправляет серверу пакет, указывающий номер порта, который клиент желает использовать, а также код (определенное число) ISN (Initial Sequence number).

2. Сервер отвечает пакетом, содержащий ISN сервера, а также ISN клиента, увеличенный на 1.

3. Клиент должен подтвердить установление соединения, вернув ISN сервера, увеличенный на 1.

Трехступенчатое открытие соединения устанавливает номер порта, а также ISN клиента и сервера. Каждый, отправляемый TCP-пакет содержит номера TCP-портов отправителя и получателя, номер фрагмента для сообщений, разбитых на меньшие части, а также контрольную сумму, позволяющую убедиться, что при передачи не произошло ошибок.

В отличие от TCP пользовательский протокол дейтаграмм, UDP не устанавливает соединения. Протокол UDP предназначен для отправки небольших объемов данных без установки соединения и используется приложениями, которые не нуждаются в подтверждении адресатом их получения. UDP также использует номера портов для определения конкретного процесса по указанному IP адресу. Однако UDP порты отличаются от TCP портов и, следовательно, могут использовать те же номера портов, что и TCP, без конфликта между службами.

Стек TCP/IP: межсетевой уровень, уровень сетевого интерфейса.

Межсетевой уровень отвечает за маршрутизацию данных внутри сети и между различными сетями. На этом уровне работают маршрутизаторы, которые зависят от используемого протокола и используются для отправки пакетов из одной сети (или ее сегмента) в другую (или другой сегмент сети). В стеке TCP/IP на этом уровне используется протокол IP.

Протокол Интернета, IP обеспечивает обмен дейтаграммами между узлами сети и является протоколом, не устанавливающим соединения и использующим дейтаграммы для отправки данных из одной сети в другую. Данный протокол не ожидает получение подтверждения (ASK, Acknowledgment) отправленных пакетов от узла адресата. Подтверждения, а также повторные отправки пакетов осуществляется протоколами и процессами, работающими на верхних уровнях модели.

К его функциям относится фрагментация дейтаграмм и межсетевая адресация. Протокол IP предоставляет управляющую информацию для сборки фрагментированных дейтаграмм. Главной функцией протокола является межсетевая и глобальная адресация. В зависимости от размера сети, по которой будет маршрутизироваться дейтаграмма или пакет, применяется одна из трех схем адресации.

Протокол IP действует на сетевом уровне модели OSI, поэтому IP-адреса называются сетевыми. Они предназначены для передачи сообщений в составных сетях, связывающих подсети, построенные на различных локальных или глобальных сетевых технологиях, например Ethernet или ATM. Однако для непосредственной передачи сообщения в рамках одной подсети вместо IP-адреса нужно использовать локальный (аппаратный) адрес технологии канального уровня, чаще всего МАС-адрес. При этом к IP-пакету добавляются заголовок и концевик кадра канального уровня, в заголовке указываются МАС-адреса источника и приемника кадра.

При формировании кадра канального уровня возникает проблема: каким образом по известному IP-адресу определить соответствующий МАС-адрес. Указанная проблема решается при помощи протокола ARP (Address Resolution Protocol, протокол разрешения адресов).

Протокол управления сообщениями Интернета (ICMP – Internet Control Message Protocol) используется IP и другими протоколами высокого уровня для отправки и получения отчетов о состоянии переданной информации. Этот протокол используется для контроля скорости передачи информации между двумя системами. Если маршрутизатор, соединяющий две системы, перегружен трафиком, он может отправить специальное сообщение ICMP – ошибку для уменьшения скорости отправления сообщений.

Узлы локальной сети используют протокол управления группами Интернета (IGMP – Internet Group Management Protocol), чтобы зарегистрировать себя в группе. Информация о группах содержится на маршрутизаторах локальной сети. Маршрутизаторы используют эту информацию для передачи групповых сообщений.

Групповое сообщение, как и широковещательное, используется для отправки данных сразу нескольким узлам.

NDIS(Network Device Interface Specification) – спецификация интерфейса сетевого устройства, программный интерфейс, обеспечивающий взаимодействие между драйверами транспортных протоколов и соответствующими драйверами сетевых интерфейсов. Позволяет использовать несколько протоколов, даже если установлена только одна сетевая карта.

Уровень сетевого интерфейса:

Этот уровень модели TCP/IP отвечает за распределение IP-дейтаграмм. Он работает с ARP для определения информации, которая должна быть помещена в заголовок каждого кадра. Затем на этом уровне создается кадр, подходящий для используемого типа сети, такого как Ethernet, Token Ring или ATM, затем IP-дейтаграмма помещается в область данных этого кадра, и он отправляется в сеть.

Дата добавления: 2018-02-15 ; просмотров: 1834 ; Мы поможем в написании вашей работы!

Источник

Глобальные сети компьютеров. Практическое введение в Internet, E-Mail, FTP, WWW и HTML, программирование для Windows Sockets

5 ИНТЕРФЕЙС WINDOWS SOCKETS

Интерфейс Windows Sockets предоставляет в ваше распоряжение удобные средства организации передачи данных с использованием датаграмм и каналов связи между узлами сети.

5.1. Сокеты, датаграммы и каналы связи

В локальных и глобальных сетях существует два принципиально разных способа передачи данных.

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

Для передачи данных с использованием любого из перечисленных выше способов каждое приложение должно создать объект, который называется сокетом.

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

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

5.2. Инициализация приложения и завершение его работы

В случае успеха функция WSAStartup возвращает нулевое значение. Если происходит ошибка, возвращается одно из следующих значений:

Ниже мы представили фрагмент исходного текста приложения SERVER, которое будет описано ниже, выполняющий инициализацию интерфейса Windows Sockets:

Определение структуры WSADATA и указателя на нее выглядят следующим образом:

Использованные выше поля szDescription и szSystemStatus после вызова функции WSAStartup содержат, соответственно, описание конкретной реализации интерфейса Windows Socket и текущее состояние этого интерфейса в виде текстовых строк.

Приложение может одновременно создавать несколько сокетов, например, для использования в разных подзадачах одного процесса. В поле iMaxSockets хранится максимальное количество сокетов, которое можно получить для одного процесса.

И, наконец, поле lpVendorInfo содержит указатель на дополнительную информацию, формат которой зависит от фирмы-изготовителя конкретной реализации системы Windows Sockets.

Эта функция может возвратить нулевое значение при успехе или значение SOCKET_ERROR в случае ошибки.

Для получения кода ошибки вы должны воспользоваться функцией с именем WSAGetLastError :

Функция WSAGetLastError позволяет определить код ошибки при неудачном завершении практически всех функций интерфейса Windows Sockets. Вы должны вызывать ее сразу вслед за функцией, завершившейся неудачно.

ЗначениеОписание
WSANOTINITIALISEDИнтерфейс Windows Sockets не был проинициализирован функцией WSAStartup
WSAENETDOWNСбой сетевого программного обеспечения
WSAEINPROGRESSВо время вызыва функции WSACleanup выполнялась одна из блокирующих функций интерфейса Windows Sockets

Некоторые функции интерфейса Windows Sockets способны блокировать работу приложения, так как они не возвращают управление до своего завершения. В операционных системах, использующих вытесняющую мультизадачность, к которым относятся Microsoft Windows 95 и Microsoft Windows NT, это не приводит к блокировке всей системы. Как вы увидите дальше, можно избежать использования блокирующих функций, так как для них в интерфейсе Windows Sockets существует замена.

5.3. Создание и инициализация сокета

После инициализации интерфейса Windows Sockets ваше приложение должно создать один или несколько сокетов, которые будут использованы для передачи данных.

Создание сокета

Параметры type и protocol определяют, сооветственно, тип сокета и протокол, который будет использован для данного сокета.

Можно указывать сокеты следующих двух типов:

Тип сокетаОписание
SOCK_STREAMСокет будет использован для передачи данных через канал связи с использованием протокола TCP
SOCK_DGRAMПередача данных будет выполняться без создания каналов связи через датаграммный протокол UDP

Что же касается параметра protocol, то вы можете указать для него нулевое значение.

Код ошибкиОписание
WSANOTINITIALISEDИнтерфейс Windows Sockets не был проинициализирован функцией WSAStartup
WSAENETDOWNСбой сетевого программного обеспечения
WSAEAFNOSUPPORTУказан неправильный тип адреса
WSAEINPROGRESSВыполняется блокирующая функция интерфейса Windows Sockets
WSAEMFILEИзрасходован весь запас свободных дескрипторов
WSAENOBUFSНет памяти для создания буфера
WSAEPROTONOSUPPORTУказан неправильный протокол
WSAEPROTOTYPEУказанный протокол несовместим с данным типом сокета
WSAESOCKTNOSUPPORTУказанный тип сокета несовместим с данным типом адреса

Ниже мы привели фрагмент кода, в котором создается сокет для передачи данных с использованием протокола TCP:

Удаление сокета

Для освобождения ресурсов приложение должно закрывать сокеты, которые ему больше не нужны, вызывая функцию closesocket :

Ниже мы перечислили коды ошибок для этой функции :

Код ошибкиОписание
WSANOTINITIALISEDПеред использованием функции closesocket необходимо вызвать функцию WSAStartup
WSAENETDOWNСбой в сети
WSAENOTSOCKУказанный в параметре дескриптор не является сокетом
WSAEINPROGRESSВыполняется блокирующая функция интерфейса Windows Sockets
WSAEINTRРабота функции была отменена при помощи функции WSACancelBlockingCall

Параметры сокета

Перед использованием вы должны задать параметры сокета.

Для работы с адресами в формате Internet используется другой вариант этой структуры, в котором детализируется формат поля sa_data:

Поле sin_port определяет номер порта, который будет использоваться для передачи данных.

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

Для выполнения преобразований из обычного формат в сетевой и обратно в интерфейсе Windows Sockets предусмотрен специальный набор функций. В частности, для заполнения поля sin_port нужно использовать функцию htons, выполняющую преобразование 16-разрядных данных из формата Intel в сетевой формат.

Ниже мы показали, как инициализируется поле sin_port в приложении SERVER, описанном далее:

Поле sin_addr этой структуры представляет собой структуру in_addr:

При инициализации сокета в этой структуре вы должны указать адрес IP, с которым будет работать данный сокет.

Если сокет будет работать с любым адресом (например, вы создаете сервер, который будет доступен из узлов с любым адресом), адрес для сокета можно указать следующим образом:

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

Если вам известен адрес в виде четырех десятичных чисел, разделенных точкой (именно так его вводит пользователь), то вы можете заполнить поле адреса при помощи функции inet_addr :

При ошибке эта функция возвращает значение NULL.

Искомый адрес находится в первом элемента списка h_addr _list[0], на который можно также ссылаться при помощи h_addr. Длина поля адреса находится в поле h_length.

Привязка адреса к сокету

Код ошибкиОписание
WSANOTINITIALISEDПеред использованием функции необходимо вызвать функцию WSAStartup
WSAENETDOWNСбой в сети
WSAEADDRINUSEУказанный адрес уже используется
WSAEFAULTЗначение параметра namelen меньше размера структуры sockaddr
WSAEINPROGRESSВыполняется блокирующая функция интерфейса Windows Sockets
WSAEAFNOSUPPORTЭтот протокол не может работать с указанным семейством адресов
WSAEINVALСокет уже привязан к адресу
WSAENOBUFSУстановлено слишком много соединений
WSAENOTSOCKУказанный в параметре дескриптор не является сокетом

Пример вызова функции bind показан ниже:

5.4. Создание канала связи

Сторона сервера

Рассмотрим процедуру создания канала связи со стороны сервера.

Прежде всего вы должны переключить сокет в режим приема для выполнения ожидания соединения с клиентом при помощи функции listen:

Через параметр sock функции необходимо передать дескриптор сокета, который будет использован для создания канала. Параметр backlog задает максимальный размер очереди для ожидания соединения (можно указывать значения от 1 до 5). Очередь содержит запросы на установку соединений для каждой пары значений (адрес IP, порт).

Ниже мы привели список возможных кодов ошибок для функции listen.

Код ошибкиОписание
WSANOTINITIALISEDПеред использованием функции необходимо вызвать функцию WSAStartup
WSAENETDOWNСбой в сети
WSAEADDRINUSEУказанный адрес уже используется
WSAEINPROGRESSВыполняется блокирующая функция интерфейса Windows Sockets
WSAEINVALСокет еще не был привязан к адресу или уже находится в подключенном состоянии
WSAEISCONNСокет уже находится в подключенном состоянии
WSAEMFILEНедостаточно дескрипторов файлов
WSAENOBUFSНет места для размещения буфера
WSAENOTSOCKУказанный в параметре дескриптор не является сокетом
WSAEOPNOTSUPPФункция listen не работает с сокетом указанного типа

Ниже мы привели пример вызов функции listen:

Далее необходимо выполнить ожидание соединения. Это можно выполнить двумя различными способами.

Первый способ заключается в циклическом вызове функции accept до тех пор, пока не будет установлено соединение. Затем можно будет приступать к обмену данными.

Функция accept имеет следующий прототип:

Через параметр sock необходимо указать дескриптор сокета, который находится в режиме приема для выполнения ожидания.

Код ошибкиОписание
WSANOTINITIALISEDПеред использованием функции необходимо вызвать функцию WSAStartup
WSAENETDOWNСбой в сети
WSAEFAULTЗначение параметра addrlen меньше размера структуры адреса
WSAEINTRРабота функции была отменена при помощи функции WSACancelBlockingCall
WSAEINPROGRESSВыполняется блокирующая функция интерфейса Windows Sockets
WSAEINVALПеред вызовом функции accept не была вызывана функция listen
WSAEMFILEНет доступных дескрипторов
WSAENOBUFSУстановлено слишком много соединений
WSAENOTSOCKУказанный в параметре дескриптор не является сокетом
WSAEOPNOTSUPPДанный тип сокета нельзя использовать при вызове функций, ориентированных на работу с каналом связи
WSAEWOULDBLOCKСокет отмечен как неблокирующий и в настоящее время нет каналов связи, которые нужно устанавливать

Обработчик этого сообщения может выглядеть, например, следующим образом:

Сторона клиента

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

Для установки соединения в приложении используется функция SetConnection:

Вначале с помощью функции socket эта функция создает сокет. Затем выполняется заполнение адресной информацией структуры dest_sin.

Адрес 127.0.0.1 является локальным. Вы можете использовать его для тестирования приложений, выполняющих обмен данными при помощи протокола TCP/IP, запуская сервер и клиент на одном и том же компьютере.

После заполнения структуры с адресной информацией функция connect создает канал связи с сервером.

5.5. Передача и прием данных

В нашем приложении CLIENT мы передаем данные серверу следующим образом:

Заметим, что функции recv и send возвращают количество, соответственно, принятых и переданных байт данных. Приложение, которое принимает данные, должно вызывать функцию recv в цикле до тех пор, пока не будут приняты все переданные данные. При этом на один вызов функции send может приходиться несколько вызовов функции recv.

Приведем список кодов ошибок, которые могут возникать при вызове команды send:

Код ошибкиОписание
WSANOTINITIALISEDПеред использованием функции необходимо вызвать функцию WSAStartup
WSAENETDOWNСбой в сети
WSAEACCESУказанный адрес является широковещательным ( broadcast ), однако перед вызовом функции не был установлен соответствующий флаг
WSAEINTRРабота функции была отменена при помощи функции WSACancelBlockingCall
WSAEINPROGRESSВыполняется блокирующая функция интерфейса Windows Sockets
WSAEFAULTПараметр buf указан неправильно (он не указывает на адресное пространство, принадлежащее приложению)
WSAENETRESETНеобходимо сбросить соединение
WSAENOBUFSВозникла блокировка буфера
WSAENOTCONNСокет не подсоединен
WSAENOTSOCKУказанный в параметре дескриптор не является сокетом
WSAESHUTDOWNСокет был закрыт функцией shutdown
WSAEWOULDBLOCKСокет отмечен как неблокирующий, но запрошенная операция приведет к блокировке
WSAEMSGSIZEБыл использован сокет типа SOCK_DGRAM (предназначенный для передачи датаграмм). При этом размер пакета данных превышает максимально допустимый для данной реализации интерфейса Windows Sockets
WSAEINVALСокет не был подключен функцией bind
WSAECONNABORTEDСбой из-за слишком большой задержки или по другой причине
WSAECONNRESETСброс соединения удаленным узлом

При выполнении функции recv могут возникать следующие ошибки:

Код ошибкиОписание
WSANOTINITIALISEDПеред использованием функции необходимо вызвать функцию WSAStartup
WSAENETDOWNСбой в сети
WSAENOTCONNСокет не подсоединен
WSAEINTRРабота функции была отменена при помощи функции WSACancelBlockingCall
WSAEINPROGRESSВыполняется блокирующая функция интерфейса Windows Sockets
WSAENOTSOCKУказанный в параметре дескриптор не является сокетом
WSAESHUTDOWNСокет был закрыт функцией shutdown
WSAEWOULDBLOCKСокет отмечен как неблокирующий, но запрошенная операция приведет к блокировке
WSAEMSGSIZEРазмер пакета данных превышает размер буфера, в результате чего принятый пакет был обрезан
WSAEINVALСокет не был подключен функцией bind
WSAECONNABORTEDСбой из-за слишком большой задержки или по другой причине
WSAECONNRESETСброс соединения удаленным узлом

Передача и прием данных в цикле может привести к блокировке работы приложения. Если это неприемлимо, следует воспользоваться асинхронным расширением интерфейса Windows Sockets.

Наше приложение SERVER демонстрирует асинхронный прием данных.

В зависимости от значения последнего параметра могут возникать разные коды ошибки, которые можно получить при помощи функции WSAGetLastError. Следующие ошибки могут возникнуть при любом значении параметра:

Код ошибкиОписание
WSANOTINITIALISEDПеред использованием функции необходимо вызвать функцию WSAStartup
WSAENETDOWNСбой в сети
WSAEINVALСокет не был подключен функцией bind
WSAEINPROGRESSВыполняется блокирующая функция интерфейса Windows Sockets

При использовании параметра FD_CONNECT возможно появление следующих ошибок:

Код ошибкиОписание
WSAEADDRINUSEУказанный адрес уже используется
WSAEADDRNOTAVAILУказанный адрес не доступен
WSAEAFNOSUPPORTДля данного сокета нельзя использовать указанное семейство адресов
WSAECONNREFUSEDПопытка установления канала связи была отвергнута
WSAEDESTADDRREQНеобходимо указать адрес получателя пакета
WSAEFAULTНеправильно указан параметр namelen
WSAEINVALСокет уже подключен к адресу
WSAEISCONNСокет уже подсоединен
WSAEMFILEБольше нет доступных дескрипторов
WSAENETUNREACHИз данного узла и в данное время невозможно получить доступ к сети
WSAENOBUFSНет места для размещения буфера
WSAENOTCONNСокет на подключен
WSAENOTSOCKУказан дескриптор файла, а не сокета
WSAETIMEDOUTПри попытке установления канала связи возникла задержка во времени

Если используется параметр FD_CLOSE, может возникнуть одна из следующих ошибок:

Код ошибкиОписание
WSAENETDOWNСбой в сети
WSAECONNRESETСброс соединения удаленным узлом
WSAECONNABORTEDСбой из-за слишком большой задержки или по другой причине

Обработчик сообщения WSA_NETEVENT должен выполнить анализ причины, по которой он был вызван, так как за один вызов функции WSAAsyncSelect можно задать несколько событий, вызывающих генерацию сообщения. Этот анализ проводится, например, следующим образом:

5.6. Приложение SERVER

В этом разделе мы представим вам исходные тексты приложения SERVER, которое выполняет прием сообщений от приложения CLIENT с использованием протокола гарантированной доставки TCP и канала связи. При необходимости вы сможете самостоятельно организовать передачу данных в обратном направлении.

Функция WinMain сохраняет идентификатор приложения и затем проверяет, не было ли это приложение уже запущено. При этом используется техника, описанная нами в 22 томе «Библиотеки системного программиста», который называется «Операционная система Windows 95 для программиста».

Далее выполняется обычная регистрация класса главного окна приложения, инициализируется библиотека орагнов управления общего назначения и создается главное окно приложения. После этого окно отображается на экране и запускается цикл обработки сообщений.

Единственное назначение обработчика сообщений WM_SIZE заключается в изменении размеров окна органа управления Statusbar при изменении размеров главного окна приложения.

Обработчик сообщения WM_COMMAND получает управление, когда пользователь выбирает одну из строк в меню File главного меню приложения. Если пользователь выберет строку Start server, будет вызвана функция ServerStart, назначение которой очевидно из ее названия. Аналогично, при выборе строки Stop server будет вызвана функция ServerStop. Если же из меню File выбрать строку Exit, будет уничтожено главное окно приложения.

Функция ServerStart создает сокет для работы с потоком данных и инициализирует его. При этом мы используем произвольно выбранный порт с номером 5000.

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

Функция ServerStop отменяет все извещения, поступающие в главное окно приложения при возникновении событий в сети, вызывая функцию WSAAsyncSelect с нулевым значением двух последних параметров:

Функция WndProc_OnWSAAccept обрабатывает сообщение WSA_ACCEPT, выполняя описанную нами ранее процедуру создания канала связи.

И, наконец, функция WndProc_OnWSANetEvent выполняет прием строки сообщения, полученной от клиента с отображением этой строки на экране в диалоговой панели.

5.7. Приложение CLIENT

После запуска этого приложения вы должны создать канал связи с приложением SERVER, выбрав из меню File строку Connect, после чего можно посылать сообщение Test message, выбирая из этого же меню строку Send Message.

Сервер, получив сообщение, отобразит его на экране в отдельной диалоговой панели.

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

Если вы будете проверять работу приложений SERVER и CLIENT на одном и том же компьютере, адрес сервера должен быть указан следующим образом:

Для того чтобы установить канал связи с компьютером по его имени, закройте символом комментария приведенную выше строку и уберите символ комментария со строки, расположенной ниже:

Разумеется, вы должны также изменить имя компьютера.

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

5.8. Приложение SERVERD

Такие известные вам из предыдущих приложений функции, как connect, listen и accept в приложениях UDP использовать не нужно.

Исходный текст приложения SERVERD приведен в листинге 5.7.

Листинг 5.7. Файл serverd/serverd.c

Приложение SERVERD во многом напоминает приложение SERVER, поэтому мы рассмотрим только отличия.

Первое отличие заключается в том, что при запуске сервера тип создаваемого сокета указывается как SOCK_DGRAM:

На этом инициализация сервера завершается.

Обработчик сообщения WSA_NETEVENT читает полученный пакет с помощью функции recv from:

В качестве предпоследнего параметра этой функции передается адрес структуры типа SOCKADDR _IN, куда функция записывает адрес узла, приславшего пакет. Последний параметр функции recv from должен содержать размер указанной структуры.

Ниже мы привели возможные коды ошибок для функции recv from.

Код ошибкиОписание
WSANOTINITIALISEDПеред использованием функции необходимо вызвать функцию WSAStartup
WSAENETDOWNСбой в сети
WSAEFAULTСлишком малое значение параметра, определяющего размер буфера для приема данных
WSAEINTRРабота функции была отменена при помощи функции WSACancelBlockingCall
WSAEINPROGRESSВыполняется блокирующая функция интерфейса Windows Sockets
WSAEINVALСокет не был подключен функцией bind
WSAENOTSOCKУказанный дескриптор не является дескриптором сокета
WSAESHUTDOWNСокет был закрыт функцией shutdown
WSAEWOULDBLOCKСокет отмечен как неблокирующий, но запрошенная операция приведет к блокировке
WSAEMSGSIZEРазмер датаграммы слишком большой, поэтому соответствующий блок данных не помещается в буфер. Принятый блок данных был обрезан
WSAECONNABORTEDСбой из-за слишком большой задержки или по другой причине
WSAECONNRESETСброс соединения удаленным узлом

Заметим, что при обмене данных с использованием протокола UDP на каждый вызов функции send to должен приходиться один вызов функции recv from. Если же вы передается данные через канал с использованием протокола TCP, на один вызов функции send может приходиться несколько вызовов функции recv.

5.9. Приложение CLIENTD

Листинг 5.8. Файл clientd/clientd.c

Функция SetConnection создает сокет типа SOCK_DGRAM, так как передача данных будет выполняться с использованием протокола UDP :

Затем функция SetConnection записывает адрес сервера в структуру dest_sin. Этот адрес потребуется для передачи сообщений серверу.

При использовании протокола UDP и если не создан канал между приложениями, для передачи данных следует использовать функцию send to:

В качестве предпоследнего параметра этой фукнции нужно передать адрес заполненной структуры, содержащей адрес узла, куда будет посылаться пакет данных. Через последний параметр функции send to необходимо передать размер указанной структуры.

Привдедем список возможных кодов ошибок для функции send to:

Код ошибкиОписание
WSANOTINITIALISEDПеред использованием функции необходимо вызвать функцию WSAStartup
WSAENETDOWNСбой в сети
WSAEACCESНе был установлен флаг широковещательного адреса
WSAEINTRРабота функции была отменена при помощи функции WSACancelBlockingCall
WSAEINPROGRESSВыполняется блокирующая функция интерфейса Windows Sockets
WSAEFAULTНеправильно указан адрес буфера, содержащего передаваемые данные
WSAENETRESETНеобходимо сбросить соединение
WSAENOBUFSПроизошло зацикливание буферов
WSAENOTSOCKУказанный дескриптор не является дескриптором сокета
WSAESHUTDOWNСокет был закрыт функцией shutdown
WSAEWOULDBLOCKСокет отмечен как неблокирующий, но запрошенная операция приведет к блокировке
WSAEMSGSIZEРазмер датаграммы больше, чем это допускается данной реализацией интерфейса Windows Sockets
WSAECONNABORTEDСбой из-за слишком большой задержки или по другой причине
WSAECONNRESETСброс соединения удаленным узлом
WSAEADDRNOTAVAILУказанный адрес недоступен
WSAEAFNOSUPPORTДанный тип сокета не может работать с указанным семейством адресов
WSAEDESTADDRREQНеобходимо указать адрес получателя датаграммы
WSAENETUNREACHВ данное время и из данного узла невозможно получить доступ к сети

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *