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

При работе с протоколами, не требующими соединения на сервере, достаточно вызвать функции socket и bind, чтобы связать сокет с портом и адресом. При создании сокета в качестве второго параметра (тип спецификации) указывается флаг SOCKDGRAM. В третьем параметре устанавливается флаг IPPR0T0UDP, что соответствует UDP, или другой флаг протокола, работающего без установки соединения.

После этого нельзя вызывать функции 1 isten или accept, потому что сервер получает данные от клиента без установки соединения. Вместо этого нужно просто ожидать прихода данных с помощью функции recvf гош, которая описывается следующим образом:

function recvfromC s- TSocket, var Buf, len: Integer: flags- Integer: var from: TSockAddr.
var from!en: Integer ): Integer, stdcall:

Первые четыре параметра такие же, как и у функции recv. Параметр from указывает на структуру SockAddr, в ней после выполнения функции будет храниться IP-адрес компьютера, с которого пришли данные. В параметре fromlen заносится размер структуры, указанной в параметре from.

Во второй версии WinSock появилась функция WSARecvFrom, которая похожа на WSA-Recv, только добавлены параметры recv и fromlen. Функция описывается следующим образом:

function WSARecvFrom( s: TSocket;
lpBuffers: LPWSABUF;
dwBufferCount : DWORD;
var lpNumberOfBytesRecvd: DWORD;
var IpFlags: DWORD;
IpFrom: PSockAddr: lpFromlen: Plnteger, lpOverlapped: LPWSAOVERLAPPED;
1 pCompletionRoutfne: LPWSAOVERLAPPED_COMPLETION_ROUTINE ): Integer, stdcall;

Во время приема данных могут возникнуть следующие ошибки:

• WSANOTINITIALISED - сначала необходимо вызвать функцию WSASturtup, а потом создавать сокет;
• WSAENETDOWN - связь нарушена, возможные причины - отошел кабель или произошло отключение от Интернета;
• WSAEFAULT - параметры buf или from не входят в адресное пространство, или параметр fromlen слишком маленький для сохранения адреса;
• WSAEINTR - функцией WSACancelBlockmgCall была прервана блокирующая операция;
• WSAEINPR06RESS выполняется операция в блокирующем режиме. Вы уже запустили на выполнение какую-то функцию и нужно дождаться завершения ее работы;
• WSAEINVAL - указан неизвестный флаг или флаг MSG_00B для сокета с включенной опцией S0_00BINLINE;
• WSAEN0TS0CK - указанный дескриптор не является сокетом;
• WSAEWOULDBLOCK - сокет помечен как неблокирующий, а запрошенная операция будет заблокирована;
• WSAEMSGSIZE - сообщение слишком большое для помещения в буфер и будет урезано;
• WSAETIMEDOUT - время ожидания ответа вышло;

• WSAECONNRESET - виртуальное соединение было закрыто. Для сокетов UDP удаленный хост не распознал предыдущую посылку и ответил сообщением "Port Unreachable* (порт недосягаем). Приложение должно закрыть сокет.

С точки зрения клиента все тоже очень просто. Достаточно только создать сокет - функция connect уже не нужна и можно напрямую направлять данные. Но кому передавать, если нет соединения с сервером? Для передачи данных по сети используется функция sendto, в которой указывается адрес получателя. Вот как она описывается:

function sendtoC
s: TSocket;
var Buf;
len: Integer.
flags: Integer:
var addrto: TSockAddr;
toi en: Integer ). Integer: stdcall :

Первые четыре параметра соответствуют тем, что мы рассматривали в функции send. Параметр addrto - это структура типа SockAddr В ней содержатся адрес и порт компьютера, которому нужно передать параметры Так как в нашем случае нет соединения между клиентом и сервером, то эта информация должна указываться прямо в функции передачи данных. Последний параметр t^rten - это размер структуры to.

Начиная со второй версии мы можем пользоваться функцией WSASendTo У нее параметры такие же, как и у WSASend, только добавлены два новых - 1рТо и iTolen, хранящие структуру с адресом получателя и ее размер Функция WSASendTo описывается следующим образом:

function WSASendTo( s. TSocket: lpBuffers: LPWSABUF;
dwBufferCount: DWORD, var IpNumberOfBytesSent- DWORD : dwFlag : DWORD ; IpTO: PSockAddr;
iTolen- Integer;
IpOverlapped: LPWSAOVERLAPPED;

lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE ). Integer: stdcall, Возможны следующие ошибки во время отправки данных:

о WSANOTINITIALISED - сначала необходимо вызвать функцию WSASturtup а потом создавать сокет;
о WSAENETDOWN - связь нарушена, возможные причины - отошел кабель или произошло отключение от Интернета;
о WSAEFAULT - параметры buf или to не входят в адресное пространство, или параметр toi en слишком маленький для сохранения адреса;
о WSAEINTR - функцией WSACancelBlockingCall была прервана блокирующая операция;
о WSAEINPROGRESS - выполняется операция в блокирующем режиме. Вы уже запустили на выполнение какую-то функцию и нужно дождаться завершения ее работы;
• WSAEINVAL - указан неизвестный флаг или флаг MSG_00B для сокета с включенной опцией S0 00BINLINE;
• WSAENOBUFS - нет доступных буферов;
• WSAEN0TS0CK - указанный дескриптор не является сокетом;
• WSAEWOULDBLOCK - сокет помечен как неблокирующий, а запрошенная операция будет заблокирована;
• WSAEMSGSIZE - сообщение слишком большое для помещения в буфер и будет урезано;
• WSAETIMEDOUT - время ожидания ответа вышло;
• WSAECONNRESET - виртуальное соединение было закрыто. Для сокетов UDP удаленный хост не распознал предыдущую посылку и ответил сообщением "Port Unreachable* (порт недосягаем). Приложение должно закрыть сокет;
• WSAEADDRNOTAVAIL - указанный адрес не доступен с локальной машины;
• WSAEAFNOSUPPORT - адрес в указанной системе не может быть использован с этим сокетом;
• WSAEDESTADDRREQ - требуется адрес назначения;

• WSAENETUNREACH - сеть не доступна с локальной машины в данный момент.

Как видите, работа с протоколами, не требующими соединения, еще проще. Не надо вызывать функции прослушивания порта и соединения с сервером. Если вы разберетесь с работой протокола TCP, то работа UDP вам будет уже понятна.

4.8. Завершение соединения || Оглавление || 4.10. Создание ТСР-сервера


Delphi в шутку и всерьез: что умеют хакеры



Новости за месяц

  • Декабрь
    2021
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31