Главная » Просмотр файлов » Н.В. Вдовикина, А.В. Казунин, И.В. Машечкин, А.Н. Техехин - Системное программное обеспечение - взаимодействие процессов

Н.В. Вдовикина, А.В. Казунин, И.В. Машечкин, А.Н. Техехин - Системное программное обеспечение - взаимодействие процессов (1114927), страница 21

Файл №1114927 Н.В. Вдовикина, А.В. Казунин, И.В. Машечкин, А.Н. Техехин - Системное программное обеспечение - взаимодействие процессов (Н.В. Вдовикина, А.В. Казунин, И.В. Машечкин, А.Н. Техехин - Системное программное обеспечение - взаимодействие процессов) 21 страницаН.В. Вдовикина, А.В. Казунин, И.В. Машечкин, А.Н. Техехин - Системное программное обеспечение - взаимодействие процессов (1114927) страница 212019-05-08СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 21)

Как мы ужеговорили, формат адреса зависит от коммуникационного домена, врамках которого действует сокет, и может представлять собой либо12Заметим, что данный аргумент может принимать не только указанные два значения,например, тип сокета SOCK_SEQPACKET обозначает соединение с установлениемвиртуального канала со всеми вытекающими отсюда свойствами, но при этом сохраняютсяграницы сообщений; однако данный тип сокетов не поддерживается ни в домене AF_UNIX,ни в домене AF_INET, поэтому мы его здесь рассматривать не будем129путь к файлу, либо сочетание IP-адреса и номера порта. Но в любомслучае присвоение связывание сокета с конкретным адресомосуществляется одной и той же функцией bind:#include <sys/types.h>#include <sys/socket.h>int bind (int sockfd, struct sockaddr *myaddr, intaddrlen)Первыйаргументфункции–дескрипторсокета,возвращенный функцией socket(); второй аргумент – указатель наструктуру, содержащую адрес сокета. Для домена AF_UNIX форматструктуры описан в <sys/un.h> и выглядит следующим образом:#include <sys/un.h>struct sockaddr_un {short sun_family; /* == AF_UNIX */char sun_path[108];};Длядомена AF_INET формат структуры<netinet/in.h> и выглядит следующим образом:описанв#include <netinet/in.h>struct sockaddr_in {short sin_family; /* == AF_INET */u_short sin_port;/* port number */struct in_addr sin_addr;char sin_zero[8];/* host IP address *//* not used */};Последний аргумент функции задаетструктуры, на которую указывает myaddr.реальныйразмерВажно отметить, что если мы имеем дело с доменом AF_UNIX иадрес сокета представляет собой имя файла, то при выполнениифункции bind() система в качестве побочного эффекта создаетфайл с таким именем.

Поэтому для успешного выполнения bind()необходимо, чтобы такого файла не существовало к данномумоменту. Это следует учитывать, если мы «зашиваем» в программуопределенное имя и намерены запускать нашу программу несколькораз на одной и той же машине – в этом случае для успешной работыbind() необходимо удалять файл с этим именем перед связыванием.Кроме того, в процессе создания файла, естественно, проверяютсяправа доступа пользователя, от имени которого производится вызов,130ко всем директориям, фигурирующим в полном путевом именифайла, что тоже необходимо учитывать при задании имени.

Еслиправа доступа к одной из директорий недостаточны, вызов bind()завершится неуспешно.В случае успешного связывания bind() возвращает 0, в случаеошибки – -1.7.1.3 Предварительное установление соединения.Сокеты с установлением соединения. Запрос на соединение.Различают сокеты с предварительным установлениемсоединения, когда до начала передачи данных устанавливаютсяадреса сокетов отправителя и получателя данных – такие сокетысоединяются друг с другом и остаются соединенными до окончанияобмена данными; и сокеты без установления соединения, когдасоединение до начала передачи данных не устанавливается, а адресасокетов отправителя и получателя передаются с каждымсообщением. Если тип сокета – виртуальный канал, то сокет долженустанавливать соединение, если же тип сокета – датаграмма, то, какправило, это сокет без установления соединения, хотя последнее неявляется требованием.Для установления соединения служитследующая функция:#include <sys/types.h>#include <sys/socket.h>int connect (int sockfd, struct sockaddr *serv_addr,int addrlen);Здесь первый аргумент – дескриптор сокета, второй аргумент– указатель на структуру, содержащую адрес сокета, с которымпроизводится соединение, в формате, который мы обсуждали выше,и третий аргумент содержит реальную длину этой структуры.Функция возвращает 0 в случае успеха и –1 в случае неудачи, приэтом код ошибки можно посмотреть в переменной errno.Заметим, что в рамках модели «клиент-сервер» клиенту,вообще говоря, не важно, какой адрес будет назначен его сокету, таккак никакой процесс не будет пытаться непосредственно установитьсоединение с сокетом клиента.

