Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Функции работы с сокетами




Клиент

Сервер

Использование протокола TCP

Использование протокола UDP

Сценарии использования

Схема работы с функциями по протоколу UDP для сервера и клиента одинаковая:

 

 

Функция Описание
Socket Создание гнезда.
Bind Позволяет назначить IP-адрес и порт гнезду.
Sendto Послать кому-то.
Recvfrom (“Receive”) Получить от кого-то.
Close Завершение взаимодействия. Уничтожает само гнездо, освобождая ресурсы драйвера для повторного использования.

 

 


 

Функция Описание
Socket Создание гнезда.
Bind Привязка к гнезду IP-адреса и номера порта.
Listen Начинает прослушивание сокета на предмет входящих запросов на установку соединения.
Accept Принимает входящий запрос на установку соединения, отправляя подтверждение и обеспечивая механизм «трехкратного рукопожатия». Результат функции Accept – создание нового сокета с установкой соединения, в рамках которого можно вызывать функции Send и Recv.
Send Посылка данных.
Recv (“Receive”) Принятие данных.
Shutdown Упорядоченное закрытие дуплексного канала связи в одном, втором или обоих направлениях. Гарантирует, что данные будут полностью получены.
Close Закрывает гнездо, освобождая ресурсы.
Функция Описание
Socket Создание гнезда.
Bind Привязка к гнезду IP-адреса и номера порта.
Connect Обеспечивает подключение клиента к серверу, инициирует установку соединения.
Send Посылка данных по установленному дуплексному каналу связи.
Recv (“Receive”) Принятие данных по установленному дуплексному каналу связи.
Shutdown Упорядоченное закрытие дуплексного канала связи в одном, втором или обоих направлениях. Гарантирует, что данные получены полностью.
Close Закрывает гнездо, освобождая ресурсы.

 

