Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МетУказКурсРабСистемПрогрЗИЭИТ2005.doc
Скачиваний:
6
Добавлен:
13.09.2019
Размер:
698.37 Кб
Скачать

Приложение может послать запрос на соединение с помощью функции

int connect (SOCKET s, const struct sockaddr FAR *name, int namelen);

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

Прием данных на сокете дейтаграмм

После создания соответствующего сокета и привязки его к определенному адресу и порту можно принимать данные от другого приложения. Для этого можно использовать функцию

int recvfrom (SOCKET s, char FAR * buf, int len, int flags,

struct sockaddr FAR *from, int FAR * fromlen);

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

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

Если размер буфера , переданный в функцию recvfrom() , слишком мал для приема всей дейтаграммы целиком, то буфер заполняется теми данными, которые в него помещаются, оставшаяся часть теряется безвозвратно. В этом случае функция recvfrom() возвращает значение SOCKET_ERROR , а функция WSAGetLastError() – значение WSAEMSGSIZE.

Посылка данных с сокета дейтаграмм

Отправка данных выполняется функцией

int sendto (SOCKET s, const char FAR * buf, int len, int flags,

const struct sockaddr FAR *to, int tolen);

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

Если функция sendto() отрабатывает корректно, она возвращает количество посланных байтов. В случае ошибки функция возвращает SOCKET_ERROR. Для определения кода ошибки необходимо вызвать функцию WSAGetLastError().

При попытке послать дейтаграмму большего размера, чем максимально допустимый в данной реализации WinSock, код ошибки будет равен WSAEMSGSIZE. Максимально допустимый размер дейтаграммы можно определить путем вызова функции WSAStartup().

Отправка и прием данных через сокеты потоков

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

int send (SOCKET s, const char FAR * buf, int len, int flags);

Функция send() принимает в качестве аргументов дескриптор сокета, через который посылаются данные, указатель на буфер, содержащий пересылаемые данные и его длину в байтах, а также параметр flags. Если этот параметр равен MSG_DONTROUTE, в пересылаемый набор данных не включается информация о маршрутизации; если его значение равно MSG_OOB, посылается поток привилегированных (out-of-band) данных.

Объем данных, пересылаемых одним вызовом функции send() не должен превышать размера пакета, максимально допустимого в данной сети. При попытке пересылки большего объема данных функция send() завершится аварийно, а функция WSAGetLastError() возвратит код ошибки WSAEMSGSIZE.

Для приема данных через сокет используется функция

int recv (SOCKET s, char FAR * buf, int len, int flags);

Параметры buf и len определяют соответственно буфер для приема данных и его длину. Параметр flags может принимать значения MSG_OOB для приема привилегированных данных или MSG_PEEK для заполнения буфера без удаления данных из входной очереди.

Если во входной очереди находятся данные для сокета, функция recv() возвращает количество прочитанных байтов, которое равно объему доступных данных во входной очереди и не превосходит значения len . Если данных нет, то recv() переводит программу в состояние ожидания появления данных.