Программа Server Socket. Курсовая работа (т). Информационное обеспечение, программирование.

🛑 👉🏻👉🏻👉🏻 ИНФОРМАЦИЯ ДОСТУПНА ЗДЕСЬ ЖМИТЕ 👈🏻👈🏻👈🏻
Информационное обеспечение, программирование
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!
Похожие работы на - Программа Server Socket
Скачать Скачать документ
Информация о работе Информация о работе
Скачать Скачать документ
Информация о работе Информация о работе
Скачать Скачать документ
Информация о работе Информация о работе
Нужна качественная работа без плагиата?
Не нашел материал для своей работы?
Поможем написать качественную работу Без плагиата!
Благодаря возникновению и развитию сетей
передачи данных появился новый, высокоэффективный способ взаимодействия между
людьми. Сначала сети использовались для научных исследований, но потом они
стали проникать во все области человеческой деятельности. Большинство сетей
существовало независимо друг от друга, решая конкретные задачи для конкретных
групп пользователей. В соответствии с этими задачами выбирались те или иные
сетевые технологии, сетевые стандарты и протоколы, а также аппаратное обеспечение.
Для правильного взаимодействия компьютеров
работающих в сетях разнообразной структуры, с использованием различного
программного обеспечения необходимо наличие стандартов. Этих стандартов на
данный момент существует также достаточно большое количество. Данные стандарты
и протоколы строго определяют нормы и правила технической организации
компьютерных сетей и программ, реализующих взаимодействие по сети.
Изучение сетевых стандартов и протоколов
является на сегодняшний день обязательным для любого специалиста по
информационным технологиям.
Цель проекта: Получение навыков программирования
сетевых приложений
Для решения поставленной цели в курсовой работе
решаются следующие задачи:
Написание программы демонстрирующей сокетное соединение.
При связи компьютеров по сети производится
множество операций, обеспечивающих передачу данных от компьютера к компьютеру.
Пользователю, работающему с каким-то приложением, в общем-то безразлично, что и
как при этом происходит.
Для него просто существует доступ к другому
приложению или компьютерному ресурсу, расположенному на другом компьютере сети.
В действительности же вся передаваемая информация проходит много этапов
обработки. Прежде всего она разбивается на блоки, каждый из которых снабжается
управляющей информацией. Полученные блоки оформляются в виде сетевых пакетов,
эти пакеты кодируются, передаются с помощью электрических или световых сигналов
по сети в соответствии с выбранным методом доступа, затем из принятых пакетов
вновь восстанавливаются заключенные в них блоки данных, блоки соединяются в
данные, которые и становятся доступны другому приложению. Это, конечно, очень
упрощенное описание происходящих процессов. Часть из указанных процедур
реализуется только программно, другая - аппаратно, а какие-то операции могут
выполняться как программами, так и аппаратурой.
Упорядочить все выполняемые процедуры, разделить
их на уровни и подуровни, взаимодействующие между собой, как раз и призваны модели
сетей. Эти модели позволяют правильно организовать взаимодействие как абонентам
внутри одной сети, так и самым разным сетям на различных уровнях. Наибольшее
распространение получила в настоящее время так называемая эталонная модель
обмена информацией открытой системы OSI (Open System Interchange). Под термином
«открытая система» в данном случае понимается незамкнутая в себе система,
имеющая возможность взаимодействия с какими-то другими системами (в отличие от
закрытой системы).
Модель OSI была предложена Международной
организацией стандартов ISO (International Standards Organization) в 1984 году.
С тех пор ее используют (более или менее строго) все производители сетевых
продуктов. Как и любая универсальная модель, модель OSI довольно громоздка,
избыточна и не слишком гибка, поэтому реальные сетевые средства, предлагаемые
различными фирмами, не обязательно придерживаются принятого разделения функций.
Эталонная модель OSI стала основной архитектурной моделью для систем передачи
сообщений. При рассмотрении конкретных прикладных телекоммуникационных систем
производится сравнение их архитектуры с моделью OSI/ISO. Эта модель является
наилучшим средством для изучения современной технологии связи.
Эталонная модель OSI делит проблему передачи
информации между абонентами на семь менее крупных и, следовательно, более легко
разрешимых задач. Конкретизация каждой задачи производилась по принципу
относительной автономности. Очевидно, автономная задача решается легче.
Каждой из семи областей проблемы передачи
информации ставится в соответствие один из уровней эталонной модели. Два самых
низших уровня эталонной модели OSI реализуются аппаратным и программным
обеспечением, остальные пять высших уровней, как правило, реализуются
программным обеспечением. Эталонная модель OSI описывает, каким образом
информация проходит через среду передачи (например, металлические провода) от
прикладного процесса-источника (например, по передаче речи) до
процесса-получателя.
Стек протоколов, представленный в виде
7-уровневой структуры, показан на рисунке 1
В рамках модели OSI взаимодействие двух систем
представляется фактически в виде двух моделей - горизонтальной и вертикальной:
в рамках горизонтальной модели рассматривается
прямое взаимодействие (обмен данными) одинаковых уровней в двух конечных точках
(хостах); для организации такого взаимодействия в каждой из конечных точек
должны поддерживаться одинаковые протоколы для данного уровня;
в вертикальной модели рассматривается обмен
информацией (взаимодействие) между соседними уровнями одной системы с
использованием интерфейсов API; в этой модели каждый уровень может
предоставлять свои услуги вышележащему уровню и пользоваться услугами
нижележащего уровня (крайние уровни модели в этом смысле представляют
исключение - прикладной уровень предоставляет свои услуги пользователю, а
сетевой уровень не пользуется сервисом других уровней)
Прикладной уровень (Application layer)
Верхний (7-й) уровень модели, обеспечивает
взаимодействие сети и пользователя. Уровень разрешает приложениям пользователя
доступ к сетевым службам, таким как обработчик запросов к базам данных, доступ
к файлам, пересылке электронной почты. Также отвечает за передачу служебной
информации, предоставляет приложениям информацию об ошибках и формирует запросы
к уровню представления.
Уровень представления (Presentation layer)
Этот уровень отвечает за преобразование
протоколов и кодирование/декодирование данных. Запросы приложений, полученные с
уровня приложений, он преобразует в формат для передачи по сети, а полученные
из сети данные преобразует в формат, понятный приложениям. На этом уровне может
осуществляться сжатие/распаковка или кодирование/декодирование данных, а также
перенаправление запросов другому сетевому ресурсу, если они не могут быть
обработаны локально.
Отвечает за поддержание сеанса связи, позволяя
приложениям взаимодействовать между собой длительное время. Уровень управляет
созданием/завершением сеанса, обменом информацией, синхронизацией задач,
определением права на передачу данных и поддержанием сеанса в периоды
неактивности приложений. Синхронизация передачи обеспечивается помещением в
поток данных контрольных точек, начиная с которых возобновляется процесс при
нарушении взаимодействия
Транспортный уровень (Transport layer)
-й уровень модели, предназначен для доставки
данных без ошибок, потерь и дублирования в той последовательности, как они были
переданы. При этом неважно, какие данные передаются, откуда и куда, то есть он
предоставляет сам механизм передачи. Блоки данных он разделяет на фрагменты,
размер которых зависит от протокола, короткие объединяет в один, а длинные
разбивает. Протоколы этого уровня предназначены для взаимодействия типа
точка-точка.
-й уровень сетевой модели OSI, предназначен для
определения пути передачи данных. Отвечает за трансляцию логических адресов и
имён в физические, определение кратчайших маршрутов, коммутацию и маршрутизацию
пакетов, отслеживание неполадок и заторов в сети. На этом уровне работает такое
сетевое устройство, как маршрутизатор.
Канальный уровень (Data Link layer)
Этот уровень предназначен для обеспечения
взаимодействия сетей на физическом уровне и контроля за ошибками, которые могут
возникнуть. Полученные с физического уровня данные он упаковывает в кадры
данных, проверяет на целостность, если нужно исправляет ошибки и отправляет на
сетевой уровень. Канальный уровень может взаимодействовать с одним или
несколькими физическими уровнями, контролируя и управляя этим взаимодействием.
Спецификация IEEE 802 разделяет этот уровень на 2 подуровня - MAC (Media Access
Control) регулирует доступ к разделяемой физической среде, LLC (Logical Link
Control) обеспечивает обслуживание сетевого уровня. На этом уровне работают
коммутаторы, мосты.
В программировании этот уровень представляет
драйвер сетевой платы, в операционных системах имеется программный интерфейс
взаимодействия канального и сетевого уровня между собой, это не новый уровень,
а просто реализация модели для конкретной ОС. Примеры таких интерфейсов: ODI,
NDIS.
Физический уровень (Physical layer)
Самый нижний уровень модели, предназначен
непосредственно для передачи потока данных. Осуществляет передачу электрических
или оптических сигналов в кабель и соответственно их приём и преобразование в
биты данных в соответствии с методами кодирования цифровых сигналов. Другими
словами, осуществляет интерфейс между сетевым носителем и сетевым устройством.
На этом уровне работают концентраторы, повторители (ретрансляторы) сигнала и
сетевые адаптеры.
Уровни взаимодействуют сверху вниз и снизу вверх
посредством интерфейсов и могут еще взаимодействовать с таким же уровнем другой
системы с помощью протоколов.
Протоколы, использующиеся на каждом уровне
модели OSI, представлены в таблице 1.
HTTP,
gopher, Telnet, DNS, SMTP, SNMP, CMIP, FTP, TFTP, SSH, IRC, AIM, NFS, NNTP,
NTP, SNTP, XMPP, FTAM, APPC, X.400, X.500, AFP, LDAP, SIP, ITMS, Modbus TCP,
BACnet IP, IMAP, POP3, SMB, MFTP, BitTorrent, eD2k, PROFIBUS
HTTP,
ASN.1, XML-RPC, TDI, XDR, SNMP, FTP, Telnet, SMTP, NCP, AFP
ASP, ADSP, DLC, Named Pipes, NBT, NetBIOS,
NWLink, Printer Access Protocol, Zone Information Protocol, SSL, TLS, SOCKS
TCP,
UDP, NetBEUI, AEP, ATP, IL, NBP, RTMP, SMB, SPX, SCTP, DCCP, RTP, TFTP
IP,
IPv6, ICMP, IGMP, IPX, NWLink, NetBEUI, DDP, IPSec, ARP, RARP, DHCP, BootP,
SKIP, RIP
STP, ARCnet, ATM, DTM, SLIP, SMDS, Ethernet,
FDDI, Frame Relay, LocalTalk, Token ring, StarLan, L2F, L2TP, PPTP, PPP,
PPPoE, PROFIBUS
RS-232, RS-422, RS-423, RS-449, RS-485, ITU-T,
xDSL, ISDN, T-carrier (T1, E1), модификации
стандарта
Ethernet: 10BASE-T, 10BASE2, 10BASE5, 100BASE-T (включает
100BASE-TX, 100BASE-T4, 100BASE-FX), 1000BASE-T, 1000BASE-TX, 1000BASE-SX
Следует понимать, что подавляющее большинство
современных сетей в силу исторических причин лишь в общих чертах, приближённо,
соответствуют эталонной модели ISO/OSI.
Реальный стек протоколов OSI, разработанный как
часть проекта, был воспринят многими как слишком сложный и фактически
нереализуемый. Он предполагал упразднение всех существующих протоколов и их
замену новыми на всех уровнях стека. Это сильно затруднило реализацию стека и
послужило причиной для отказа от него многих поставщиков и пользователей, сделавших
значительные инвестиции в другие сетевые технологии. В дополнение, протоколы
OSI разрабатывались комитетами, предлагавшими различные и иногда противоречивые
характеристики, что привело к объявлению многих параметров и особенностей
необязательными. Поскольку слишком многое было необязательно или предоставлено
на выбор разработчика, реализации различных поставщиков просто не могли
взаимодействовать, отвергая тем самым саму идею проекта OSI.
В результате попытка OSI договориться об общих
стандартах сетевого взаимодействия была вытеснена стеком протоколов TCP/IP,
используемым в Интернете, и его более простым, прагматичным подходом к
компьютерным сетям. Подход Интернета состоял в создании простых протоколов с
двумя независимыми реализациями, требующимися для того, чтобы протокол мог
считаться стандартом. Это подтверждало практическую реализуемость стандарта.
Например, определения стандартов электронной почты X.400 состоят из нескольких
больших томов, а определение электронной почты Интернета (SMTP) - всего несколько
десятков страниц в RFC 821. Всё же стоит заметить, что существуют
многочисленные RFC, определяющие расширения SMTP. Поэтому на данный момент
полная документация по SMTP и расширениям также занимает несколько больших
книг.
Большинство протоколов и спецификаций стека OSI
уже не используются, такие как электронная почта X.400. Лишь немногие выжили,
часто в значительно упрощённом виде. Структура каталогов X.500 до сих пор
используется, в основном, благодаря упрощению первоначального громоздкого
протокола DAP, получившему название LDAP и статус стандарта Интернета.
Свёртывание проекта OSI в 1996 году нанесло
серьёзный удар по репутации и легитимности участвовавших в нём организаций,
особенно ISO. Наиболее крупным упущением создателей OSI был отказ увидеть и
признать превосходство стека протоколов TCP/IP.
WinSock (Windows Socket) - это
Windows API, который взаимодействует с сетью.( Socket переводится с английского
языка как «разьем».) Программного интерфейса
для обеспечения обмена данными между
процессами
.
Процессы при таком обмене могут исполняться как на одной ЭВМ ,
так и на различных ЭВМ, связанных между собой сетью
.
Сокет - абстрактный
объект, представляющий конечную точку соединения.
Следует различать клиентские
и серверные
сокеты. Клиентские сокеты грубо можно сравнить с конечными аппаратами
телефонной сети
,
а серверные - с коммутаторами
.
Клиентское приложение (например, браузер
)
использует только клиентские сокеты, а серверное (например, веб-сервер
,
которому браузер посылает запросы) - как клиентские, так и серверные сокеты.
Выделяют два типа socket’ов:
потоковый socket (SOCK_STREAM) и, так называемый, дейтаграммный socket
(datagram socket, SOCK_DGRAM). Потоковый вариант разработан для приложений, нуждающихся
в надежном соединении и часто использующем продолжительные потоки данных.
Протокол, использующийся для данного типа socket’ов - TCP. В этом материале
будет использоваться только потоковый тип socket’ов, т.к. он чаще всего
используется в хорошо известных протоколах, таких как SMTP, POP3, HTTP, TCP.
Дейтаграммные socket’ы используют
UDP протокол и имеют низкий сигнал соединения и большой размер буфера данных.
Они применяются в приложениях, которые отправляют данные малых размеров и не
нуждаются в идеальной надежности. В отличии от потоковых socket’ов,
дейтаграммные socket’ы не гарантируют стопроцентной передачи данных получателю,
как и не гарантируют передачи данных в нужном порядке. Данный тип socket’ов
полезнее для приложений, где надежность не является высоким приоритетом, таким
как скорость (например аудио или видео трансляция). В приложениях, которые
нуждаются в надежности, целесообразней использовать потоковые сокеты.
Связывание (binding) socket’ов.
Связать socket значит «прикрепить» определенный адрес (IP адрес и номер порта)
к данному socket’у. Это можно сделать вручную, используя связывающую функцию,
но в некоторых случаем WinSock сам автоматически свяжет socket.
Когда соединение вызвано, WinSock
выберет IP адрес и номер порта для соединения и свяжет с ними socket до того,
как клиент фактически соединится с сервером. Номером порта может быть любой
номер, который свободен в момент соединения, с выбором IP адреса надо быть
аккуратнее. Компьютеры могут иметь более одного IP адреса. Например, компьютер,
подключенный к локальной сети и к интернету, имеет три IP адреса: внешний для
использования интернета; адрес в локальной сети (192.168.x.x или 10.0.x.x и
т.д.); адрес, так называемой «внутренней петли»(loopback), для обозначения
«локального хоста» в сети из одного компьютера (127.0.0.1). Здесь выбор IP
адреса, с которым связан socket, имеет значение, т.к. также определяет сеть,
которую ты используешь для соединения. Если ты хочешь подключиться к локальному
компьютеру 192.168.0.4, ты не сможешь сделать это через сеть интернет
провайдера. Тебе потребуется связать socket с Вашим IP адресом в такой же сети
(192.168.0.1, например).
К счастью, WinSock сам выберет IP
адрес на твоем компьютере, который может использоваться для соединения с нужным
адресом. Ничего не мешает тебе связать socket самостоятельно, но помни, что ты
должен взять ситуацию, описанную выше, во внимание. Так же связывающая функция
дает пользователю возможность установить IP адрес или номер порта в нулевое
значение. В этом случаем нулевое значение значит «пускай WinSock выберет
что-нибудь для меня». Это полезно, когда ты хочешь подключиться, используя
определенный IP адрес, но, не указывая значение порта.
На «стороне» сервера дела обстоят
немного иначе. Сервер ждет входящих соединений и клиенту необходимо знать IP
адрес и номер порта сервера, чтобы установить соединение. Чтобы упростить дело,
на сервере всегда используется фиксированный номер порта (обычно это - порт,
предусмотренный протоколом по умолчанию).
Ожидание входящего соединения по
определенному адресу называется прослушиванием (listening). Обычно, перед тем
как «войти» в режим прослушивания, socket должен быть связан с определенным
адресом. Когда номер порта этого адреса установлен и зафиксирован (т.е. не
изменится), сервер начинает ждать входящие соединения по этому порту. Например,
80 порт (порт по умолчанию для HTTP) прослушивается большинством серверов.
Когда клиент запрашивает соединение
с сервером, сервер разрешит ему (или нет) и породит новый socket, который будет
конечной точкой связи. Благодаря этому, socket, по которому происходило
прослушивание, не используется для передачи данных и может находиться в режиме
прослушивания дальше, «принимая» новых клиентов.
В большинстве случаев используется
версия WinSock 2.х, обычно называемая WinSock 2, т.к. различия небольшие.
Последней популярной версией до второй, был WinSock 1.1. Некоторые могут
сказать, что надо использовать именно эту версию, т.к. Windows 95 поддерживает
только ее, но кто в наши дни пользуется Windows 95? Поэтому я рекомендую тебе
использовать WinSock версии 2. Две основных версии WinSock «проживают» в двух
.DLL - wsock32.dll и ws2_32.dll. В первой - версия 1.1, а во второй - WinSock2.
В С++ достаточно подключить windows.h и winsock2.h для использования функций
WinSock в своей программе. Далее в материале будет рассмотрен WinSock второй
версии.обеспечивает два интерфейса: API и SPI(Service Provider Interface -
Интерфейс Обеспечения Служб). В этом материале будет рассмотрен только API, в
нем содержатся все необходимые функции для использования нужных протоколов. SPI
- интерфейс, который добавляет «поставщиков
передачи данных» (Data Transport
Providers) как, например TCP/IP или IPX/SPX. Также SPI добавляет «поставщиков
именных служб» (Name Space Service Providers), таких как DNS. Но все эти
добавления «прозрачны» для пользователей API и не видны им.
SAStartup и
WSACleanupWSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
Перед вызовом любой WinSock функции,
необходимо инициализировать библиотеку Ws2_32.dll. Это делается с помощью
WSAStartup. Функция принимает два параметра:
wVersionRequested - Максимальная
версия Windows Socket, которую может использовать вызывающая программа. Старший
байт содержит младшую часть номера версии, младший байт содержит старшую часть
номера версии.
lpWSAData - Указатель на структуру
WSADATA, которая, в результате выполнения функции, будет содержать детали
реализации Windows Sockets.
В случае успешного выполнения,
функция WSAStartup возвращает 0. В противном случае возвращается один из кодов
ошибки, приведенных в таблице. Если выполнение функции WSAStartup окончилось
неудачей, невозиожно определить код ошибки с помощью WSAGetLastError. Это
получается потому, что в случае сбоя, библиотека Ws2_32.dll не будет загружена,
и область памяти, где сохраняется информация о последней ошибке, недоступна. Но
при желании можно попробовать получить код ошибки с помощью API функции
GetLastError.
Это справедливо для приложений,
написанных с использованием младших версий, для успешной работы со старшими
версиями библиотеки. В этом случае приложение гарантирует доступ только к
функциональности, совместимой по синтаксису с текущей версией. Для полного
доступа к новому синтаксису будущих реализаций приложение должно полностью
соответствовать этой реализации - откомпилировано с новыми заголовочными
файлами, слинковано с новыми библиотеками.
Пример использования этих
функций:int iReqWinsockVer = 2; // Минимальная требуемая версия
WSADATA
wsaData;(WSAStartup(MAKEWORD(iReqWinsockVer,0), &wsaData)==0)
// Проверяем если старшая версия
больше или равна требуемой
if
(LOBYTE(wsaData.wVersion) >= iReqWinsockVer)
/* Вызываем тут различные WinSock
функции */
// Освобождаем
WinSock(WSACleanup()!=0)
SOCKET
socket(int af, int type, int protocol);
Функция socket() создает новый
socket и возвращает его дескриптор. Тип этого дескриптора SOCKET, и он
используется во всех функциях, работающих с socket’ами. Единственным
недействительным значением дескриптора socket’а является INVALID_SOCKET .
Функция принимает три параметра:- address family, так называемое, адресное
семейство. Этот параметр накладывает определенные ограничения на формат
используемых процессом адресов и их интерпретацию. Установи этот параметр в
значение AF_INET, чтобы использовать TCP и UDP «семейство».- тип создаваемого
socket’а. Используй SOCK_STREAM для создания потокового socket’а и SOCK_DGRAM
для создания дейтаграммного socket’а.- протокол, который будет использоваться
socket’ом. Этот параметр зависит от «адресного семейства». Чтобы создать TCP
socket, Вам нужно указать IPPROTO_TCP.
Функция возвращает дескриптор
созданного socket’а, или INVALID_SOCKET, если что то случилось не так. Функцию
socket() можно использовать следующим образом:hSocket;= socket(AF_INET,
SOCK_STREAM, IPPROTO_TCP);
Как понятно из названия, эта функция
закрывает socket. Функция возвращает ноль, если все прошло успешно, иначе
результатом выполнения функции будет SOCKET_ERROR. Каждый созданный тобою
socket с помощью функции socket(), должен быть закрыт с помощью функции
closesocket().
В функцию передается единственный
параметр - дескриптор socket’а, который необходимо закрыть. Не пытайся
использовать этот socket после вызова функции closesocket(). В лучшем случае
компилятор заметит ошибку.
Использование этой функции довольно
простое:(hSocket);
Однако, в реальный ситуациях,
необходимо немного больше операций, что бы закрыть socket должным образом. Это
мы рассмотрим немного позднее.был разработан таким образом, что бы он мог
взаимодействовать с разными протоколами, включая те, которые должны быть
добавлены позднее. Поэтому был разработан общий способ адресации. Например,
TCP/IP использует IP адрес и номер порта для определения адреса, но другие
протоколы могут делать это по-другому. Если бы WinScok придерживался
определенного типа адресации, то добавление других протоколов было бы
невозможным.
Первый вариант решения этой проблемы
- использование структуры sockaddr:sockaddr
Первое поле этой структуры
определяет «адресное семейство» адреса. Данные, хранящиеся в переменной
sa_data, могут меняться в зависимости от «адресного семейства». В WinSock
определена структура sockaddr_in, которая является TCP/IP версией структуры
sockaddr.
struct
sockaddr_in {sin_family; short sin_port; in_addr sin_addr;
Последние 8 байт структуры не
используются. Они предусмотрены для того, что бы дать структуре нужный размер
(такой же как у структуры sockaddr).
Перед тем, как двигаться дальше,
необходимо знать про сетевой порядок байт. Под «порядком байт» будем понимать
последовательность, в которой хранятся значения, охватывающие несколько байт.
Например, 32-битовое целочисленное значение 0x12345678 охватывает 4 8-битовых
байта. Некоторые компьютеры используют порядок байт, в котором менее значимые
байты сохранены сначала. То есть наше число 0x12345678 будет храниться в такой
последовательности: 0x78, 0x56, 0x34, 0x12 (порядок байтов от младшего к
старшему, англ. little-endian). Однако большинство машин используют
противоположный порядок, т.е. более значимый байт хранится вначале. В таких
машинах наше число будет храниться в виде 0x12, 0x34, 0x56, 0x78. Поскольку
протоколы, по которым будут переданы данные между двумя компьютерами, могут
иметь разные байтовые порядки, то необходим стандарт, чтобы препятствовать
передаче данных неправильным образом.
Поскольку такие протоколы, как
TCP/IP работают между разными системами с разным порядком байтов, то был
разработан стандарт - порядок от старшего к младшему (big-endian). Запись
начинается со старшего байта и заканчивается младшим. Например, 16-битовый
номер порта 12345 (0x3039) в этом представлении будет выглядеть так: сначала
0x30, потом 0x39, т.е. более значимый байт идет сначала. 32-битовый IP адрес
хранится аналогичным образом: каждая часть IP адреса хранится в одном байте, и
первая часть хранится в первом байте. Например, IP адрес 216.239.51.100 будет
храниться в такой последовательности байтов: 216,239,51,100. Этот порядок
является стандартным для протоколов TCP/IP, он используется в заголовках
пакетов данных и во многих протоколах более высокого уровня, разработанных для
использования поверх TCP/IP. Поэтому, порядок байтов от старшего к младшему
часто называют сетевым порядком байтов (network byte order).
Кроме параметров sin_family и
sa_family в структурах sockaddr_in и sockaddr, соответственно, которые не
являются частью протокола, но говорят WinSock, какое «адресное семейство»
использовать, все остальные поля этих структура хранятся в сетевом порядке
байтов. обеспечивает несколько функций для преобразования порядка байтов
локальной машины в сетевой порядок байтов:
// Преобразует u_short из порядка
байтов локальной машины в сетевой порядок байтов
// Преобразует u_long порядка байтов
локальной машины в сетевой порядок байтов
// Преобразует u_shorth из сетевого
порядка байтов в порядок байтов локальной машины
// Преобразует u_long из сетевого
порядка байтов в порядок байтов локальной машины
Вернемся к структуре sockaddr_in.
Как писалось выше, все параметры кроме sin_family имеют сетевой порядок байтов.
Этот параметр у нас используется в значении AF_INET. sin_port - это 16-битовый
номер порта, sin_addr - 32-битовый IP адрес. sin_zero не используется, этот
параметр нужен, чтобы придать структуре нужный размер.
Вот пример заполнения полей структуры
sockaddr_in:_in sockAddr1, sockAddr2;
// Устанавливаем адресное семейство
// Преобразуем номер порта 80 в
сетевой порядок байтов .sin_port = htons(80);
/* inet_addr преобразует строку с IP
адресом в long значение,
которое является IP адресом в
сетевом порядке байтов._addr.S_un.S_addr определяет long значение в адресном
объединении */
sockAddr1.sin_addr.S_un.S_addr
= inet_addr("127.0.0.1");
// Устанавливаем адрес sockAddr2,
устанавливая значение каждой из 4 байтовой части:
sockAddr2.sin_addr.S_un.S_un_b.s_b1
= 127;.sin_addr.S_un.S_un_b.s_b2 = 0;.sin_addr.S_un.S_un_b.s_b3 = 0;
sockAddr2.sin_addr.S_un.S_un_b.s_b4
= 1;
Функция inet_addr, в вышеприведенном
примере, преобразует строковое значение IP адреса (записанного в «точечном»
формате) в соответствующее 32-битовое значение в сетевом порядке байтов. Также
существует функция inet_ntoa, которая делает тоже самое, только наоборот.
connectconnect(SOCKET
s, const struct sockaddr *name, int namelen);
Функция connect соединят socket с удаленным
socket’ом. Эта
функция используется на клиентской стороне подключения, т.к. именно клиент
является инициатором подключения.
Краткое описание параметров этой
функции:- неподключенный socket, который ты хотел бы подключить.- указатель на
структуру sockaddr, в которой содержится имя (адрес) удаленного socket’а, к
которому необходимо подключится.- размер структуры, в которой содержится имя.
Первый параметр - это клиентский
socket, использующий соединение, например, только что созданный socket с помощью
функции socket(). Остальные два параметра, name и namelen, используются для
адресации удаленного socket’а (socket сервера, который находится в режиме
прослушивания).
Эту функцию применяют для соединения
с сервером. Чтобы обратиться к серверу, ты можешь использовать структуру
sockaddr_in, заполнив ее IP адресом и номером порта сервера. Ты можешь
поинтересоваться, как получить IP адрес сервера, например, www.vr-online.ru
<#"787306.files/image002.gif">
// ***** Ожидание
клиента<<
"Wait of client..." << endl;
listen(Sock, SOMAXCONN); // Прослушивание сокета
сервером (для подключения клиента)
Client = accept(Sock
Похожие работы на - Программа Server Socket Курсовая работа (т). Информационное обеспечение, программирование.
Курсовая работа: Понятие и виды объекта преступления
Написав Контрольную Работу Три Сестры
Мои Предсказания В Будущем Сочинение
Азамат Ердің Баласы Эссе Сырым
Курсовая работа: Основные подходы исследования систем управления
Реферат по теме Физическая география России
Курсовая работа по теме Микробиология кукурузного силоса
Реферат: Лінійна модель виробництва
Реферат по теме Теоретико-методологические основания эмпирических исследований власти в городских сообществах
Курсовая работа: Система подготовки бакалавров в Польше. Скачать бесплатно и без регистрации
Контрольная работа: Образование Древнерусского государства. Критика "норманнской" теории
Реферат по теме Современные методы диагностики инфекционных болезней
Реферат Современные Методы И Методики Исследований
Доклад по теме Унамуно Мигель
Контрольная Работа Нервная Система Человека
Диссертации По Искусству
Информатика Контрольная Работа 9 Класс Ответы
Реферат На Тему Звуковые Волны
Курсовая работа по теме Интерпретация конституционных норм по вопросу пределов ограничения конституционных прав и свобод личности
Реферат: Deviance Essay Research Paper It seems to
Похожие работы на - Исследование мотивационных установок персонала рекламного агентства
Курсовая работа: Решение задач моделирования и оптимизации с помощью программ Excel и Mathcad