Реферат по предмету "Информатика, программирование"


Создание простейшего сервера в ОС QNX

Министерствообразования Российской Федерации
Южно–УральскийГосударственный Университет
КафедраАвтоматики и Управления
Созданиепростейшего сервера в ОС QNX
Отчет
полабораторной работе №2
по курсу: «Автоматизированные системыуправления
технологическимипроцессами»Выполнил: Пономарев А.С..Группа: ПС-437
Проверил:Харисов А.Ф.
Челябинск
2003 г.

Цель работы: Написать программу, создающуюпростейший Web-сервер.
Содержание работы
Опишем функции для работыс протоколом TCP/IP, которые мы использовали в данной программе:
1. Функция Socket
Для создания сокета используетсясистемный вызов socket.
s= socket(domain, type, protocol);
Этот вызов основывается на информациио коммуникационном домене и типе сокета. Для использования особенностейInternet, значения параметров должны быть следующими:
communication domain – AF_INET (Internet протоколы).
type of the socket – SOCK_STREAM (этот тип обеспечивает последовательный,надежный, ориентированный на установление двусторонней связи поток байтов).
Функция socket создает конечную точкудля коммуникаций и возвращает файловый дескриптор, ссылающийся на сокет, или -1в случае ошибки. Данный дескриптор используется в дальнейшем для установлениясвязи. Для создания сокета типа stream с протоколом TCP, обеспечивающим коммуникационнуюподдержку, вызов функции socket должен быть следующим:
s= socket(AF_INET, SOCK_STREAM, 0);
2 Функция Bind
Сокет создается без имени. Пока ссокетом не будет связано имя, удаленные процессы не имеют возможности ссылатьсяна него и, следовательно, на данном сокете не может быть получено никакихсообщений. Коммуникационные процессы используют для данных целей ассоциации. ВInternet домене ассоциация складывается из локального и удаленного адреса и излокального и удаленного порта. В большинстве доменов ассоциация должна бытьуникальной. В Internet домене связывание сокета и имени может быть весьмасложным, но, к счастью, обычно нет необходимости специально привязывать адрес иномер порта к сокету, так как функции connect и send автоматически свяжутданный сокет с подходящим адресом, если это не было сделано до их вызова. Длясвязывания сокета с адресом и номером порта используют системный вызов bind:
bind(s, name, namelen);
Привязываемое имя (name) это строкабайт переменной длины, которая интерпретируется поддерживаемым протоколом.
3 Функции listen и accept
Когда сервер желает предложить одиниз своих сервисов, он связывает сокет с общеизвестным адресом, ассоциирующимсяс данным сервисом, и пассивно слушает этот сокет. Для этих целей используется системныйвызов listen:
error=listen(s, qlength);
где s это дескриптор сокета, аqlength это максимальное количество запросов на установление связи, которыемогут стоять в очереди, ожидая обработки сервером; это количество может бытьограничено особенностями системы. Когда сервер получает запрос от клиента ипринимает решение об установлении связи, он создает новый сокет и связывает егос ассоциацией, эквивалентной 'слушающему сокету'. Для Internet домена этоозначает тот же самый номер порта. Для этой цели используется системный вызовaccept:
newsock = accept(s, clientaddr, clientaddrlen);
Сокет, ассоциированный клиентом, исокет, который был возвращен функцией accept, используются для установлениясвязи между сервером и клиентом.
4 Чтение из сокета.
Прием данных из сети можноосуществлять посредством функций recv() и read(). Функции используются дляприема данных из сокета, ориентированного на соединение. Функция read() — этообычная функция чтения, с помощью которой мы читаем из файлов и т.п. По сравнениюс ней функция recv() ориентирована на работу исключительно с сокетами иобладает более богатыми возможностями. Рассмотрим подробнее функцию recv(). Онаимеет следующий прототип
int recv(int sockfd, void *buf, int len, unsigned int flags);
и возвращает при успешном завершениичисло прочитанных байт, а при ошибке — -1. Первый параметр функции — сокет, изкоторого нужно прочитать данные, второй — указатель на область памяти, вкоторую нужно записать принятые данные, третий — сколько байт читать. С помощьючетвертого параметра можно управлять поведением функции. Например, указав вкачестве флага MSG_PEEK, мы прочитаем данные из начала очереди, но после чтенияони останутся в очереди. Разные флаги можно комбинировать, объединяясоответствующие константы посредством операции побитного ИЛИ. Отметим, что поумолчанию только что созданный сокет является блокирующим. В отношении функцииrecv() это означает, что если в момент ее вызова данных нет, она блокируется дотех пор, пока они не придут из сети.
5 Запись в сокет
Посылку данных в сеть можноосуществлять посредством функций send() и write(). Эти  две функциииспользуются для записи данных в сокет, ориентированный на соединение. Функцияwrite() — это обычная функция записи, с помощью которой мы пишем в файлы и т.п.По сравнению с ней функция send() ориентирована на работу исключительно ссокетами и обладает более богатыми возможностями. Рассмотрим подробнее функциюsend(). Она имеет следующий прототип
int send(int sockfd, void *buf, int len, unsigned int flags);
и возвращает при успешном завершениичисло записанных байт, а при ошибке — -1. Первый параметр функции — сокет, вкоторый нужно записать данные, второй — указатель на область памяти, из которойнужно взять данные, третий — сколько байт записать. С помощью четвертогопараметра можно управлять поведением функции. Например, указав в качестве флагаMSG_DONTROUTE, мы заставим TCP/IP посылать данные в обход обычных средствмаршрутизации непосредственно на сетевой интерфейс получателя, чтоиспользуется, например, различными диагностическими программами имаршрутизаторами. Разные флаги можно комбинировать, объединяя соответствующиеконстанты посредством операции побитного ИЛИ.
6 Закрытие сокета
После окончания обмена даннымипрограмма должна закрыть сокет(ы), вызвав функцию close().Она имеет следующийпрототип:
сlose(S)
где S – дескриптор закрываемого сокета.
Текст программы,создающей сервер.
#include
#include
#include
int main(void)
{ int S, K, New;
  charbufer[250], buf[]=«Server create.»;
  structsockaddr_in serv =
  { sizeof(struct sockaddr_in),
    AF_INET,
    htons(3128),
    INADDR_ANY
  };
  S=socket (AF_INET,SOCK_STREAM,0);
  bind (S,(struct sockaddr*)&serv, sizeof(serv));
  listen (S,10);
   for (;;)
   {
    K=sizeof(serv);
    New=accept(S, (struct sockaddr*)&serv,&K);
    read (New,bufer,sizeof(bufer));
    write (New,buf,sizeof(buf));
    close (New);    
   }
  close (S);
}
Опишем функции, которыемы использовали в данной программе:
Для создания сокетаиспользуется функция socket:
S=socket(protocol_family, socket_type, protocol);
где:
— protocol_family – группа или семейство, к которой принадлежитпротокол, например TCP/IP. В нашем случае мы используемкоммуникационный домен AF_INET, содержащий Internet протоколы.
— socket_type – тип сокета, задает режим соединения: датаграммныйили ориентированный на поток байтов. В нашем случае тип сокета – SOCK_STREAM – обеспечивает последовательный, надежный,ориентированный на установление двусторонней связи поток байтов.
– protocol – определяет протокол, с которымбудет работать сокет. В нашем случае для создания сокета с протоколом TCP данный параметр функцииустанавливаем равным 0.
Функция bind закладывает способность программыожидать появления запроса от клиента. Она позволяет связать сокет с адресом иномером порта.  
Адрес сети интернетназывается IP-адресом. Если компьютер подключен ксети интернет, то соответственно он имеет IP-адрес. Длина адреса Интернет составляет 4 байта или 32 бита.На одном  компьютере может работать несколько приложений, поэтому второйсоставляющей адреса интернет является порт. В терминологии TCP/IP понятие «порт» очень похоже на IP-адрес. Различия: порт обозначает приложение, а IP-адрес – сетевой компьютер. В адресацииИнтернет порт занимает 2 байта или 16 бит (тип – integer).
bind(S, local_address,address_length);
где:
– S это дескриптор сокета, полученный от функции socket.
– local_address – локальный адрес сокета, являющийся указателем наструктуру данных адреса сокета специального вида.
– address_length – указывает длину структуры данных адреса сокета.
Когда сервер желаетпредложить один из своих сервисов, он связывает сокет с общеизвестным адресом,ассоциирующимся с данным сервером, и пассивно слушает этот сокет. Для этихцелей используется вызов функции listen:
listen (S, qlength);
где:
–       S – дескриптор сокета.
– qlength – максимальное количество запросовна установление связи, которые могут стоять в очереди, ожидая обработкисервером. Выберем  qlength=10.
Когда сервер получаетзапрос от клиента и принимает решение об установлении связи, он создает новыйсокет и связывает его с ассоциацией (в internet домене ассоциация складывается излокального и удаленного адреса и из локального и удаленного порта), эквивалентной«слушающему сокету». Для этого используется вызов функции accept:
New=аccept(S, clientaddr, clientaddrlen);
Сокет,ассоциированный клиентом, и сокет, который был возвращен функцией accept, используются для установления связи между сервером иклиентом.
Когда связь установлена,может начаться процесс передачи данных. Посылать и получать сообщения можно спомощью функций write и read соответственно:
write(S, buffer,sizeof(buffer));
read(S, buffer,sizeof(buffer));
где:
– S – дескриптор сокета;
– buffer – буфер сообщения, указывает набуфер, то есть область памяти, в которой расположены передаваемые данные.
         – sizeof(buffer) – длина буфера, то есть количество данных для передачи.
Закрывается сокет с помощьюфункции  close:
сlose(S)
где S – дескриптор закрываемого сокета.
После запуска, даннаяпрограмма создает простейший Web-сервер,который постоянно запущен. Чтобы обратиться к этому серверу, необходимо в команднойстроке браузера написать IPадрес компьютера, на котором запущен сервер и порт (в нашем случае порт 3128).На рис. 1 представлен пример обращения к серверу.
/>
Рис. 1
Вывод: В даннойлабораторной работе мы научились работать с сокетами и создали простейший Web-сервер в операционной системе QNX.


Не сдавайте скачаную работу преподавателю!
Данный реферат Вы можете использовать для подготовки курсовых проектов.

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем реферат самостоятельно:
! Как писать рефераты
Практические рекомендации по написанию студенческих рефератов.
! План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом.
! Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач.
! Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты.
! Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ.

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.