Лабораторная работа №4 Разработка сетевого приложения на языке Си




Скачать 97.17 Kb.
НазваниеЛабораторная работа №4 Разработка сетевого приложения на языке Си
ТипЛабораторная работа
rykovodstvo.ru > Руководство эксплуатация > Лабораторная работа
ЛАБОРАТОРНАЯ РАБОТА №4

Разработка сетевого приложения на языке Си



  1. Цель работы: Ознакомление с построением фильтров TCP/IP пакетов. Ознакомление с методами шифрования с открытым ключом на примере пакета gnupg.



  1. Краткие теоретические сведения.


Литература:

1. Танаев А. http://thelib.ru/books/butanaev_anton/programmirovanie_soketov-read.html

2. Шарыгин.А. Программирование сокетов http://www.rsdn.ru/article/unix/sockets.xml

3. LinuxShare http://www.linuxshare.ru/docs/devel/languages/C/tppcu/5.htm

4. Select_tutorial http://amax.h16.ru/docs/select_tut2.html
Сокет — конечная точка сетевых соединений в стеке протоколов TCP/IP. Процесс любого обмена данными по сети в многозадачной операционной системе сводится к тем или иным операциям с сокетами. Сокет это точка входа в приложение,осуществляющее обмен данными в сети. Так если пара IP адрес/ маска (или только адрес в сетях IPV6) однозначно определяет узел в сети, то сокет- приложение, которое готово обмениваться данными. Существует три режима операций с сокетами:


  • блокирующиеся сокеты;

  • асинхронные сокеты;

  • низкоуровневые сокеты.


Операции,которые потребуются для объявления сокета и привязки его к процессу зависят от типа протокола, с помощью которого предполагается организовать соединение. Так протокол TCP, как наиболее сложный, потребует создания соединения «точка-точка» в котором будут активно участвовать две оконечные точки, способные работать в двух режимах:

  • режим сервера;

  • режим клиента.



Для создания TCP сокета на языке Си потребуются:


  1. Выполнить инициализацию объекта «Сокет»


#include

#include

int socket(int domain, int type, int protocol);
Domain — пространство имен и протоколов:

IPV4 IPV6 loopback.
Наиболее часто используются:

AF_UNIX(AF_LOCAL) — Фс ос unix- «локальный сокет» - обмен данными через специальный объект ФС

AF_INET — обмен данными через сетевой стек (в т.ч. Через loopback)

AF_PACKET — низкоуровневый обмен


  1. Выполнить объявление сокета

int socket(int domain, int type, int protocol);
Type — указывает способ обмена данными по сети

SOCK_STREAM — протокол TCP, требуется установка соединения. Может использован только если взаимодействующая сторона SOCK_STREAM с назначаемым IP адресом

SOCK_DGRAM — протокол UDP, не требует соединения, допускает multicast, brodcast,network адреса

SOCK_RAW — низкоуровневое формирование ip. Возможна обработка icmp.

Дополнительно через ||
SOCK_NONBLOCK - неблокирующий сокет- точка для обслуживания нескольких клиентов из одного треда


  1. Заполнить структуру с адресом и выполнить привязку сокета к IP адресу и порту


#include

#include
int bind(int sockfd, struct sockaddr *addr, int addrlen);

Sockfd - дескриптор сокета, то,что вернула команда socket на предыдущем шаге
struct sockaddr {

unsigned short sa_family; // Семейство адресов, AF_xxx

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

};

sa_family - идентификатор домена, аналогичный первому параметру функции socket.

Адрес sa_data -> указатель на структуру

struct sockaddr_in {

short int sin_family; // Семейство адресов

unsigned short int sin_port; // Номер порта

struct in_addr sin_addr; // IP-адрес

unsigned char sin_zero[8]; // "Дополнение" до размера структуры sockaddr

};
Адрес перевернут младшим «вперед»,

struct in_addr {

unsigned long s_addr;

};
Следовательно, потребуются преобразование порядка следования байт в словах

