Смекни!
smekni.com

Распределенная служба кодирования (стр. 1 из 3)

Московский Государственный Институт Электроники и Математеки

кафедра ИКТ

Курсовая работа по предмету:

Сетевые технологии.

Тема работы:

Распределенная служба кодирования

Выполнил

студент группы С-64

Белехов В

Принял

Орлов Петр

Москва 2009 год

Список исполнителей

Белехов Владимир Николаевич – Выполнял работу.

Андреев Дмитрий Рубенович – Подготовил постановку задачи и техническое задание.

Сагратян Асатур Ашаотович – Помощь, google.

Реферат

Ключевые слова:

Распределеный, кодирование, клиент-сервер, база данных.

Приложения:

Листинги: сервер-приложение, клиент-приложение, конфиги к ним, кодирующий скрипт.

Источники: для работы с mysql, libcurl.

Цель работы: Разработать клиент-серверное приложение распределенния задач кодирования.

Методолгия:Научный тык.

Степень внедрения: Отладка.

Область применения: кодирование видео.

Значимость работы: повышает эффективность кодирования видео, сервером СОВА

Оглавление

Список исполнителей.. 2

Реферат. 3

Оглавление. 4

Сокращения.. 5

Постановка задачи.. 6

Основная часть.. 7

Выбор средств разработки.. 7

Описание работы службы... 8

Сервер-приложение. 8

Клиент-приложение. 10

Заключение. 12

В ней реализованы:. 12

Требуется реализовать:. 12

Использованные источники.. 13

Приложения.. 14

Сервер-приложение server.c. 14

server.conf. 19

Кодирующий скрипт encode_script.sh.. 19

Клиент-Приложение client.c. 20

client.conf. 26

MySQL dump тестовой базы данных. 27

Сокращения

СОВА – Система Организации Видео Архива

РСК – Распределенная Служба Кодирования

Постановка задачи

Система Организации Видео Архива (СОВА) на каждый добавленный видеофайл, помимо изображений (раскадровка и превью-кадр) создаётся потоковая веб версия (h.264, x264, mp4) и прокси копия - копия низкого разрешения (mpeg4, DivX). Это накладывает на сервер большую нагрузку по кодированию видео, например h.264 версия кодируется 2-3 риалтайма. При этом в массе своей видеофайлы небольшой длины, однако количество их велико. Для разгрузки сервера и ускорения кодирования целесообразно делегировать задачи по кодированию различным компьютерам (например простаивающим в ночное время машинным залам кафедры). Это и является задачей разрабатываемой системы.

Основная часть

Выбор средств разработки

Для того чтобы распределять задачи целесообразно использовать клиент-серверную архитектуру. Поэтому мы выбрали для работы операционную систему Linux, язык программирования C++.

Для работы со списком задач была выбрана СУБД MySQL, т.к. Ее уже использует СОВА, и РСК как ее служба тоже будет использовать MySQL. С базой данных из приложения мы будем работать с помощью разработанной библиотеки языка С/C++ libmysql (mysql.h, myglobal.h и другие)

Задача, которую получают клиенты содержит: ссылку на файл для обработки и параметры его кодирования. По полученной ссылке файл будет скачан с существующего FTP сервера кафедры. Для решения этой задачи мы использовали библиотеку языка С/C++: libcurl. Также мы будем использовать эти библиотеки при загрузке уже закодированного видео обратно на FTP сервер СОВЫ.

Кодирование будет осуществлять shell скрипт запускаемый из клиент-приложение. Разработка самого скрипта не входит в мое тз, однако я должен обеспечить его исполнение на этапе кодирования видео.

Описание работы службы

Сервер-приложение

Забирает из конфигурационного файла параметры для: налаживания клиент-серверного соединения (порт соединения), параметры соединения с базой данных задач кодирования: адрес, логин, пароль, порт пользователя СУБД MySQL. Для этого открываем конфигурационный файл. Каждый параметр помечен конструкцией типа ***имя_параметра. Это сделано чтобы впоследствии было легко разобратся где какие параметры

config = fopen("server.conf", "r")

do {

non_infiniti++; // подстраховка, чтобы цикл не ушел в вечную петлю если не окажется корректного // подтверждения конца файла

fgets(buf, FILELINE, config);

// берем из конфига порт

if( strcmp(buf, "***port\n") == 0 ) {

fgets(buf, FILELINE, config);

SERV_PORT = atoi(buf);

continue; }

......

} while (non_infiniti < 1000);

Соединение с базой данных из которой мы будем получать задачи:

инициация структуры базы данных, если нет необходимых библиотек произойдет ошибка

rskdb = mysql_init(NULL);

непосредственно соединение с базой данных по параметрам, полученным из конфига

mysql_real_connect(rskdb, mysql_host, mysql_user, mysql_pass, mysql_db, mysql_port, NULL, 0 )

Запускает прослушивающий сокет, ожидающий присоединения клиентов-кодировщиков.

Это происходит путем выхова трех комманд:

1) создания интернет сокета fdserver = socket(AF_INET, SOCK_STREAM, 0)

AF_INET означает что мы исползуем протокол IPv4

