Глобальные сети компьютеров. Практическое введение в Internet


Передача и прием данных


После того как канал создан, можно начинать передачу данных. Для передачи данных при помощи протокола гарантированной доставки TCP вы можете воспользоваться функциями send и recv , которые входят в программный интерфейс Windows Sockets.

Функция передачи данных send имеет три параметра - дескриптор сокета sock, на котором выполняется передача, адрес буфера buf, содержащего передаваемое сообщение, размер этого буфера bufsize и флаги flags:

int send (SOCKET sock, const char FAR* buf, int bufsize, int flags);

В нашем приложении CLIENT мы передаем данные серверу следующим образом:

char szBuf[80]; lstrcpy(szBuf, "Test string"); send (srv_socket , szBuf, lstrlen(szBuf), 0);

Параметры функции recv , предназначенной для приема данных, аналогичны параметрам функции send :

int recv (SOCKET sock, char FAR * buf, int bufsize, int flags);

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

В случае ошибки обе эти функции возвращают значение SOCKET_ERROR . Для анализа причин возникновения ошибки следует воспользоваться функцией WSAGetLastError .

Приведем список кодов ошибок, которые могут возникать при вызове команды send:

Код ошибки Описание
WSANOTINITIALISED Перед использованием функции необходимо вызвать функцию WSAStartup
WSAENETDOWN Сбой в сети
WSAEACCES Указанный адрес является широковещательным (broadcast), однако перед вызовом функции не был установлен соответствующий флаг
WSAEINTR Работа функции была отменена при помощи функции WSACancelBlockingCall
WSAEINPROGRESS Выполняется блокирующая функция интерфейса Windows Sockets
WSAEFAULT Параметр buf указан неправильно (он не указывает на адресное пространство, принадлежащее приложению)
WSAENETRESET Необходимо сбросить соединение
WSAENOBUFS Возникла блокировка буфера
WSAENOTCONN Сокет не подсоединен
WSAENOTSOCK Указанный в параметре дескриптор не является сокетом
WSAESHUTDOWN Сокет был закрыт функцией shutdown
WSAEWOULDBLOCK Сокет отмечен как неблокирующий, но запрошенная операция приведет к блокировке
WSAEMSGSIZE Был использован сокет типа SOCK_DGRAM

(предназначенный для передачи датаграмм). При этом размер пакета данных превышает максимально допустимый для данной реализации интерфейса Windows Sockets

WSAEINVAL Сокет не был подключен функцией bind
WSAECONNABORTED Сбой из-за слишком большой задержки или по другой причине
WSAECONNRESET Сброс соединения удаленным узлом
<


Начало  Назад  Вперед



Книжный магазин