Функция, structure Описание
int socket (int af, int type, int protocol) af: AF_UNIX AF_INET type: sock_stream sock_dram protocol: PROTO_TCP PROTO_UDP PROTO_XXX   1. Функция socket создает гнездо и возвращает номер гнезда в качестве результата. Этот идентификатор служит идентификатором логической связи между компьютерами;   2. af (address family) – целочисленный идентификатор семейства адресов (вид адресации, которая будет использоваться сокетом). o AF_UNIX – используется идентификация компьютера с помощью символьного имени; o AF_INET – используется система адресов Internet;   3. type – целочисленный идентификатор типа. · sock_stream – потоковый сокет, используются средств для передачи с подверждением потока данных; · sock_dram – сокет с передачей дейтаграмм;   Обычно для TCP используется тип sock_stream, для UPD – sock_dram. 4. Protocol – протокол. Константы помечают не только TCP и UDP, но и WinSocket (используется префикс WSA).     Стандартные комбинации: AF_INET + sock_stream + PROTO_TCP AF_INET + sock_dram + PROTO_UDP  
union sockaddr { sockaddr_in sin; // для Internet sockaddr_u su; // для Unix };   Важно: объединение (union) в программировании — это структура данных, члены которой расположены по одному и тому же адресу. Поэтому размер объединения равен размеру его наибольшего члена. В любой момент времени объединение хранит значение только одного из членов.
struct sockaddr_in { short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero [8]; }   1. sin_family – семейство адресов. Позволяет определить тип адресации и понять, как дальше интерпретировать данные; 2. sin_port – номер порта; 3. sin_addr – структура, в которой закодирован IP-адрес; 4. sin_zero[8] – дополнение нулями до общего размера, т.к. в Unix имя занимает 13 символов.
struct sockaddr_4 { short su_family; char su_name [13]; // имя host’а UNIX’а }   1. su_family – семейство адресов. Позволяет определить тип адресации и понять как дальше интерпретировать данные.    
int bind (int socket, const struct sockaddr* name, int namelen) Используется, чтобы назначить гнезду «номер». Связывает с гнездом IP-адрес и порт, указанные в параметре name.В параметре namelen – длина структуры sockaddr (фактически, sizeof() структуры). По размеру можно проверить, корректно ли передана структура (той ли версии). Функция bind возвращает 0 или код ошибки.
int listen (int socket, int backlog) Backlog определяет размер очереди входящих запросов на установку соединения. Физически драйвер ограничивает данное значение.   Функция listen используется сервером: она переводит гнездо в режим прослушивания и организует входную очередь для приема запроса на установку соединения. Эта функция просто включает прослушивание и завершается. Это не значит, что, когда сервер вызвал функцию listen, она не завершается, пока не придет запрос на установку соединения (т.е. функция не является блокирующей).     Входная очередь запросов – это количество запросов с флагом SYN, которые одновременно могут прийти и ожидать подтверждения установки соединения (функции accept). Важно: Backlog – это внутренняя очередь на установку соединений, а не количество установленных одновременно соединений (их может быть сколько угодно). Когда приходит запрос с флагом SYN, он попадает в эту очередь (для того, чтобы быстро приходящие запросы не пропадали). Сервер предусматривает периодическую выдачу запросам команды accept, то есть в этой очереди запросы не остаются надолго. Если сервер выполняет команду accept в течение длительного времени, то на все запросы в очереди отправляется подтверждение с флагом ACK, но без признака установки соединения (SYN), что позволяет клиенту дождаться, пока сервер завершит команду accept. Если одновременно пришло больше запросов, чем может вместить очередь, то некоторые запросы просто пропадут, и клиент не сможет соединиться из-за таймаута.   Таким образом обеспечивается некоторая защита от DDOS-атак (Distributed Denial of Service), которая возникает в случае «бомбардирования» сервера запросами на установку соединения.
int connect (int socket, const struct sockaddr* name, int namelen) Используется клиентом. В нее передается номер сокета, структура адреса. Для структуры используется слово name, т.к. в UNIX это были имена и изредка IP-адреса, а сейчас это прежде всего IP-адреса и очень редко имена. namelen – размер структуры name, который используется только для контроля. В структуре передается IP-адрес и порт, на который устанавливается соединение.   Возвращает 0 в случае успеха и код ошибки в случае ошибки.
int accept (int socket, struct sockaddr* addr, int addrlen); socket – номер сокета; sockaddr – указатель на IP-адрес и порт (те IP-адрес и порт, которые соответствуют клиенту).   Если соединения нет, то функция ждет. Если запрос был поставлен в очередь, то он изымается из очереди запросов и обрабатывается: создается новое гнездо и в структуре sockaddr возвращается его номер, IP-адрес и порт гнезда.
int shutdown (int socket, int how) How: SD_SEND SD_RECEIVE SD_BOTH Выполняет закрытие входного и/или выходного канала связи (задается полем how). При закрытии канала все отправленные данные проталкиваются дальше.   Если мы работаем с потоком данных, то вызов этой функции на отправку фактически означает получение клиентом признака конца файла при чтении.
int send (int socket, const char* buf, int len, int flags) int recv (int socket, char* buf, int len, int flags) int sendto (int socket, const char* buf, int len, int flags, const struct sockaddr* to, int tolen) int recvfrom (int socket, char* buf, int len, int flags, const struct sockaddr* from, int fromlen) При взаимодействии сервера с клиентом устанавливается дуплексная связь.   send, resv используются в протоколах TCP и UDP. sendto и resvfrom – только в UDP. socket – номер сокета buf - указатель на буфер данных, из которого или в который пишутся данные len – длина буфера flags – флаги: MSG_OOB - out of band – срочные данные MSG_XXX sockaddr – непосредственно указываются IP-адрес и порт куда (to)/откуда (from) отправляются данные recv, recvfrom возвращают реальное количество байт. Когда вызывается функция recv, а канал данных уже закрыт, функция возвращает 0. В случае ошибки возвращает отрицательное значение. Таким образом, отсутствует понятие EndOfFile, т.е. нельзя проверить соединение на то, что данные получены. Единственный способ узнать о конце данных - это принять их. В функции recv совмещены две функции: прием данных и проверка на конец.  
  int closesocket(int socket) Закрывает гнездо, его дескриптор освобождается для повторного использования. Закрыть сокет можно и без функции shutdown, если вам не важно, дошли ли последние данные. Система выжидает некоторое время перед повторным использованием. Это связано с особенностью работы TCP.  

 


 




Поделиться с друзьями:


Дата добавления: 2014-11-16; Просмотров: 934; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.011 сек.