SOCK_STREAM – используется транспортный протокол TCP , а не UDP (DATAGRAM)

2) bind( fdserver, (struct sockaddr *) &servaddr, sizeof(servaddr))

3) listen(fdserver, 1024)

При присоединении клиента, совершает опрос базы данных задач на предмет наличиия задач кодирования.

Command = = "SELECT * FROM goal WHERE at_work = 0";

mysql_query((MYSQL *)rskdb, command);

Если таковые полученны он забирает задачу из бд на кодирование, отправляет ее клиенты, и ожидает результата работы клиенты – флаг успешного окончания, не успеха выполнения задачи. С помощью этого можно определить корректность выполнения задач клиентами-кодировщиками.

table = mysql_store_result((MYSQL *)rskdb);

if(table == NULL) {

printf("Error: can't get the result description&bsol;n");

send(fdclient, "exit", MAXLINE, 0);

break; }

if(mysql_num_rows(table) > 0) {

row = mysql_fetch_row(table);

sendlink = row[1];

sendname = row[3];

Оттданые задачи отмечаем, для того чтобы не раздать на кодирование одни и тежи файлы

mysql_query((MYSQL *)rskdb, UPDATE rsk.goal g SET at_work = 1 WHERE link “sendlink”);

send(fdclient, sendname, MAXLINE, 0);

send(fdclient, sendlink, MAXLINE, 0);

Если задачи кончились – клиенты отсылается флаг успешного окончания работы.

send(fdclient, "exit", MAXLINE, 0);

Клиент-приложение

Забирает из конфигурационного файла пармаетры: соединения с сервером (адрес и порт сервера); соединения с FTP севером (логин пароль).

Коннектится к серверу.

fdclient = socket (AF_INET, SOCK_STREAM, 0);

connect(fdclient, (struct sockaddr *) &servaddr, sizeof(servaddr);

Планируется что кодирующий скрипт будет также скачеватся с ftp сервера, это позволит облегчить вопрос обновления системы – один раз изменив кодирующий скрипт на серверы, все клиенты будут сами обновлятся. Поэтому выполним команду выдачи прав на исполнение нашего кодирующего bash-скрипта.

system( “cmod +x SCRIPT “);

Получает от сервера задачу кодирования.

recv(fdclient, recvflag, MAXLINE, 0);

recv(fdclient, recvlink, MAXLINE, 0);

Обрабатывает задачу:

  1. По полученной ссылке загружает с FTP сервера файл для кодирования

curl_easy_setopt(curl, CURLOPT_URL, recvlink);

curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ftpfile);

  1. Запускает кодирующий скрипт

system("./ SCRIPT recvname newname MYTMP encode_threads ");

  1. Загружает закодированный файл на FTP сервер.

curl = curl_easy_init();

curl_easy_setopt(curl,CURLOPT_URL, "ftp:// ftp_login:ftp_pass@ftp_link/newname”);

  1. Удаляет временные файлы.

system("rm recvname");


Это повторяется до тех пор пока не придет флаг что у сервера кончились задачи кодирования.

if( strcmp(recvflag, "exit") == 0) {

send(fdclient, "exit", MAXLINE, 0);

break; }

Заключение

Написана бэта-версия клиент-серверного приложения.

В ней реализованы:

  1. Соединиение клиента и сервера;
  2. Работа клиента с тестовой базой данных;
  3. Пересылка задач от сервера к клиенту, и ответ клиента о степени выполнения задачи (успешно не успешно, как каком этапе произошла ошибка (загрузка, кодирование, выгрузка));
  4. Скачивание и закачивание с FTP сервера файлов;
  5. Имеется тестовый кодирующий скрипт, получающий все необходимые параметры, которые будут в дальнейшем использованы.

Требуется реализовать:

  1. Перенести на реальную базу данных задач. Не выполнено так как мне еще не дали к ней доступ.
  2. Обеспечить коннект к нестандартному порту FTP сервера. Не выполнено, т.к. Этого не было в тз.
  3. Написать кодирующий скрипт. Не выполнено, т.к. Это следующий этап работы.

Использованные источники

  1. Стивенс У.Р. “Unix Разработка сетевых приложений” 2003г.
  2. Руководство по работе с библиотеками libmysql

http://leithal.cool-tools.co.uk/sourcedoc/mysql509/html/mysql_8h.html

  1. Пример использования библиотек libcurl (скачивание)

http://curl.haxx.se/lxr/source/docs/examples/ftpget.c

  1. Пример использования библиотек libcurl (загрузка)

http://curl.haxx.se/lxr/source/docs/examples/ftpupload.c

  1. Руководство по написанию bash скриптов

http://www.opennet.ru/docs/RUS/bash_scripting_guide/

Приложения

Сервер-приложение server.c


#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <strings.h>

#include <sys/socket.h>

#include <sys/types.h>

#include <unistd.h>

#include <arpa/inet.h>

#include <netinet/in.h>

#include <time.h>

#include <errno.h>

#include <mysql.h>

#include <my_global.h>

#define MAXLINE 300

#define FILELINE 200

#define OPT_SIZE 1000

int main()

{

/** take config data **/