Главная » Просмотр файлов » Сетевое программирование в Linux

Сетевое программирование в Linux (1119562)

Файл №1119562 Сетевое программирование в Linux (Сетевое программирование в Linux)Сетевое программирование в Linux (1119562)2019-05-09СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла

Сетевое программирование в LinuxDMVN CorporationПоследнее обновление: 15 мая 2006 г.Данный материал был написан после прослушивания курса лекций по программированию на МехМате, читаемого В. В. Борисенко, а в частности, раздела, посвященного программированию сетей. Написанное здесь призвано внести дополнительную ясностьв излагаемый на лекциях материал. Оно, конечно, не претендует на полноту, но отзывы некоторых читателей первого издания позволяют судить о том, что его достаточно для понимания основ интерфейса сокетов и самостоятельного написания программ.

Однаков этой редакции мы решили добавить полный исходный текст примера программы, а также слегка переработали теоретическуючасть.Если что-то, на Ваш взгляд, здесь написано неудачно или, того хуже, непонятно, предлагайте свои варианты, задавайте вопросыи т.

п. Однако, хочется ещё раз подчеркнуть, что это не полное руководство по TCP/IP! Ежели бы оно таковым являлось, это былабы не одна сотня страниц сухой документации, прочесть и переварить которую неподготовленному читателю за короткий срокневозможно. Таких целей авторы и не преследовали. Главное, чтобы после прочтения данного текста у читателя исчезали проблемыпри написании несложных сетевых программ.Последняя компиляция: 15 мая 2006 г.Обновления документа — на сайтах http://dmvn.mexmat.net,http://dmvn.mexmat.ru.Об опечатках и неточностях пишите на dmvn@mccme.ru.1. ВведениеМы ограничимся рассмотрением протокола TCP/IP, а точнее, его разновидности, ориентированной на установку соединения (connection-oriented).

Здесь будет рассмотрен пример программы типа клиент-сервер, а такжеобъяснено назначение основных функций интерфейса сокетов для сетевого взаимодействия в ОС Linux.Замечание. Практически без изменений весь код переносится под ОС Windows. Принципиальное отличие,пожалуй, лишь в том, что там необходима инициализация библиотеки Windows Sockets функцией WSAStartup().2. Протокол TCP/IP2.1.

Общие сведенияПрименительно к сетям, протокол — это набор правил передачи данных по сети. TCP/IP (TransmissionControl Protocol/Internet Protocol) является протоколом транспортного уровня, т. е. для программиста не имеетзначения, каким образом происходит соединение — через модем, беспроводную сеть или обычный ethernet-кабель. Более того, TCP/IP гарантирует доставку данных, и нам не нужно заботиться о том, получил ли адресатвсё то, что мы ему отправили. Размер отправляемых сообщений (их обычно называют пакетами) практическине ограничен, несмотря на то, что большинство низкоуровневых протоколов могут отправлять и приниматьданные кусками не более полутора килобайт. Поэтому использовать TCP/IP достаточно просто.2.2.

Адресация и портыЧтобы осуществлять сетевой обмен данными, нужно знать адрес того компьютера, которому предназначается сообщение.1 Адрес компьютера — это некоторый уникальный номер, однозначно определяющий данныйкомпьютер в сети. Каждому компьютеру присваивается 4-байтовый номер, называемый IP-адресом. Таким образом, всего существует 232 , т.

е. примерно 4 миллиарда различных IP-адресов. Этого вполне достаточно, чтобыоднозначно идентифицировать все станции даже в глобальной сети.2Поскольку часто на одном компьютере работает несколько сетевых программ, хотелось бы, чтобы они поменьше мешали друг другу. Для этого придумали так называемые порты. Каждая программа выбирает себекакой-нибудь уникальный порт (а всего их 65536), и тогда данные, передаваемые по всем остальным портам,нашей программе мешать не будут.

