После того как канал создан, можно начинать передачу данных. Для передачи данных при помощи протокола гарантированной доставки 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 | Сброс соединения удаленным узлом |
| Код ошибки | Описание |
| WSANOTINITIALISED | Перед использованием функции необходимо вызвать функцию WSAStartup |
| WSAENETDOWN | Сбой в сети |
| WSAENOTCONN | Сокет не подсоединен |
| WSAEINTR | Работа функции была отменена при помощи функции WSACancelBlockingCall |
| WSAEINPROGRESS | Выполняется блокирующая функция интерфейса Windows Sockets |
| WSAENOTSOCK | Указанный в параметре дескриптор не является сокетом |
| WSAESHUTDOWN | Сокет был закрыт функцией shutdown |
| WSAEWOULDBLOCK | Сокет отмечен как неблокирующий, но запрошенная операция приведет к блокировке |
| WSAEMSGSIZE | Размер пакета данных превышает размер буфера, в результате чего принятый пакет был обрезан |
| WSAEINVAL | Сокет не был подключен функцией bind |
| WSAECONNABORTED | Сбой из-за слишком большой задержки или по другой причине |
| WSAECONNRESET | Сброс соединения удаленным узлом |
| Код ошибки | Описание |
| WSANOTINITIALISED | Перед использованием функции необходимо вызвать функцию WSAStartup |
| WSAENETDOWN | Сбой в сети |
| WSAEINVAL | Сокет не был подключен функцией bind |
| WSAEINPROGRESS | Выполняется блокирующая функция интерфейса Windows Sockets |
| Код ошибки | Описание |
| WSAEADDRINUSE | Указанный адрес уже используется |
| WSAEADDRNOTAVAIL | Указанный адрес не доступен |
| WSAEAFNOSUPPORT | Для данного сокета нельзя использовать указанное семейство адресов |
| WSAECONNREFUSED | Попытка установления канала связи была отвергнута |
| WSAEDESTADDRREQ | Необходимо указать адрес получателя пакета |
| WSAEFAULT | Неправильно указан параметр namelen |
| WSAEINVAL | Сокет уже подключен к адресу |
| WSAEISCONN | Сокет уже подсоединен |
| WSAEMFILE | Больше нет доступных дескрипторов |
| WSAENETUNREACH | Из данного узла и в данное время невозможно получить доступ к сети |
| WSAENOBUFS | Нет места для размещения буфера |
| WSAENOTCONN | Сокет на подключен |
| WSAENOTSOCK | Указан дескриптор файла, а не сокета |
| WSAETIMEDOUT | При попытке установления канала связи возникла задержка во времени |
| Код ошибки | Описание |
| WSAENETDOWN | Сбой в сети |
| WSAECONNRESET | Сброс соединения удаленным узлом |
| WSAECONNABORTED | Сбой из-за слишком большой задержки или по другой причине |