МегаПредмет

ПОЗНАВАТЕЛЬНОЕ

Сила воли ведет к действию, а позитивные действия формируют позитивное отношение


Как определить диапазон голоса - ваш вокал


Игровые автоматы с быстрым выводом


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


Целительная привычка


Как самому избавиться от обидчивости


Противоречивые взгляды на качества, присущие мужчинам


Тренинг уверенности в себе


Вкуснейший "Салат из свеклы с чесноком"


Натюрморт и его изобразительные возможности


Применение, как принимать мумие? Мумие для волос, лица, при переломах, при кровотечении и т.д.


Как научиться брать на себя ответственность


Зачем нужны границы в отношениях с детьми?


Световозвращающие элементы на детской одежде


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


Как слышать голос Бога


Классификация ожирения по ИМТ (ВОЗ)


Глава 3. Завет мужчины с женщиной


Оси и плоскости тела человека


Оси и плоскости тела человека - Тело человека состоит из определенных топографических частей и участков, в которых расположены органы, мышцы, сосуды, нервы и т.д.


Отёска стен и прирубка косяков Отёска стен и прирубка косяков - Когда на доме не достаёт окон и дверей, красивое высокое крыльцо ещё только в воображении, приходится подниматься с улицы в дом по трапу.


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

Передача и прием данных по сокету (потоковые протоколы)





Для пересылки данных по сокету используются функции send и WSASend. Аналогично, для приема данных существуют функции recv и WSARecv.

Все буферы, используемые при отправке и приеме данных, состоят из элементов типа char.

Функция send.

API-функция send для отправки данных по сокету определена так:

int send(

SOCKET s,

const char FAR * buf,

int len,

int flags );

Параметр s определяет сокет для отправки данных.

Второй параметр — buf, указывает на символьный буфер, содержащий данные для отправки.

Третий — len, задает число отправляемых из буфера символов.

Параметр — flags, может принимать значения 0, MSG_DONTROUTE, MSG_OOB, или результат логического ИЛИ над любыми из этих параметров. При указании флага MSG_DONTROUTE не будут маршрутизироваться отправляемые пакеты. Флаг MSG_OOB указывает, что данные должны быть отправлены вне полосы (out of band), то есть срочно.

При успешном выполнении функция send вернет количество переданных байт, иначе — ошибку SOCKET_ERROR. Число, возвращаемое функцией send может быть меньше указанного размера буфера. Одна из типичных ошибок — WSAE-CONNABORTED, происходит при разрыве виртуального соединения из-за ошибки протокола или истечения времени ожидания. В этом случае сокет должен быть закрыт, так как он больше не может использоваться.

Число, возвращаемое функцией send может быть меньше указанного размера буфера.

В Winsock версии 2 определена функция WSASend — аналог send.

Функция recv.

Функция recv определена так:

int recv(

SOCKET s,

char FAR * buf,

int len,

int flags );

Параметр s определяет сокет для приема данных.

Второй параметр — buf, является символьным буфером и предназначен для полученных данных.

Параметр len указывает число принимаемых байт или размер буфера buf.

Последний параметр — flags, может принимать значения 0, MSG_PEEK, MSG_OOB или результат логического ИЛИ над любыми из этих параметров. Разумеется, 0 означает отсутствие особых действий. Флаг MSG_PEEK указывает, что доступные данные должны копироваться в принимающий буфер и при этом оставаться в системном буфере. Его использовать не рекомендуется. Флаг MSG_OOB уже обсуждался при рассмотрении отправки данных.

Использование recv в сокетах, ориентированных на передачу сообщений или дейтаграмм, имеет несколько особенностей. Если при вызове recv размер ожидающих обработки данных больше предоставляемого буфера, то после его полного заполнения возникает ошибка WSAEMSGSIZE. Заметьте: ошибка превышения размера сообщения происходит только при использовании протоколов, ориентированных на передачу сообщений. Потоковые протоколы буферизируют поступающие данные и при запросе приложением предоставляют их в полном объеме, даже если количество ожидающих обработки данных больше размера буфера. Таким образом, ошибка WSAEMSGSIZE не может произойти при работе с потоковыми протоколами.

Функция WSARecv обладает дополнительными по сравнению с recv возможностями: поддерживает перекрытый ввод-вывод и фрагментарные дейтаграммные уведомления.

 

Завершение сеанса

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

Функция shutdown.

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

int shutdown(

SOCKET s,

int how );

Параметр how может принимать значения SD_IRECEIVE, SD_SEND или SD_ BOTH. Значение SD_IRECEIVE запрещает все последующие вызовы любых функций приема данных, на протоколы нижнего уровня это не действует. Если в очереди ТСР-сокета есть данные, либо они поступают позже, соединение сбрасывается. UDP-сокеты в аналогиной ситуации продолжают принимать данные и ставить их в очередь.

SD_SEND запрещает все последующие вызовы функций отправки данных. В случае ТСР-сокетов после подтверждения получателем приема всех отправленных данных передается пакет FIN.

SD_BOTH запрещает как прием, так и отправку.

Функция closesocket.

Эта функция закрывает сокет. Она определена так: int closesocket (SOCKET s);

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

 





©2015 www.megapredmet.ru Все права принадлежат авторам размещенных материалов.