Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Информационные сети и коммуникации. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
1 Мб
Скачать

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

правителя

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

//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");

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);

71

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#%sBR#%dN1:badname %s\n",SENDER_ADDR,udpbuf[3],&udpbuf[4] );// есть проблемы с по-

сылкой

}

for(i=0;i<recv;i++) xorbyte=xorbyte^udpbuf[i]; //сделали исклю-

чаюшее или всех байтиков sprintf(udpbuf,"XXXXXXXXXXXXXXXXXX");// вот тут секрет-

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

мы будем посылать

//отправили назад кодовое слово тому,кто нам прислал привет if(sendto(udp_socket,(char *)udpbuf,19,0,(const struct sockaddr

*)&src_addr_UDP,sizeof(src_addr_UDP) ) ==-1)

{

perror("UDP_SEND");

}

}

//ждем 0.1 секунду usleep(100000);

72

}

}

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(12346);

addr.sin_addr.s_addr = htonl(INADDR_ANY);

// привязали сокет

if(bind(udp_socket, (struct sockaddr *)&addr, sizeof(addr)) < 0)

{

perror("bind");

exit(2);

}

73

ПРИЛОЖЕНИЕ 1 К РАЗДЕЛУ 5

Пример обмена данными клиент-сервер по протоколу HTTP

Сторона клиента, запрос

GET / HTTP/1.0

Сторона сервера, ответ

HTTP/1.1 200 OK

Date: Mon, 20 Jan 2014 05:02:24 GMT

Server: Apache/2.2.22 (Ubuntu)

Last-Modified: Mon, 20 Jan 2014 04:55:40 GMT

ETag: "bc1bd2-28-4f05fb4119116"

Accept-Ranges: bytes

Content-Length: 40

Vary: Accept-Encoding

Connection: close

Content-Type: text/html

<html><body><center>hello </body></html>Connection closed by foreign host.

74

ПРИЛОЖЕНИЕ 2 К РАЗДЕЛУ 5

Пример обмена данными клиент-сервер по протоколу ftp (>кли- ент-сервер <сервер-клиент)

>USER alexk

<331 Please specify the password.

>PASS 12345

<230 Login successful. >PWD

<257 "/home/alexk" >HELP

<214-The following commands are recognized.

ABOR ACCT ALLO APPE CDUP CWD DELE EPRT EPSV FEAT HELP LIST MDTM MKD

MODE NLST NOOP OPTS PASS PASV PORT PWD QUIT REIN REST RETR RMD RNFR

RNTO SITE SIZE SMNT STAT STOR STOU STRU SYST TYPE USER XCUP XCWD XMKD

XPWD XRMD

214 Help OK.

QUIT

Справочник команд FTP

ABOR – Прервать передачу файла

CDUP – Сменить директорию на вышестоящую.

CWD – Сменить директорию.

DELE – Удалить файл (DELE filename).

75

EPSV – Войти в расширенный пассивный режим. Применяется вместо PASV.

HELP – Выводит список команд, принимаемых сервером.

LIST – Возвращает список файлов директории. Список передается через соединение данных.

MDTM – Возвращает время модификации файла. MKD – Создать директорию.

NLST – Возвращает список файлов директории в более кратком формате, чем LIST. Список передается через соединение данных.

NOOP – Пустая операция.

PASV – Войти в пассивный режим. Сервер вернет адрес и порт, к которому нужно подключиться, чтобы забрать данные. Передача начнется при введении следующих команд: RETR, LIST и т. д.

PORT – Войти в активный режим. Например PORT 12,34,45,56,78,89. В отличие от пассивного режима для передачи данных сервер сам подключается к клиенту.

PWD – Возвращает текущую директорию. QUIT – Отключиться.

REIN – Реинициализировать подключение.

RETR – Скачать файл. Перед RETR должна быть команда PASV

или PORT.

RMD – Удалить директорию.

RNFR и RNTO – Переименовать файл. RNFR – что переименовывать, RNTO – во что.

SIZE – Возвращает размер файла.

STOR – Закачать файл. Перед STOR должна быть команда PASV

или PORT.

SYST – Возвращает тип системы (UNIX, WIN, …).

TYPE – Установить тип передачи файла (бинарный, текстовый). USER – Имя пользователя для входа на сервер.

76

ПРИЛОЖЕНИЕ К РАЗДЕЛУ 6