Существует два формата представления адреса: порядок «хоста» (host byte order) и «сетевой»(net byte order) , отличающиеся порядком следования старших/младших байт в слове. В сокет API используется сетевой порядок следования,сл-но требуется преобразование
#include

uint32_t htonl(uint32_t hostlong);

uint16_t htons(uint16_t hostshort);

uint32_t ntohl(uint32_t netlong);

uint16_t ntohs(uint16_t netshort);

IV.s) Для создания серверного сокета потребуется:
Создать очередь запросов на соединение. Сокет прослушивает порт и ожидает нового соединения:
int listen(int sockfd, int sizeoflisten);

sockfd — знакомый нам дескриптор сокета

int sizeoflisten — длина очереди. 1 — всего один клиент сможет подключиться параллельно к сокету

0 — все в порядке — новое соединение готово принимать данные. -1 произошла ошибка.
Сервер готов обслужить сокет — выполняется функция accept
#include
int accept(int sockfd, void *addr, int *addrlen);
В структуру void *addr будет записан адрес клиента,который установил соединение.

int accept(int sockfd, null, null); - нам совершенно не интересно «кто». Возврат — дескриптор, с которым можно делать send и receive или -1
IV.client) На стороне клиентского сокета потребуется:
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
где все структуры и параметрв нам уже знакомы. Возврат- дескриптор для read и wrire или -1.

Если не связывать по bind — клиентский сокет автоматически получит номер из пространства 1024-65535. Однако можно привязать и его,если это необходимо.


  1. Обмен данными с сокетами


Отправка данных

int send(int sockfd, const void *msg, int len, int flags);

Flag - манипулирование флагами пакета (например,TOS). Может быть NULL

Возврат- количество байт, или -1.

Функция send отправит только то количество байт, которое сможет и совершенно не обязана отправить весь буфер одной посылкой. Возврат 0 не является ошибкой
Пример функции,которая корректно отправляет данные в сокет

int sendallbuf(int s, char *buf, int len, int flags)

{

int total = 0;

int n;
while(total < len)

{

n = send(s, buf+total, len-total, flags);

if(n == -1) { break; }

total += n;

}
If(n==-1) return -1;

else return total;
}
Получение данных

int recv(int sockfd, void *buf, int len, int flags);
Возврат: -1 если ошибка

Возврат: 0 если соединение завершено

Возврат: количество прочитанных байт
Особенность recv- программа «останавливается» на этом операторе и ожидает получения «len» байт из сокет

while(1)

{

bytes_read = recv(sock, buf, 1024, 0);

if(bytes_read <= 0) break;

send(sock, buf, bytes_read, 0);

}
В случае работы в режиме «сырого сокета» для обмена данными используется:

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,

struct sockaddr *src_addr, socklen_t *addrlen);
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);



  1. Методические указания для выполнения работы работы




  • Создайте файл с текстом программы на си в любом текстовом редакторе, выполняющий действия,согласно варианту

  • Откомпилируйте программу при помощи компилятора GNU GCC :

gcc ./yourprog.c -o ./yourprog.bin

  • Выполните отладку программы

  • Запротоколируйте сетевой обмен (tcpdump) и приведите его в отчет.

  • В процессе выполнения работы пользуйтесь справкой man <функция>




  1. Варианты задания.


Для всех вариантов разработать программу,которая создаст UDP сокет и отправит на IP адрес,указанный преподавателем, UDP пакет следующего содержания

0й байт: фиксирован и равен 129

1й байт: день месяца

2й байт: месяц

3й байт: номер Вашей бригады

4й-40й байт: латинскими буквами фамилия 1го члена бригады ( sprintf(&buf[6], ) )

41й-60й байт: латинскими буквами фамилия 2го члена бригады

61-80й байт: латинскими буквами фамилия 3го члена бригады

