Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Лабораторная работа №1 Работа с сокетами БерклиСодержание книги
Похожие статьи вашей тематики
Поиск на нашем сайте
Лабораторная работа №1 выполняется после изучения материала, посвященного описанию принципов работы с сокетами Беркли. Цель работы: написать консольные приложения на языке C/C++, реализующие работу протоколов Time, DayTime и Finger. Рекомендуемая литература: Глава 1 Работа с WinSocket данного пособия. Снайдер Й. Эффективное программирование TCP/IP. Библиотека программиста. – Спб: Питер, 2002. – 230 с.: ил. Электронный вариант лекций «Основы операционных систем. Практикум». Лекция 10 «Семейство протоколов TCP/IP. Сокеты (sockets) в UNIX и основы работы с ними». Лекции можно найти в архиве, в файле osintropractice.zip. Описание протокола Time в спецификации RFC-868 (Archive\Documents\ RFC\rfc868.txt) Описание протокола Finger в спецификации RFC-1288 (Archive\Documents\RFC\rfc1288.txt) Примитивы сокетов Беркли Сокет обычно трактуется как дескриптор файла и указывается в качестве параметра практически во всех примитивах. Примитивы сокетов для TCP SOCKET (гнездо) Дескриптор сокета, именование ресурса BIND (связать) Связывает ресурсы (сокет) с локальным адресом хоста LISTEN (ожидать) Возможность принять данные с указанием размера очереди ACCEPT (принять) Блокирует сервер до попытки соединения клиента CONNECT (соединить) Попытка установить соединения SEND (переслать) Посылает данные по соединению RECEIVE (получить) Получает данные у соединения CLOSE (закрыть) Разрывает соединение на стороне сервера и клиента примитивы используются в следующем порядке: Сторона сервера: Вызовы примитивов осуществляются в следующем порядке: SOCKET - создает дескриптор (примерно так же как OPEN при открытии файла) и выделяет для него место в таблице транспортного объекта. При этом сообщается, какая служба необходима, канальная (TCP) или дейтаграммная (UDP). BIND – привязывает конкретный сетевой адрес к сокету, после чего становится возможной подключение клиентов. LISTEN – выделяет место для очереди входящих вызовов на случай одновременного обращения нескольких клиентов. ACCEPT – сервер переходит в режим ожидания (блокируется) до прихода блока с запросом соединения от клиента. При этом создается новый сокет, с теми же параметрами, что и оригинального сокета. Сервер может распараллелить процесс обработки нового сокета, что бы иметь возможность вернуться к ожиданию новых соединений. Сторона клиента: SOCKET - аналогично серверу. CONNECT – блокирует вызывающего до завершения процесса фазы установки соединения, т.е. до подтверждения сервера, что соединение установлено. Далее между сервером и клиентом идет обмен с использованием RECEIVE и SEND. Соединение разрывается, если обе стороны используют примитив CLOSE. Примечание. Для того чтобы выполнить преобразование символьного имени сервера или IP-адреса, в формат, используемый при работе с сетевыми функциями, следует использовать функции gethostbyname и inet_addr соответсвенно. Также, следует помнить, что аргументы и типы приведённых выше функций, могут различаться в разных ОС, поэтому, для получения более полной информации следует воспользоваться системой помощи в данной системе (команда man в UNIX или MSDN в Windows). При работе с сокетами в Windows, не забывайте подгрузить, а по окончании работы выгрузить библиотеку реализующую поддержку сокетов через функции WSAStartup/WSACleanup. Протокол передачи времени Time Данный протокол предназначен для передачи показаний времени по сети. В сети работают так называемые time-серверы, у которых можно запросить точное время. В ответ на запрос клиента, сервер возвращает время в секундах (32х битное двоичное число), прошедшее с 00:00:00 1 января 1900 года. Этот протокол может использовать в качестве транспортной службы как UDP-протокол, так и TCP-протокол. Стандартный порт протокола - 37. Если в качестве транспортной службы используется TCP, взаимодействие осуществляется так: SERVER: прослушивает 37 порт, ожидая соединений; CLIENT: запрашивает соединение с портом 37 сервера; SERVER: посылает время в виде двоичного 32х битного числа; CLIENT: получает время; SERVER: закрывает соединение; CLIENT: закрывает соединение; Если сервер по каким-либо причинам не может определить время на своей стороне, он отказывается от соединения, не посылая ничего. Если в качестве транспортной службы используется UDP, взаимодействие осуществляется так: SERVER: прослушивает 37 порт, ожидая соединений; CLIENT: посылает серверу пустой UDP-пакет, номер порта = 37; SERVER: получает пустой UDP-пакет; SERVER: посылает UDP-пакет, содержащий время в виде двоичного 32х битного числа; CLIENT: получает UDP -пакет, содержащий время; Если сервер по каким-либо причинам не может определить время на своей стороне, он отбрасывает полученный пустой UDP-пакет и не посылает ничего в ответ. Протокол Finger Сетевой протокол Finger предназначен для предоставления информации о пользователях удалённого компьютера. Стандартный порт протокола - 79. Используя данный протокол, вы можете получить данные о списке пользователей, которые работают в данный момент на интересующей вас ЭВМ, о конкретном пользователе (дата последнего сеанса входа в систему и т.д.), о списке загруженных задач, о типах интерфейсов (например, терминалов). Протокол Finger обеспечивает интерфейс для удаленной информационной программы пользователя (RUIP - Remote User Information Program). Данный протокол базируется на TCP. Локальная ЭВМ осуществляет TCP-соединение с удаленным узлом через указанный порт. После этого становится доступной программа RUIP и пользователь может посылать ей свои запросы. Каждый запрос представляет собой строку текста. RUIP, получив запрос, анализирует его и присылает ответ, после чего соединение закрывается. Любые пересылаемые данные должны иметь формат ASCII, не иметь контроля по четности и каждая строка должна завершаться последовательностью CRLF (ASCII 13, за которым следует ASCII 10). Диалог двух машин через TCP выглядит следующим образом: SERVER: слушает порт 79; CLIENT: устанавливает соединение на 79 порт; CLIENT: посылает имя пользователя; SERVER: посылает информацию о запрашиваемом пользователе; CLIENT: принимает; SERVER: закрывает соединение; CLIENT: закрывает соединение; Пример реализации протокола Daytime В качестве примера, приводится текст программы, реализующей работу Daytime Protocol’а.
#include <sys/types.h> #include <sys/socket.h> #include <sys/param.h> #include <sys/time.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <string.h> #include <netdb.h> #include <memory.h> #include <unistd.h> #include <time.h> #define strHost "212.192.122.109" #define Port 13 int main(void) { int s, res; int nCharRecv; struct sockaddr_in clnt_sin; char timebuf[128]; if ((s=socket(AF_INET, SOCK_STREAM, 0)) == -1) { printf("Cannot create socket!!!!\n"); return -1; } memset ((char *)&clnt_sin, '\0', sizeof(clnt_sin)); clnt_sin.sin_family = AF_INET; clnt_sin.sin_addr.s_addr = inet_addr(strHost); clnt_sin.sin_port = htons(Port); res = connect (s, (struct sockaddr *)&clnt_sin, sizeof(clnt_sin)); if (res == -1) { perror("connect"); } else { printf("Connected\n"); } memset(timebuf, '\0', 128); nCharRecv = recv(s, &timebuf, sizeof(timebuf), 0); if (nCharRecv == -1) { printf("Cannot get info from server!!!!\n"); perror("Receive"); return -1; } close(s); printf("Time: %s\n", timebuf); return 0; }
Задание на лабораторную работу: Ознакомившись с протоколом в RFC 868 написать программу, запрашивающую время с удаленного сервера через Time Protocol. Полученное от сервера 32 – битное число необходимо преобразовать в строку и вывести на экран. Написать программу, запрашивающую информацию о пользователе от удаленного сервера через протокол Finger, описанный в RFC 1288. Полученную информацию необходимо вывести на экран. Имя пользователя программа должна принимать из командной строки. Пользоваться готовыми классами, компонентами, библиотеками, реализующими работу с сетью, ЗАПРЕЩЕНО. Все программы должны использовать элементарные функции, работающими с сокетами Беркли.
|
||||
Последнее изменение этой страницы: 2016-08-10; просмотров: 442; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.118.205.55 (0.009 с.) |