Поэтому клиент может не вызыватьпредварительно функцию bind(), в этом случае при вызовеconnect() система автоматически выберет приемлемые значениядля локального адреса клиента. Однако сказанное справедливотолько для взаимодействия в рамках домена AF_INET, в домене131AF_UNIX клиентское приложение само должно позаботиться освязывании сокета.Сервер: прослушивание сокета и подтверждение соединения.Следующие два вызова используются сервером только в томслучае,еслииспользуютсясокетыспредварительнымустановлением соединения.#include <sys/types.h>#include <sys/socket.h>int listen (int sockfd, int backlog);Этот вызов используется процессом-сервером для того, чтобысообщить системе о том, что он готов к обработке запросов насоединение, поступающих на данный сокет.

До тех пор, покапроцесс – владелец сокета не вызовет listen(), все запросы насоединение с данным сокетом будут возвращать ошибку. Первыйаргумент функции – дескриптор сокета. Второй аргумент, backlog,содержит максимальный размер очереди запросов на соединение.ОС буферизует приходящие запросы на соединение, выстраивая их вочередь до тех пор, пока процесс не сможет их обработать. В случаеесли очередь запросов на соединение переполняется, поведение ОСзависит от того, какой протокол используется для соединения.

Есликонкретный протокол соединения не поддерживает возможностьперепосылки (retransmission) данных, то соответствующий вызовconnect() вернет ошибку ECONNREFUSED. Если же перепосылкаподдерживается (как, например, при использовании TCP), ОСпросто выбрасывает пакет, содержащий запрос на соединение, какесли бы она его не получала вовсе. При этом пакет будетприсылаться повторно до тех пор, пока очередь запросов неуменьшится и попытка соединения не увенчается успехом, либопока не произойдет тайм-аут, определенный для протокола.

Впоследнем случае вызов connect() завершится с ошибкойETIMEDOUT. Это позволит клиенту отличить, был ли процесс-серверслишком занят, либо он не функционировал. В большинстве системмаксимальный допустимый размер очереди равен 5.Конкретное соединение устанавливается при помощи вызоваaccept():#include <sys/types.h>#include <sys/socket.h>int accept (int sockfd, struct sockaddr *addr, int*addrlen);132Этот вызов применяется сервером для удовлетворенияпоступившего клиентского запроса на соединение с сокетом,который сервер к тому моменту уже прослушивает (т.е.предварительно была вызвана функция listen()). Вызов accept()извлекает первый запрос из очереди запросов, ожидающихсоединения, и устанавливает с ним соединение. Если к моментувызова accept() очередь запросов на соединение пуста, процесс,вызвавший accept(), блокируется до поступления запросов.Когда запрос поступает и соединение устанавливается,accept() создает новый сокет, который будет использоваться дляработы с данным соединением, и возвращает дескриптор этогонового сокета, соединенного с сокетом клиентского процесса.

Приэтом первоначальный сокет продолжает оставаться в состояниипрослушивания. Через новый сокет осуществляется обмен данными,в то время как старый сокет продолжает обрабатывать другиепоступающие запросы на соединение (напомним, что именнопервоначально созданный сокет связан с адресом, известнымклиентам, поэтому все клиенты могут слать запросы только насоединение с этим сокетом). Это позволяет процессу-серверуподдерживать несколько соединений одновременно. Обычно этореализуется путем порождения для каждого установленногосоединения отдельного процесса-потомка, который занимаетсясобственно обменом данными только с этим конкретным клиентом,в то время как процесс-родитель продолжает прослушиватьпервоначальный сокет и порождать новые соединения (см. Пример28).Во втором параметре передается указатель на структуру, вкоторой возвращается адрес клиентского сокета, с которымустановлено соединение, а в третьем параметре возвращаетсяреальная длина этой структуры.

Благодаря этому сервер всегдазнает, куда ему в случае надобности следует послать ответноесообщение. Если адрес клиента нас не интересует, в качествевторого аргумента можно передать NULL.7.1.4 Прием и передача данных.Собственно для приема и передачи данных через сокетиспользуются три пары функций.#include <sys/types.h>#include <sys/socket.h>int send(int sockfd,unsigned int flags);133constvoid *msg, int len,int recv(int sockfd, void *buf, int len, unsignedint flags);Эти функции используются для обмена только через сокет спредварительно установленным соединением. Аргументы функцииsend(): sockfd – дескриптор сокета, через который передаютсяданные, msg и len - сообщение и его длина.

Если сообщениеслишком длинное для того протокола, который используется присоединении, оно не передается и вызов возвращает ошибкуEMSGSIZE. Если же сокет окажется переполнен, т.е. в его буфере нехватит места, чтобы поместить туда сообщение, выполнениепроцесса блокируется до появления возможности поместитьсообщение. Функция send() возвращает количество переданныхбайт в случае успеха и -1 в случае неудачи. Код ошибки при этомустанавливается в errno. Аргументы функции recv() аналогичны:sockfd – дескриптор сокета, buf и len – указатель на буфер дляприема данных и его первоначальная длина. В случае успехафункция возвращает количество считанных байт, в случае неудачи 113.Последний аргумент обеих функций – flags – можетсодержать комбинацию специальных опций. Нас будут интересоватьдве из них:MSG_OOB – этот флаг сообщает ОС, что процесс хочетосуществить прием/передачу экстренных сообщенийMSG_PEEK – данный флаг может устанавливаться при вызовеrecv().

Характеристики

Список файлов книги

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6367
Авторов
на СтудИзбе
310
Средний доход
с одного платного файла
Обучение Подробнее