27.3.3. Установление связи с удаленным компьютером
27.3.3. Установление связи с удаленным компьютером
Устанавливать связь можно как на стороне сервера, так и на стороне клиента. На стороне клиента используется только один вызов — connect(), который «спрашивает» у сервера: «Могу ли я подключиться?», то есть передает запрос на установление соединения. На сервере используются функции:
? listen() — ожидание клиента;
? accept() — подтверждение запроса клиента на установление соединения.
Сервер должен постоянно прослушивать сокет — ожидать новых клиентов. Как только новый клиент посылает запрос на установление соединения, сервер может либо разрешить ему подключиться (connect), либо запретить (например, если сервер уже обслуживает другого клиента).
Функция listen()
Вызов listen() «заставляет» программу-сервер работать в режиме ожидания запроса на соединение от клиента. Прототип этой функции следующий:
#include <sys/socket.h>
extern int listen (int __fd, int __n) __THROW;
Первый параметр — это дескриптор сокета, а второй — максимальное количество запросов на установление связи (другими словами, максимальное количество клиентов).
Как и функция bind(), функция listen() в случае успеха возвращает 0. Пример вызова функции:
if (listen (sock1, 3) != 0) {
printf("Ошибка при вызове listen(sock1, 3) ");
exit(1);
}
Функция connect()
Используется программой-клиентом для отправки запроса на подключение к серверу. Прототип функции следующий:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
extern int connect (int __fd, struct sockaddr_in *addr,
socklen_t __len) __THROW;
Первый параметр — это дескриптор сокета, созданного функцией socket() и привязанного функцией bind(). Привязку сокета функцией bind() выполнять не обязательно: если сокет не был привязан до вызова connect(), привязка будет выполнена автоматически.
Второй параметр — это указатель на структуру типа sockaddr_in, содержащую информацию о сервере: его IP-адрес, номер порта, а также семейство протоколов.
Последний параметр — это размер структуры sockaddr_in в байтах. В случае успеха функция возвращает 0, а в случае ошибки —1.
Вот пример использования вызова connect:
struct sockaddr_in server;
struct hostent *h;
...
// определяем IP-адрес сервера
h = gethostbyname("server.domain.ru");
memcpy((char*)&server.sin_addr, h->h_addr, h->h_length);
// Определяем порт сервера
server.sin_port = 1234;
// Определяем семейство протоколов
server.sin_family = AF_INET;
// Вызов функции connect()
connect(sock, &server, sizeof(server));
Если вы используете режим без установления соединения (SOCK_DGRAM), вызов connect() необязателен.
Функция accept()
Если максимальное число клиентов не превышено, сервер может принять запрос клиента. Для этого используется функция accept(). Данная функция используется только при работе в режиме с установлением соединения. Прототип функции следующий:
#include <sys/socket.h>
#include <netinet/in.h>
extern int accept(int __fd, struct sockaddr_in *addr,
socklen_t *__restrict __len) __THROW;
Первый параметр — это дескриптор сокета, второй — указатель на структуру, где можно разместить адрес клиента, причем данную структуру инициализировать не нужно. Последний параметр — размер структуры, указанной во втором параметре.
Системный вызов accept() работает так. Сначала он извлекает из очереди listen() запрос на соединение и создает новый сокет, через который будет производиться обмен данными с клиентом, например:
// получаем сокет клиента
sock2 = accept(sock1, &client, &ans_len);
// передаем клиенту информацию
write(sock2, MSG_TO_SEND, sizeof(MSG_TO_SEND));
Если вызов accept() завершился успехом, структура addr, задаваемая во втором параметре, будет содержать IP-адрес клиента.
Если очередь listen() пуста, то наш сервер будет ожидать появления нового клиента. В случае ошибки функция accept() возвращает отрицательное значение.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Установление клиентского соединения с сервером
Установление клиентского соединения с сервером Если имеется сервер с сокетом в режиме прослушивания, клиент может соединиться с ним при помощи функции connect. int connect(SOCKET s, LPSOCKADDR lpName, int nNameLen); Параметрыs — сокет, созданный с использованием функции socket.lpName — указатель на
2.6. Установление и завершение соединения TCP
2.6. Установление и завершение соединения TCP Чтобы облегчить понимание функций connect, accept и close и чтобы нам было легче отлаживать приложения TCP с помощью программы netstat, мы должны понимать, как устанавливаются и завершаются соединения TCP. Мы также должны понимать диаграмму
2.8. Установление и завершение ассоциации SCRIPT
2.8. Установление и завершение ассоциации SCRIPT Протокол SCRIPT ориентирован на установление соединения, подобно TCP, поэтому он также имеет собственные процедуры рукопожатия и завершения. Однако рукопожатия SCRIPT отличаются от рукопожатий TCP, поэтому мы описываем их
Установление соединения по запросу
Установление соединения по запросу При работе на отдельной рабочей станции или компьютере необходимость использовать специальную программу установления взаимодействия или вручную запускать соответствующий сценарий практически не мешает работе. Если же
Установление соединения
Установление соединения Соединение между двумя маршрутизаторами FreeS/WAN устанавливается следующим образом: на одной стороне программа ipsec запускается в режиме демона, а на другой стороне та же программа используется для инициализации соединения. Если настройка
Глава 28 Доступ к удаленным компьютерам
Глава 28 Доступ к удаленным компьютерам Мы уже неоднократно упоминали о том, что любая UNIX-подобная операционная система может удаленно администрироваться и конфигурироваться. Говорили мы и о возможности удаленной работы на компьютере под управлением Linux, а также и об
Работа с удаленным помощником
Работа с удаленным помощником Допустим, что вы еще не совсем опытный пользователь, и у вас то и дело возникают всякие трудности. Вы уже успели до чертиков надоесть своему другу, которому приходится бегать к вам через весь город и делать за вас элементарные вещи. И вот
Подключение к удаленным рабочим столам и приложениям RemoteApp
Подключение к удаленным рабочим столам и приложениям RemoteApp С помощью этого механизма вы можете влиять на используемые удаленные подключения, а также создавать новые подключения. Подобный подход очень удобен тем, что позволяет управлять удаленным рабочим местом или
2.6.3. Установление соответствия
0
Установление доверия
Установление доверия Вы сами удостоверяете сертификаты. Но вы также доверяете людям. Поэтому вы можете доверить людям и право удостоверять сертификаты. Как правило, если только владелец сам не вручил вам копию ключа, вы должны положиться на чьё-то чужое мнение о его
5.3.1 Установление требований к качеству
5.3.1 Установление требований к качеству Целью начальной стадии является установление требований в терминах характеристик качества и возможных комплексных показателей (подхарактеристик). Требования выражают потребности внешнего окружения для рассматриваемой
6 УСТАНОВЛЕНИЕ СТРАТЕГИИ ДОКУМЕНТИРОВАНИЯ
6 УСТАНОВЛЕНИЕ СТРАТЕГИИ ДОКУМЕНТИРОВАНИЯ Стратегии документирования, подготовленные и отслеживаемые главной администрацией, обеспечивают руководства для ответственных лиц, принимающих решения на всех нижних уровнях. Стратегия обеспечивает главное направление, но
8 УСТАНОВЛЕНИЕ ПРОЦЕДУР ДОКУМЕНТИРОВАНИЯ
8 УСТАНОВЛЕНИЕ ПРОЦЕДУР ДОКУМЕНТИРОВАНИЯ Должны быть установлены процедуры для применяемых в организациях стратегий документирования.Процедуры определяют последовательность документирования: планирование; подготовка;конфигурационное управление; проверка;
Установление идентичности в компьютерных сетях
Установление идентичности в компьютерных сетях В отличие от привыкших доверять друг другу людей, проблема установления идентичности в компьютерных сетях основана не на случайных признаках (например, как выглядит человек, каковы его характерные черты и т. д.). Она