Текст ПО на компьютере преподавателя

// Приводится пример для версии библиотеки zmq 4.1

#include <sys/stat.h> #include <fcntl.h> #include <termios.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #include <sys/types.h> #include <netinet/in.h> #include <unistd.h> #include <sys/time.h> #include <sys/types.h> #include <stddef.h> #include <zlib.h> #include <string.h> #include <assert.h> #include <zmq.h>

char* Shakespeare1="EN: From fairest creatures we desire increase,\n\rThat thereby beauty\'s rose might never die,\n\rBut as the riper should by timedecease,\n\rHis tender heir might bear his memory:\n\rBut thou contracted to thine own bright eyes,\n\rFeed\'st thy light\'s flame with selfsubstantial fuel,\n\rMaking a famine where abundance lies,Thy self thy foe, to thy sweet self too cruel:Thou that art now the world's fresh ornament,\n\rAnd only herald to the gaudy spring,\n\rWithin thine own bud buriest thy content,\n\rAnd, tender churl,\n\r mak\'st waste in niggarding:\n\rPity the world, or else this glutton be,\n\rTo eat the world\'s due,\n\r by the grave and thee.";

77

char* ShakespeareMarshak1="RU: Мы урожая ждем от лучших лоз,\n\rЧтоб красота жила, не увядая.\n\rПусть вянут лепестки созревших роз,\n\rХранит их память роза молодая.\n\r\n\rА ты, в свою влюбленный красоту,\n\rВсе лучшие ей отдавая соки,\n\rОбилье превращаешь в нищету, -\n\rСвой злейший враг, бездушный и жестокий.\n\r\n\rТы – украшенье нынешнего дня,\n\rНедолговременной весны глашатай, -\n\rГрядущее в зачатке хороня,\n\rСоединяешь скаредность с растратой.\n\r\n\rЖалея мир, земле не предавай\n\rГрядущих лет прекрасный урожай!\n\r";

int main (void)

{

char message[8102]; zmq_msg_t msg; struct timeval tv; struct timezone tz; int rc,ret;

void *context;

context=zmq_init (2); if(context==NULL) exit(0); // создали кон-

текст

void *publisher = zmq_socket (context, ZMQ_PUB);assert (context); // создали 0mq гнездоpublisher

rc = zmq_bind(publisher, "tcp://*:5569"); assert (rc == 0);

while (1) { gettimeofday(&tv,&tz);

if(tv.tv_sec%2==0)

{

if(tv.tv_sec%5==0) //Один раз в 5 секунд выполняется отправка в канал оригинала текста

{

78

sprintf(message,"%s %d\n",Shakespeare1,(int) tv.tv_sec ); //

Оригинал Шекспира английский текст

rc = zmq_msg_init_size (&msg, strlen(message)); assert (rc == 0); // подготовили объект

rc = zmq_msg_init_data (&msg, message,strlen(message), NULL, NULL); assert (rc == 0); // заполнили данными

}

else

{ // Сжатый текст

unsigned long Zlen=8192; // максимальный размер буфера,

чтобы не случилось переполнения char prebuf[8192];

sprintf(prebuf,"%s %d\n",ShakespeareMarshak1,(int) tv.tv_sec ); ret=compress((const Bytef *)message,&Zlen,(const Bytef

*)prebuf,strlen(prebuf));

// Оригинал Шекспира – сжатый текст rc = zmq_msg_init_size (&msg, Zlen);

rc = zmq_msg_init_data (&msg, message,Zlen , NULL, NULL); assert (rc == 0);

}

}

else // все нечетные секунды отправляется перевод текста в переводе С. Маршака

{

sprintf(message,"%s %d\n",ShakespeareMarshak1,(int) tv.tv_sec );// Перевод Шекспира – русский текст

rc = zmq_msg_init_size (&msg, strlen(message)); assert (rc == 0); rc = zmq_msg_init_data (&msg, message,strlen(message), NULL,

NULL); assert (rc == 0);

}

/* Send the message to the socket */

// v2.2-rem rc = zmq_send (publisher, &msg, 0); assert (rc == 0);

79

zmq_sendmsg(publisher,&msg,0); sleep (1);

}

// We never get here, but clean up anyhow zmq_close (publisher);

//v2.2-rem zmq_destroy(context); zmq_ctx_destroy(context); return 0;

}

80

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]