- •Курсовая Работа
- •Разработка прикладного протокола передачи и приём звукового файла
- •Цель курсового проекта.
- •Задание на курсовое проектирование
- •Решение
- •Структура пакета
- •Буфер и таймеры
- •Алгоритм работы программы
- •Описание программы
- •Инициализация
- •Посылка одного блока данных
- •Функция приема блока
- •Функция воспроизведения блока
Описание программы
Для написания программы был выбран язык СИ и среда разработки Microsoft Visual Studio 2008.
Для удобного интерфейса пользователя создавался проект Windws Forms.
При помощи редактора форм были созданы все необходимые элементы.
Инициализация
Инициализацию можно разбить на 2 пункта – это инициализация звука и сокетов.
За инициализацию звука отвечают строки:
CurrentFormatFile.wFormatTag=WAVE_FORMAT_PCM;
CurrentFormatFile.nChannels=1;
CurrentFormatFile.nSamplesPerSec=8000;
CurrentFormatFile.nAvgBytesPerSec=8000;
CurrentFormatFile.nBlockAlign=1;
CurrentFormatFile.wBitsPerSample=8;
Эти строки выполняют установку формата звука.
UINT uDeviceID=WAVE_MAPPER;
mres=waveOutOpen(&hwo,uDeviceID,&CurrentFormatFile,0,0,0);
if (mres!=0) textBox_error->Text=L"Error: WaveOutOpen";
Данные строки выполняют поиск и открытие устройства для вывода звука.
За инициализацию сокетов отвечают следующие строки:
WSADATA wsadata;
WORD wVersionRequested;
wVersionRequested = MAKEWORD(2,0);
if (WSAStartup(wVersionRequested,&wsadata)==SOCKET_ERROR)
{
textBox_error->Text=L"Error: WSAStartup";
return false;
};
s=socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(s==INVALID_SOCKET)
{
textBox_error->Text=L"Error: Create socket";
return false;
};
//создание структуры адреса отправителя
from.sin_addr.S_un.S_addr=ADDR_ANY;
from.sin_family=PF_INET;
from.sin_port=5000;
//подключение сокета к коммуникационной среде
int errSer=bind(s,(LPSOCKADDR)&from,sizeof(from));
if(errSer!=0)
{
//MessageBox(0,"Error: Bind", 0, MB_OK);
textBox_error->Text=L"Error: Bind";
closesocket(s); //закрытие сокета
return false;
};
return true;
Сначала происходит установка версии сокета, далее его создание, заполнение адреса отправителя и подключение сокета. При неудаче в любом действии выводится соответствующее сообщения.
Посылка одного блока данных
В данной функции происходит сначала чтение блока из файла.
mmioRead(hmmio,WaveBuf,SIZE_OF_SOUND);
Далее происхоит заполнение полей и отправка структуры.
//заполнение заголовка пакета
//имя отправителя берётся из поля "От кого"
memcpy(sSound.Name,"telefon",10);
//номер пакета
sSound.Number=num++;
//заполнение поля данных
memcpy(sSound.SoundData,SendVoiceBuf,SIZE_OF_SOUND);
//формирование структуры с IP-адресом получателя
::to.sin_family=PF_INET;
//::to.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
String^ strinput2=textBox_IP->Text;
char c[20];
for(int j=0;j<strinput2->Length;j++)
c[j]=strinput2[j];
c[strinput2->Length]='\0';
to.sin_addr.S_un.S_addr=inet_addr(c);
::to.sin_port=5000;
//отправка пакета
int err=sendto(s,(char*)(&sSound),sizeof(Sound),0,(struct sockaddr*)&to,sizeof(to));
if (err==SOCKET_ERROR)
//MessageBox(0,"Error: Send sound",0,MB_OK);
textBox_error->Text=L"Error: Send sound";