81й байт: сумма по «исключающему или» всех байт посылки
В ответ сервер преподавателя пришлет посылку с паролем и кодом, согласно листинга в приложении.

Получить пароль двумя методами:

    • с помощью чтения из сокет;

    • с помощью команды tcpdump



4. Содержание отчета


  1. Титульный лист.

  2. Цель работы.

  3. Текст программы на языке Си.

  4. Байты пакета,который будет отправлен на компьютер преподавателя

  5. Байты пакета,который был получен в ответ

  6. Значение кодового слова- ответа


Приложение 1

Ключи к программе tcpdump


ключ

описание

-a

Преобразовывает сетевые и широковещательные адреса в доменные имена.

-e

Отображает данные канального уровня (mac-адрес, протокол, длина пакета). Вместо ip-адресов будут отображаться mac-адреса компьютеров.

-F файл

Использовать фильтр, находящийся в файле. Если вы используете этот параметр, фильтр из командной строки будет игнорироваться.

-i

Указывает на то, какой сетевой интерфейс будет использоваться для захвата пакетов. По умолчанию — eth0, но если отсутствует локальная сеть, то можно воспользоваться интерфейсом обратной связи lo.

-l

Использовать стандартный потоковый вывод tcpdump (stdout), например для записи в файл:

shell# tcpdump -l | tee out.log //отобразит работу tcpdump и сохранит результат в файле out.log

-N

Не добавляет доменное расширение к именам узлов. Например tcpdump отобразит 'net' вместо 'net.library.org'

-n

Отображает ip-адрес вместо имени хоста.

-nn

Отображает номер порта вместо используемого им протокола.

-p

Не переводит интерфейс в режим приема всех пакетов (promiscuous mode).

-q

Выводит минимум информации. Обычно это имя протокола, откуда и куда шел пакет, порты и количество переданных данных.

-r

Этот параметр позволяет tcpdump прочесть трафик из файла, если он был предварительно сохранен параметром -w.

-S

Позволяет не обрабатывать абсолютные порядковые номера ( initial sequence number - ISN) в относительные.

-s число

Количество байтов пакета, которые будет обрабатывать tcpdump. При установке большого числа отображаемых байтов информация может не уместиться на экране и ее будет трудно изучать. В зависимости от того, какие цели вы преследуете, и следует выбирать значение этого параметра. По умолчанию tcpdump сохраняет первые 68 байт, однако если вы хотите увидеть содержимое всего пакета, используйте значение в 1500 байт (максимально допустимый размер пакета в сети Ethernet).

-t

Не отображает метку времени в каждой строке.

-T тип

Интерпретация пакетов заданного типа. Поддерживаются типы aodv, cnfp, rpc, rtp, rtcp, snmp, tftp, vat, wb.

-tt

Отображает неформатированную метку времени в каждой строке.

-tttt

Показывает время вместе с датой.

-v

Вывод подробной информации (TTL; ID; общая длина заголовка, а также его параметры; производит проверку контрольных сумм IP и ICMP-заголовков)

-vv

Вывод еще более полной информации, в основном касается NFS и SMB.

-vvv

Вывод максимально подробной информации.

-w

Сохраняет данные tcpdump в двоичном формате. Преимущества использования данного способа по сравнению с обычным перенаправлением в файл является высокая скорость записи и возможность чтения подобных данных другими программами, например snort, но этот файл нельзя прочитать человеку.

-X

Выводит пакет в ASCII- и hex-формате. Полезно в случае анализа инцидента связанного со взломом, так как позволяет просмотреть какая текстовая информация передавалась во время соединения.

-x

Делает распечатку пакета в шестнадцатеричной системе, полезно для более детального анализа пакета. Количество отображаемых данных зависит от параметра -s

-xx

Тоже, что и предыдущий параметр, но включает в себя заголовок канального уровня

-XX

Тоже, что и предыдущий параметр, но включает заголовок канального уровня.

-с число

tcpdump завершит работу после получения указанного числа пакетов.


