- •Часть 1
- •Клиентское приложение:
- •Серверное приложение:
- •Клиентское приложение:
- •Серверное приложение:
- •Клиентское приложение:
- •Серверное приложение:
- •Клиентское приложение:
- •Клиентское приложение:
- •Часть 2
- •Interframe gap, jam-последовательность, slot time, collision window – назначение и расчет
- •Список использованной литературы.
Серверное приложение:
#include <winsock2.h>
#include <windows.h>
#include <process.h> /* _beginthread, _endthread */
#include <string.h>
#include<stdio.h>
//Функция, обслуживающая запросы клиентов
void ServClients(void* s){
//Буфер для получения/отправки данных
char res[1024];
char f[20];
strcpy(f,"NO NUMBERS");
sockaddr_in ad;
ad.sin_family = AF_INET;
ad.sin_port = htons(1280);
ad.sin_addr.s_addr = htonl(INADDR_ANY);
int j=sizeof(ad);
//Связывание сокета с локальным адресом
int c=bind((SOCKET)s,(LPSOCKADDR)&ad, j);
int found=0;
//Если получены какие-то данные, то обработаем их
if (recvfrom((SOCKET)s,(LPSTR)&res,sizeof(res),0,(LPSOCKADDR) &ad, &j)!=0)
{
for(int i=0;i<strlen(res);i++)
if(isdigit(res[i]) && isdigit(res[i+1]))
{
sendto((SOCKET)s,res,sizeof(res),0,(LPSOCKADDR) &ad, j);
found=1;
break;
}
if(!found)
sendto((SOCKET)s,f,sizeof(f),0,(LPSOCKADDR) &ad, j);
}
}
//Главная функция программы
int main(){
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2,2);
//Инициализация библиотеки WinSock
err = WSAStartup(wVersionRequested, &wsaData);
if(err != 0) return -1;
//Создание сокета UDP
SOCKET s = socket(AF_INET, SOCK_DGRAM,0);
//Считывание оборудования из файла
while(true){
_beginthread(ServClients,0,(void*)s);
}
WSACleanup();
return 0;
}
Клиентское приложение:
#include <winsock2.h>
#include <iostream>
#include<stdio.h>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
//Главная функция программы
int main()
{
char buff[100];
//Инициализация библиотеки WinSock
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2,2);
err = WSAStartup(wVersionRequested, &wsaData);
if(err != 0) return -1;
struct sockaddr_in peer;
peer.sin_family=AF_INET;
peer.sin_port=htons(1280);
peer.sin_addr.s_addr=inet_addr("127.0.0.1");
//Создание сокета UDP
SOCKET s=socket(AF_INET,SOCK_DGRAM,0);
int t=sizeof(peer);
//Ввод пользователем числа строки
cout<<"Enter the string: "<<endl;
gets(buff);
//Отправка введенной строки серверу
sendto(s,(LPCSTR)&buff,sizeof(buff),0,(LPSOCKADDR)&peer,t);
//Если от сервера был получен ответ, то проанализируем его
if (recvfrom(s,buff,sizeof(buff),0,(LPSOCKADDR)&peer,&t)!=0)
{
//Печать результата обработки строки
cout << buff<<endl;
closesocket(s);
}
//Очистка структур WinSock
WSACleanup();
return 0;
}
Результаты тестирования:
Рисунок 7 – Запущено серверное приложение
Рисунок 8 – Результат работы клиентского приложения
Задача №8
В протоколе отправки SMS-сообщений ограничить частоту отправки сообщений с одного IP адреса по времени. Добавить команду sms (без параметров), которая выводила б правила пользования услугой.
Листинги с пояснениями:
#include <iostream.h>
#include <afx.h>
#include <winsock2.h>
#include <process.h> /* _beginthread, _endthread */
#include <string.h>
#include <time.h>
CFile f;
CFileException ex;
clock_t start, finish,finish1;
// удалить сообщение с номером
void del(char* p,int n) {
char tel[200];
int j=0;
for (int i=n;p[i]!=' ';i++) {
tel[j]=p[i];
j++;
}
tel[j]='\0';
char fName[200];
fName[0]='\0';
strcat(fName,tel);
strcat(fName,".SMS");
DeleteFile((LPCSTR)fName);
cout<<"SMS is removed"<<endl;
}
// удалить все сообщения
void delall() {
CFileFind m_finder;
BOOL bWorking;
bWorking = m_finder.FindFile("\\*.SMS");
while (bWorking)
{
bWorking = m_finder.FindNextFile();
CString m_FileName = m_finder.GetFileName();
DeleteFile(m_FileName);
}
cout<<"All SMS were removed"<<endl;
}
//Отослать сообщение на SMS-центр для номера
void sms(char* p,int n) {
char tel[200];
char str[200]; int j=0;
for (int i=n;p[i]!=' ';i++) {
tel[j]=p[i];
j++;
}
tel[j]='\0';
n=i+1;j=0;
for(i=n;p[i];i++) {
str[j]=p[i];
j++;
}
str[j]='\0';
char fName[200];
fName[0]='\0';
strcat(fName,tel);
strcat(fName,".SMS");
cout<<"sms processing...";
if (!f.Open(fName,CFile::modeWrite | CFile::modeCreate,&ex)) {
cerr<<"SMS storage error. Try again\n";
exit(EXIT_FAILURE);
}
f.Write(str,strlen(str));
f.Close();
cout<<"sent successfully"<<endl;
}
void SMSworking(void* newS) {
int c;
char p[200], com[200];
com[0]='\0';p[0]='\0';
finish1=clock();
finish1-=CLOCKS_PER_SEC*60;
strcat(p,"SMS center connected...\n");
cout << p << endl;
send((SOCKET)newS,p,sizeof(p),0);
while((c=recv((SOCKET)newS,p,sizeof(p),0)!=0)) {
int i=0;
while (p[i]!=' ') {
com[i]=p[i];
i++;
};
com[i]='\0';i++;
if (!strcmp(com,"sms")) {
start = clock();
if((double)(start - finish1) / CLOCKS_PER_SEC < 60 )
cout<<"Cannot be sended - try again later"<<endl;
else
{
sms(p,i);
finish1=start;
}
com[0]='\0';
}
if (!strcmp(com,"del")) {
finish = clock();
// если с отправки сообщения прошло больше минуты
if((double)(finish - start) / CLOCKS_PER_SEC > 60 )
cout<<"Cannot be canceled"<<endl;
else
del(p,i);
com[0]='\0';
}
if (!strcmp(com,"delall")) {
delall();
com[0]='\0';
}
if (!strcmp(com,"quit")) {
closesocket((SOCKET)newS);
exit(EXIT_SUCCESS);
com[0]='\0';
}
}
}
int main() {
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2,2);
err = WSAStartup(wVersionRequested, &wsaData);
if(err != 0) return -1;
cout << "SMS-center started" << endl;
sockaddr_in local;
local.sin_family = AF_INET;
local.sin_port = htons(1280);
local.sin_addr.s_addr = htonl(INADDR_ANY);
SOCKET s = socket(AF_INET, SOCK_STREAM,0);
int c=bind(s,(struct sockaddr*)&local,sizeof(local));
int r=listen(s,5);
while(true) {
sockaddr_in remote;
int j = sizeof(remote);
SOCKET newS = accept(s, (struct sockaddr*) &remote, &j);
_beginthread(SMSworking,0,(void*)newS);
}
WSACleanup();
return 0;
}