Скачать 1.32 Mb.
|
ЛИТЕРАТУРА
Приложение 1 TCP/IP Программирование с использованием WinSock На сегодняшний день ни одна операционная система не обходится без поддержки протокола TCP/IP, Windows не является исключением. Наиболее широко для программирования TCP/IP использовался прикладной программный интерфейс - Berkeley библиотека сокетов. Berkeley сокеты использовались повсюду в Internet для реализации приложений TCP/IP. Было естественно, что, когда пришло время, Microsoft выбрала этот API для TCP/IP под Windows. Использование Berkeley сокетов не ограничено программированием TCP/IP. Berkeley сокеты представляют межзадачный механизм связи, который может использовать TCP/IP или другими сетевыми протоколами для фактической передачи данных. Однако текущая WinSock реализация ограничивает использование интерфейса Berkeley сокетов только TCP/IP. ^ Интерфейс Berkeley сокетов может использоваться для связи с использованием обоих, и ориентированного на соединение протокола (TCP) и протокола без установления соединения (UDP). Модель программирования - клиент-серверная модель; серверы ожидают входящие запросы, в то время как клиенты инициализируют сеансы. Имеются некоторые различия реализации между WinSock и UNIX версией Berkeley сокетов. Из них, возможно наиболее значительным является тот факт, что описатели сокетов и файловые описатели не могут быть при использовании взаимозаменяемы. Это приводит к известному эффекту при перенесении приложений, которые предполагают эту эквивалентность. Другое различие в том, что WinSock библиотека требует инициализации. Приложения, которые намереваются использовать функции WinSock, должны сначала вызвать функцию WSAStartup(); когда работа с WinSock библиотекой закончена, они должны вызвать функцию WSACleanup() для надежного завершения. WinSock API также включает несколько специфических функций WinSock для использования асинхронного ввода - вывода на сокетах. Это помогает в разработке чувствительных GUI приложений WinSock . ^ Динамическая библиотека wsock32.dll реализует механизм сокетов 1.1. Для использования соответствующих функций необходимо подключать заголовочный файл winsock.h WinSock библиотека инициализируется вызовом функции WSAStartup() . Приложение, вызывающее эту функцию указывает в качестве второго параметра указатель на структуру WSADATA, которая будет содержать информацию об инициализации. int WSAStartup(WORD wVersionRequired, WSADATA * WSAData); В время вызова WSAStartup() приложение и WinSock библиотека согласовывают номер версии. Приложение указывает требуемый номер версии в качестве первого параметра. Например, 0x0101 (1.1). Запрос инициализации терпит неудачу, если не имеется никакого перекрытия между номером версии, поддерживаемым приложением и номером версии, поддерживаемым WinSock библиотекой. Если происходит ошибка, WSAStartup() возвращает значение отличное от нуля. Приложения могут восстановить расширенную информацию об ошибке через вызов функции WSAGetLastError(). При успешной инициализации в структуре типа WSADATA будут содержаться следующие полезные сведения: typedef struct WSAData { WORD wVersion; WORD wHighVersion; char szDescription[WSADESCRIPTION_LEN+1]; char szSystemStatus[WSASYS_STATUS_LEN+1]; unsigned short iMaxSockets; unsigned short iMaxUdpDg; char FAR * lpVendorInfo; } WSADATA; wVersion – номер версии, которая должна использоваться, wHighVersion – максимальный номер версии, поддерживаемый данной библиотекой, szDescription – описание реализации WinSock, szSystemStatus – операционная система, iMaxSockets –максимальное число сокетов, доступных процессу, iMaxUdpDg – максимально допустимый размер дейтаграмм, Создание и использование сокетов Сокет – это абстрактный объект для обозначения одного из концов сетевого соединения. Он предназначен для создания механизма обмена данными. Socket создается вызовом функции socket() . В параметрах этой функции указываются тип сетевого адреса (семейство адресов), тип сокета, и используемый для обмена данными через него протокол. SOCKET socket (int af, int type, int protocol); Например, вызов функции socket (AF_INET, SOCK_STREAM, IPPROTO_TCP) создает сокет потока, использующий протокол ТСР. socket (AF_INET, SOCK_^ , IPPROTO_UDP) создает сокет дейтаграмм, использующий протокол UDP. Использование в качестве первого параметра AF_INET означает, что с этим сокетом будут использоваться адреса Internet. Если третий параметр сделать равным 0, протокол будет выбран автоматически в зависимости от семейства адресов и типов сокета для выбора протокола рекомендуется именно этот способ. Если функция socket() выполняется успешно, она возвращает дескриптор нового сокета. Если же ее работа завершается аварийно, возвращает значение 0 (INVALID_SOCKET). Для получения более подробной информации об ошибке следует вызвать функцию WSAGetLastError(). Закрытие сокета Для завершения работы сокета необходимо закрыть его с помощью функции int closesocket (SOCKET s); В функцию передается дескриптор сокета. В большинстве случаев сначала необходимо прекратить работу, а потом закрыть гнездо. Для этого используйте функцию shutdown(). Функция shutdown() int shutdown (SOCKET s, int how); Эта функция сообщает гнезду о необходимости прекратить отправку или прием данных в зависимости от указанного метода прекращения работы (how);. Разрешенные методы перечислены в таблице. Методы прекращения работы гнезда
Функция bind() Недостаточно просто послать пакет на IP-адрес компьютера. Для того, чтобы система поняла, какому процессу этот пакет адресован, необходимо использовать номер порта. Для привязки сокета приложение может использовать любой номер порта от 1 до 65535, хотя этот диапазон обычно подразделяется на поддиапазоны: Порт 0 Не используется. Если передать 0 в качестве номера порта, то будет автоматически выбран неиспользуемый порт с номером между 1024 и 5000. Порты 1-255 Зарезервированы для сетевых служб: FTP, telnet, finger и т. д. Порты 256-1023 Зарезервированы для других служб общего назначения, например функций маршрутизации. Порты 1024-4999 Служат для портов клиентов. Обычно сокеты приложений-клиентов используют номера портов именно из этого диапазона. Порты 5000-65535 Используются для определяемых пользователем портов приложений-серверов. Если клиенту необходимо знать номер порта заранее, то для него должен использоваться номер из этого диапазона. Чтобы связать socket с фактическим адресом хоста и номером порта, приложения обычно вызывают функцию bind(). int bind (SOCKET s, const struct sockaddr FAR *addr, int namelen); Первым параметром является дескриптор сокета (который возвращен функцией socket() ). Второй параметр является указателем на структуру, описывающую адрес. Третий параметр – размер этой структуры. Данная структура определена следующим образом: struct sockaddr { u_short sa_family; /* address family */ char sa_data[14]; /* up to 14 bytes of direct address */ }; Поле sa_family определяет тип адреса. Для internet адресов это значение установлено в AF_INET. sa_data содержит адрес. Приложения могут легко обращаться к различным компонентам адреса через структуру sockaddr_in (вместо использования sockaddr). Определение этой структуры следующее: struct sockaddr_in { short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; }; Поле sin_port - 16-разрядный номер порта, который будет ассоциирован с данным сокетом. sin_addr - 32-разрядный IP адрес. sin_zero – заглушка, используется для того, чтобы размеры структур sockaddr_in и sockaddr совпадали. Поле sin_addr определено как структура типа struct in_addr { union { struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b; struct { u_short s_w1,s_w2; } S_un_w; u_long S_addr; } S_un; Если установить S_addr = htonl(INADDR_ANY) , то будет использован IP-адрес по умолчанию для данного компьютера. |
![]() | Методические указания к выполнению курсовой работы «гребные электрические установки» по дисциплине «электрические системы и комплексы... | ![]() | Методические указания к выполнению курсовой работы по дисциплине «Разведка месторождений полезных ископаемых» (для студентов очной... |
![]() | ![]() | Методические указания к лабораторным работам по курсу “Архитектура компьютеров предназначены для студентов специальностей «Системное... | |
![]() | Все цитаты, цифровой, фактический материал и библиографические сведенья проверены, запись единиц соответствует стандартам | ![]() | Методические указания к выполнению курсовой работы по дисциплине «Вычислительный практикум» для студентов заочной формы обучения... |
![]() | Бобрушева В. В. Методические указания к выполнению курсовой работы по дисциплине «Основы маркетинга» для студентов 2 курса дневной... | ![]() | Компьютерная инженерия” (для студентов дневной и заочной формы обучения специальности 091501 “Компьютерные системы и сети”, 091502... |
![]() | Методические указания к выполнению курсовой работы по дисциплине «Техническая термодинамика»/ Составители | ![]() | Методические указания к выполнению контрольной работы (ргр) по дисциплине «Объектно-ориентированное программирование» (для студентов... |