- •3.2. Протокол доставки пользовательских дейтаграмм udp
- •5. Рабочее задание и указание к его выполнению
- •Цель работы
- •Подготовка к работе
- •Стек протоколов tcp/ip
- •3.1. Протокол межсетевого взаимодействия ip, формат ip пакета.
- •3.2. Протокол доставки пользовательских дейтаграмм udp.
- •3.3. Протокол надежной доставки сообщений tcp
- •Int wsaStartup(word wVersionRequested, lpwsadata lpWsaData);
- •Программирование по схеме “клиент-сервер” с использованием интерфейса Windows Sockets
- •Int wsaCleanup(void);
- •Int wsaGetLastError(void);
- •Socket socket(int af, int type, int protocol);
- •Int closesocket(socket sock);
- •Char far * inet_ntoa(struct in_addr in);
- •#Define h_addr h_addr_list[0]
- •Int bind(socket s, const struct sockaddr far *name, int namelen);
- •Int listen(socket sock, int backlog);
- •Socket accept(socket s, struct sockaddr far *addr, int far * addrlen);
- •Void ExitThread(uint fuExitCode);
- •Bool TerminateThread(handle hThread, dword dwExitCode);
- •Connect (socket s, const struct sockaddr *peer, int peer_len);
- •Передача и приём данных.
- •Int sendto(socket s,const void* buf, size_t len, int flags,
- •Int recvfrom(socket s,void* buf,size_t len, int flags,
- •Алгоритм построения клиента и сервера.
- •5. Рабочее задание и указание к его выполнению.
- •Содержание отчёта.
- •Вопросы для самопроверки.
- •8. Библиографический список
Connect (socket s, const struct sockaddr *peer, int peer_len);
Возвращаемое значение: 0 – нормально, -1 (UNIX) или не 0 (Windows) – ошибка. Параметр s – дескриптор сокета, который вернул системный вызов функции socket. Параметр peer указывает на структуру, в которой хранится адрес удаленного хоста и некоторая дополнительная информация (см. выше). Для домена AF_INET – это структура SOCKADDR_IN. Параметр peer_len содержит размер структуры в байтах, на которую указывает peer. При удачном завершении функции connect можно немедленно приступать к обмену данными с сервером.
Пример использования функции connect для установления соединения с сервером.
void SetConnection(…) {
SOCKADDR_IN dest_sin; SOCKET clnt_socket; // создаем сокет clnt_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // устанавливаем адрес и порт запрашиваемого сервера dest_sin.sin_family = AF_INET; dest_sin.sin_addr.s_addr = inet_addr(“127.0.0.1”); dest_sin.sin_port = htons(1024); // посылаем запрос на соединение с сервером if(connect(clnt_sock,(PSOCKADDR)&dest_sin,sizeof(dest_sin)) == SOCKET_ERROR) MessageDlg("Failed",mtError,TMsgDlgButtons()<<mbOK, 0);
…………………………………….
} |
Использование IP-адреса 127.0.0.1 делает возможным запускать и клиент, и сервер на одном компьютере (что очень удобно для тестирования приложения). Для эффективной и надежной работы соединения типа клиент-сервер, необходимо сигнализировать одну из сторон при разрыве соединения, а также в определенном порядке запускать приложения(первым запускается приложение-сервер).
Передача и приём данных.
Если узлы обмениваются данными с использованием дейтаграммного протокола UDP, им не требуется создавать канал данных, поэтому процедура инициализации получается проще, чем в случае с использование протокола гарантированной доставки TCP.
Для обмена данными по протоколу TCP используют функции send и recv.
send(SOCKET s, const void* buf, size_t len, int flags);
recv(SOCKET s, void* buf, size_t len, int flags);
Возвращаемое значение: число принятых или переданных байтов в случае успеха или -1 в случае ошибки.
Параметр s определяет сокет на который данные должны быть поставлены в очередь для обмена(для сервера: сокет созданный функцией accept при установлении соединения), buf указывает на данные для обмена, len – определяет длину буфера. Значение параметра flags зависит от системы, но и UNIX, и Windows поддерживают следующие флаги:
MSG_OOB |
следует послать или принять срочные данные; |
MSG_PEEK |
Используется для просмотра поступивших данных без их удаления из приемного буфера. После возврата из системного вызова данные еще могут быть получены при последующем вызове recv. |
MSG_DONTROUTE |
сообщает ядру, что не надо выполнять обычный алгоритм маршрутизации. Как правило, используется программами маршрутизации или для диагностических целей. |
Для создания простого приложения использующего протокол TCP вам ничего больше не понадобиться. Но при работе с UDP нужны еще системные вызовы recvfrom и sendto. Они очень похожи на recv и send, но позволяют при отправке дейтаграммы задать адрес назначения, а при приеме – получить адрес источника.