Наоборот, если мы посылаем данные в определённый порт, то все остальные1 Большинство протоколов низкого уровня позволяют осуществлять широковещательную рассылку данных, при которой сообщения доставляются всем компьютерам сети. В рассматриваемой нами разновидности TCP/IP такой возможности нет.2 На самом деле, в недалёком будущем проблемы с уникальностью адресов начнутся. Есть проекты по переходу на 6-байтовыеадреса, но пока никаких реальных изменений не произошло.1программы, не использующие наш порт, не получат эти данные.

Таким образом, можно ввести понятие адреса «конечной точки соединения», характеризуемого парой чисел (IP, Port). Эту пару мы будем в дальнейшемназывать просто адресом.2.3. Механизм сокетовОдним из главных понятий в TCP/IP (с точки зрения программиста) является сокет (socket, гнездо).Чтобы понять, что это такое и как оно работает, представим себе обычную почтовую систему.

Когда мы пишем письмо, мы кладём его текст в конверт (записываем данные в буфер для отправки), на конверте пишем адрес (вызываем функцию bind()), а затем кладём письмо в почтовый ящик, т. е. вызываем функциюwrite(Socket, Buffer, Length). Вот только получение почты происходит несколько необычно: мы приходимв отделение связи с конвертом, на котором написан какой-то адрес. Если по этому адресу пришло письмо, тоего положат в наш конверт, а если на наш адрес ничего не пришло, то мы, подождав немного (т. е. пройдет такназываемый timeout ), уйдём домой с пустым конвертом.Замечание.

Пусть читатель ничего не знает о функциях bind и write. Об их параметрах будет сказанониже, а в данном разделе была предпринята попытка построить аналогию с реальной жизнью.Короче говоря, можно считать, что сокет — это вся почтовая система вместе с почтовым транспортом,ящиками и т. д. Отличие заключается только в том, что писать адрес получателя на конверте нужно толькоодин раз, поскольку получатель у нас один и тот же. Кроме того, само «отделение связи» ведёт себя достаточнопассивно, т.

е. проверять наличие почты приходится самостоятельно.С точки зрения операционной системы Linux, сокет является файловым дескриптором и по сути ничем неотличается от файла. Вообще, в Linux/Unix весь ввод-вывод реализован через файловые дескрипторы. Именнопоэтому для чтения и записи данных гнезда используются функции потокового ввода-вывода read и write,а с точки зрения программиста объект-сокет есть переменная целочисленного типа (int), хранящая номердескриптора.2.4. Система клиент-серверНадо сказать, что соединение двух и более компьютеров с помощью TCP/IP не является полностью равноправным.

Среди них выберем один и назовём его сервером, а остальные — клиентами. Пусть клиентов n штук.Тогда процесс соединения выглядит так: сервер ждёт подключений извне (вызывает функцию listen), а клиенты (предполагается, что они знают адрес сервера), посылают ему запрос на соединение (функция connect).При этом каждый клиент использует по одному сокету, настроенному на адрес сервера, а сервер используетодно гнездо для прослушивания входящих соединений и ещё n гнёзд для общения с каждым из клиентов.3. Установка соединенияВ этом разделе будет подробно описано, как установить связь сервера и клиента. Для простоты во всехфрагментах кода, приводимых далее, опущена проверка ошибок, заключающаяся в том, что нужно проверятькоды возврата системных функций.

Если они возвращают какие-то отрицательные значения, значит, что-то нетак и нужно принять меры по обработке этих ошибок.Также хотелось бы отметить, что, конечно, нет никакой необходимости запоминать всю последовательностьвызовов системных функций в процессе соединения и их параметры — для этого есть справочные системытипа MSDN (Microsoft Developer Network). Но один раз проследить за процессом соединения по шагам весьмаполезно.В следующих двух подразделах фактически приводятся фрагменты кода программ (серверной и клиентскойсоответственно), снабжённые развернутыми комментариями.

Если собрать все эти строчки воедино, не меняяих порядка, поместить в функцию main() и объявить все переменные, должно заработать. Тут, правда, ничегоне сказано о заголовочных файлах; по этому поводу лучше посмотреть пример.Замечание. В ОС Windows с include’ами всё проще. Там один-единственный файл winsock.h.Для начала нужно выбрать номер порта, на котором мы будем работать. Он является общим для клиентаи сервера. Поэтому запасём переменную (точнее, константу) Port, назначив ей какое-то ненулевое значение,например, 5678.3.1.