Приложение 2. Программа-сервер преподавателя

/*Программа сервера к лабораторной работе №4 */
/*2011 год*/
#include
#include
#include
#include
#include
#include
#include
#include
#include

int udp_socket=-1; // идентификатор сокет для UDP
char udpbuf[1024]; // буфер для хранения данных

struct sockaddr_in addr_UDP; //Структура для хранения адреса
void init_UDP(void);// инициализация UDP сокет
void send_UDP(int); // Отправляем данные в UDP
void main()
{


int i;
int recv;
int structlen;
char SENDER_ADDR[44];
int byte1,byte2,byte3,byte4;
unsigned char xorbyte=0;


struct sockaddr_in src_addr_UDP; //Структура для хранения отправителя


init_UDP(); // Инициализировали UDP сокет


while(1) // Вечный цикл
{

// получили данные их сокет ждем такую посылку
//udpbuf[0]=129;// ключик
//udpbuf[1]=29; // день
//udpbuf[2]=11; // месяц
//udpbuf[3]=1; // номер бригады
//sprintf(&udpbuf[4],"ivanov Ivan");
//sprintf(&udpbuf[41],"Petrov Petr");
//sprintf(&udpbuf[61],"Sidorov Sidr");

recv=recvfrom(udp_socket,udpbuf, 1024, 0,(struct sockaddr *)&src_addr_UDP,&structlen);
printf("recv %d bytes: ",recv); // напечатали сколько байт пришло

if(recv>0 && (unsigned char) udpbuf[0]==129) // если ключик верный смотрим кто послал
{
byte1=((int)src_addr_UDP.sin_addr.s_addr&0xff000000)>>24;
byte2=((int)src_addr_UDP.sin_addr.s_addr&0xff0000)>>16;
byte3=((int)src_addr_UDP.sin_addr.s_addr&0xff00)>>8;
byte4=((int)src_addr_UDP.sin_addr.s_addr&0xff);
sprintf(SENDER_ADDR,"%d.%d.%d.%d",byte4,byte3,byte2,byte1);


if( strlen(&udpbuf[4])<20 )
{
printf("IP#%s BR#%d N1:%s\n",SENDER_ADDR,udpbuf[3],&udpbuf[4] ); // все верно
}
else
{
printf("IP#%s BR#%d N1:badname\n",SENDER_ADDR,udpbuf[3],&udpbuf[4] );// есть проблемы с посылкой
}

for(i=0;i
sprintf(udpbuf,"XXXXXXXXXXXXXXXXXX");// вот тут секретное словечко,которое будем отвечать в канал
udpbuf[18]=(char)xorbyte;// контрольный XOR
udpbuf[19]=0x0;//А вот тут будет секретный код,который мы будем посылать


//отправили назад кодовое слово тому,кто нам прислал привет
if(sendto(udp_socket,(char *)udpbuf,20,0,(const struct sockaddr *)&src_addr_UDP,sizeof(src_addr_UDP) ) ==-1)
{
perror("UDP_SEND");
}
}

usleep(100000);

// ждем 0.1 секунду

для корректной многозадачной среды

}
}


void init_UDP(void) // инициализация сокет UDP
{


struct sockaddr_in addr; // структура с типом адресов
udp_socket = socket(AF_INET, SOCK_DGRAM, 17); // инициализировали сокет
if(udp_socket < 0)
{
perror("socket");
exit(1);
}
addr.sin_family = AF_INET;
addr.sin_port = htons(12345);
addr.sin_addr.s_addr = htonl(INADDR_ANY);

// привязали сокет
if(bind(udp_socket, (struct sockaddr *)&addr, sizeof(addr)) < 0)
{
perror("bind");
exit(2);
}


}

Похожие:

Лабораторная работа №4 Разработка сетевого приложения на языке Си iconЛабораторная работа 1 4 лабораторная работа 2 13 лабораторная работа...
Интернете разнообразную информацию – описательную, графическую, картографическую и пр. При разработке сайтов необходимо уметь работать...

Лабораторная работа №4 Разработка сетевого приложения на языке Си iconЛабораторная работа №9 59 Лабораторная работа №10 72 Лабораторная...
Рабочая тетрадь для выполнения лабораторных работ по мдк. 03. 01. «Техническое обслуживание и ремонт компьютерных систем и комплексов»...

Лабораторная работа №4 Разработка сетевого приложения на языке Си iconЛабораторная работа №
Лабораторная работа №1. Изучение основных возможностей программного продукта Яндекс. Сервер. Установка окружения, установка и настройка...

Лабораторная работа №4 Разработка сетевого приложения на языке Си iconМетодические указания для студентов по выполнению лабораторных работ...
Лабораторная работа 4, 5 Исследование регистров, счетчиков и дешифраторов Лабораторная работа 6, 7 Исследование генератора псевдослучайной...

Лабораторная работа №4 Разработка сетевого приложения на языке Си iconЛабораторная работа №10. Изучение принципа действия и функциональной...
Лабораторная работа № Изучение принципов построения системы автоматической подстройки частоты (апч) радиолокационной станции

Лабораторная работа №4 Разработка сетевого приложения на языке Си iconЛабораторная работа №4 по дисциплине «Тестирование по»
Изучить методику функционального тестирования Android приложения, используя Appium

Лабораторная работа №4 Разработка сетевого приложения на языке Си iconЛабораторная работа №3
Программируемый логический контроллер Fatek. Программирование контроллера на языке последовательных функциональных схем

Лабораторная работа №4 Разработка сетевого приложения на языке Си iconКурс: «Технологии обработки информации». Лабораторная работа № Разработка...
Рассмотрим пример, который будет использоваться для иллюстрации шагов, необходимых для разработки агентного приложения с помощью...

Лабораторная работа №4 Разработка сетевого приложения на языке Си iconКурсовой проект был создан с помощью среды разработки Visual Studio...
Разработка приложения для построения динамической изображения трехмерной модели объекта «Паровоз»

Лабораторная работа №4 Разработка сетевого приложения на языке Си iconЛабораторная работа №27 Лабораторная работа №28 Контрольные работы...
Пм «Сборка монтаж (демонтаж) элементов судовых конструкций, корпусов, устройств и систем металлических судов»

Лабораторная работа №4 Разработка сетевого приложения на языке Си iconЛабораторная работа №2 Разработка цифровой системы фильтрации сигнала. Цель работы
Цель работы: разработка собственной системы обработки сигнала, реализующей ких-фильтрацию, на базе типового аппаратного и программного...

Лабораторная работа №4 Разработка сетевого приложения на языке Си iconЛабораторная работа 2 12 лабораторная работа 3 17 лабораторная работа...
«Проектирование систем реального времени» для студентов специальности 09. 05. 01 «Применение и эксплуатация автоматизированных систем...

Лабораторная работа №4 Разработка сетевого приложения на языке Си iconКонкурс методических разработок сетевого фестиваля экологического...
Применены элементы технологии критического мышления, анализ периодической печати, работа в группах

Лабораторная работа №4 Разработка сетевого приложения на языке Си iconПолноэкранный отладчик afdpro
Лабораторная работа предназначена для того, чтобы вы получили наглядные представления об архитектуре процессора на примере микропроцессора...

Лабораторная работа №4 Разработка сетевого приложения на языке Си iconЛабораторная работа «Построение контуров изображения с использованием...
Ивших на уроках математики понятие о математических кривых и графиках функций. Данная лабораторная работа может быть использована...

Лабораторная работа №4 Разработка сетевого приложения на языке Си iconПрактическая работа Содержание
Лабораторная работа: Оценка программно-аппаратных средств при переходе на Windows Vista 3


Руководство, инструкция по применению






При копировании материала укажите ссылку © 2018
контакты
rykovodstvo.ru
Поиск