Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Сало залік.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
133.43 Кб
Скачать
  1. Встановлення зв’язку за допомогою сокета

Установка соединения на стороне сервера состоитизчетырёхэтапов, ни один изкоторых не можетбытьопущен. Сначаласокетсоздаётся и привязывается к локальному адресу. Есликомпьютеримеетнесколькосетевыхинтерфейсов с различными IP-адресами, вы можете приниматьсоединениятолько с одного из них, передав его адрес функцииbind. Если же выготовысоединяться с клиентами через любойинтерфейс, задайте в качестве адреса константуINADDR_ANY. Чтокасается номера порта, вы можете задатьконкретный номер или 0 (в этомслучае система сама выберетпроизвольныйнеиспользуемый в данный момент номер порта).

На следующемшагесоздаётсяочередьзапросов на соединение. При этомсокетпереводится в режим ожиданиязапросовсостороныклиентов. Всё этовыполняетфункция listen.

intlisten(intsockfd, intbacklog);

Первый параметр - дескриптор сокета, а второйзадаётразмерочередизапросов. Каждый раз, когдаочереднойклиентпытаетсясоединиться с сервером, егозапросставится в очередь, так как сервер можетбытьзанятобработкой других запросов. Еслиочередьзаполнена, все последующиезапросыбудутигнорироваться. Когда сервер готов обслужить очереднойзапрос, он используетфункцію accept.

#include<sys/socket.h>

intaccept(intsockfd, void *addr, int *addrlen);

Функция accept создаёт для общения с клиентом новый сокет и возвращаетего дескриптор. Параметр sockfd задаёт слушающийсокет. Послевызова он остаётся в слушающемсостоянии и можетприниматьдругиесоединения. В структуру, на которуюссылается addr, записывается адрес сокетаклиента, которыйустановилсоединение с сервером. В переменную, адресуемуюуказателем addrlen, изначальнозаписываетсяразмерструктуры; функция accept записывает тудадлину, которая реально былаиспользована. Если вас не интересует адрес клиента, вы можете просто передать NULL в качествевторого и третьегопараметров.

На сторонеклиента для установлениясоединенияиспользуетсяфункция connect, котораяимеетследующий прототип.

#include<sys/types.h>

#include<sys/socket.h>

intconnect(intsockfd, structsockaddr *serv_addr, intaddrlen);

Здесь sockfd - сокет, которыйбудетиспользоваться для обменаданными с сервером, serv_addr содержит указатель на структуру с адресом сервера, а addrlen - длинуэтойструктуры. Обычносокет не требуетсяпредварительнопривязывать к локальному адресу, так какфункция connect сделает это за вас, подобравподходящийсвободный порт. Вы можете принудительно назначить клиентскомусокетунекоторый номер порта, используя bind перед вызовом connect. Делатьэтоследует в случае, когда сервер соединяется с только с клиентами, использующимиопределённый порт (примерами таких серверовявляютсяrlogind и rshd).

  1. Прив’язка сокета до локальних імен

Для явного связываниясокета с некоторым адресом используетсяфункция bind. Её прототип имеет вид:

#include<sys/types.h>

#include<sys/socket.h>

intbind(intsockfd, structsockaddr *addr, intaddrlen);

В качествепервого параметра передаётся дескриптор сокета, которыймыхотимпривязать к заданному адресу. Второй параметр, addr, содержитуказатель на структуру с адресом, а третий - длинуэтойструктуры. Посмотрим, чтоонасобойпредставляет.

structsockaddr {

unsignedshortsa_family; // Семействоадресов, AF_xxx

charsa_data[14]; // 14 байтов для хранения адреса

};