Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
metod seti.doc
Скачиваний:
25
Добавлен:
01.04.2025
Размер:
306 Кб
Скачать
☆

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, но позволяют при отправке дейтаграммы задать адрес назначения, а при приеме – получить адрес источника.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]