Серверная часть3.1.1. Установка обработчика сетевых ошибокПрежде всего, нужно помнить, что несмотря на всякие гарантии доставки пакетов любая сеть очень ненадёжна по своей природе. В самом деле, что будет, если злоумышленник перережет провод, по которому передается2информация государственной важности, а мы об этом ничего не узнаем? Нам нужно уметь контролировать сетевые ошибки. Для этого существует функция signal, устанавливающая функцию-обработчик на определённыйтип события (в нашем случае разрыв соединения). Это делается в самом начале программы так:if (signal(SIGPIPE, &SigHandler) == SIG_ERR){ fprintf(stderr, "Error: cannot set signal handler!\n"); return 0; }Здесь SigHandler — функция такого вида: void SigHandler(int SigID), а системная константа SIGPIPE указывает на тип обрабатываемой ошибки.

Внутри обработчика нужно как-то сообщить пользователю о том, чтосоединение накрылось, и завершить программу.3.1.2. Прослушивающее гнездоТеперь нужно создать гнездо, которое будет принимать входящие подключения. Это делается при помощифункции socket. Объявим переменную int s0; и создадим гнездо:s0 = socket(AF_INET, SOCK_STREAM, 0);Здесь AF_INET указывает на тип используемой адресации, SOCK_STREAM говорит о том, что создаётся гнездодля двустороннего соединения и предназначенное для потоковой передачи данных, т. е. без ограничения размера пакетов (помните ругательство «connection-oriented»?). При этом сокет напоминает 2 трубы, в одну изкоторых заливают воду (данные), а из другой трубы данные выливаются. Эти потоки воды могут, разумеется,приостанавливаться, но в целом передача данных имеет непрерывный характер.

Последний нулевой параметрфункции указывает на использование протокола по умолчанию, т. е. того, который является стандартным дляданного типа гнезда.Сейчас мы сделаем так, чтобы наше гнездо «прослушивало» сеть и ловило все входящие подключения (отлюбых адресов). Для этого настроим гнездо на произвольный адрес, определяемый специальной константой INADDR_ANY. Адрес определяется структурой типа sockaddr_in. Вот кусок кода, привязывающий сокет кпроизвольному адресу:sockaddr_in MyAddr;memset(&MyAddr, 0, sizeof(sockaddr_in));MyAddr.sin_family = AF_INET;MyAddr.sin_port = htons(Port);MyAddr.sin_addr.s_addr = htonl(INADDR_ANY);bind(s0, (sockaddr*) &MyAddr, sizeof(MyAddr));Здесь мы объявляем переменную MyAddr, чистим память, которую эта переменная занимает (на всякийслучай), после чего устанавливаем уже знакомый тип адреса AF_INET, выбираем какой-нибудь порт и устанавливаем «произвольный» адрес.

Затем вызовом функции bind прикрепляем адрес к сокету. Вспоминая аналогиюс почтовой системой, мы получаем следующую картину: когда мы придём на почтовый узел и увидим, что нампришло письмо, то нам его отдадут независимо от того, кто его отправил.Следующие строки настраивают гнездо так, что если вызывается функция закрытия гнезда (прекращениясвязи), а у него есть ещё какое-то количество неотправленных данных, то система сперва постарается их отправить в течение некоторого времени и только потом закроет гнездо.

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

Тип файла PDF

PDF-формат наиболее широко используется для просмотра любого типа файлов на любом устройстве. В него можно сохранить документ, таблицы, презентацию, текст, чертежи, вычисления, графики и всё остальное, что можно показать на экране любого устройства. Именно его лучше всего использовать для печати.

Например, если Вам нужно распечатать чертёж из автокада, Вы сохраните чертёж на флешку, но будет ли автокад в пункте печати? А если будет, то нужная версия с нужными библиотеками? Именно для этого и нужен формат PDF - в нём точно будет показано верно вне зависимости от того, в какой программе создали PDF-файл и есть ли нужная программа для его просмотра.

Список файлов учебной работы

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