- •Часть 1
- •Серверное приложение:
- •Клиентское приложение:
- •Серверное приложение:
- •Клиентское приложение:
- •Серверное приложение:
- •Клиентское приложение:
- •Серверное приложение:
- •Клиентское приложение:
- •Клиентское приложение:
- •Часть 2
- •Interframe gap, jam-последовательность, slot time, collision window – назначение и расчет
- •Список использованной литературы.
Клиентское приложение:
#include <winsock2.h>
#include <iostream>
#include <string>
#include <stdlib.h>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
int main() {
// максимальный номер версии WinSock
WORD wVersionRequested;
// структура для WSAStartup
WSADATA wsaData;
// инициализируем WinSock API
wVersionRequested=MAKEWORD(2,2);
WSAStartup(wVersionRequested,&wsaData);
// Создаем структуру данных соединения
struct sockaddr_in peer;
// Поле sin_family всегда имеет значение AF_INET
peer.sin_family = AF_INET;
// Обращаемся через порт 1280
peer.sin_port = htons(1280);
// т.к. клиент и сервер на одном компьютере, пишем адрес 127.0.0.1
peer.sin_addr.s_addr = inet_addr("127.0.0.1");
// Создаем клиентский сокет
SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
// Подключаемся к серверу
connect(s, (struct sockaddr*) &peer, sizeof(peer));
string sBuff;
char b[255];
cout<<"Enter the word: ";
getline(cin, sBuff);
// Отправляем строку на сервер для обработки
send(s, sBuff.c_str(), sBuff.length() + 1, 0);
// Получаем ответ от сервера
if (recv(s, b, sizeof(b), 0)!=0) {
b[strlen(b)] = '\0'; // Удаление ненужных символов в конце строки
cout<<b<<endl;
}
// Завершаем работу сокета
closesocket(s);
// Завершаем использование WinSock DLL
WSACleanup();
return 0;
}Результаты тестирования:
Рисунок 1 – Запущено серверное приложение
Рисунок 2 – Результат работы клиентского приложения
Задача №2
Осуществить взаимодействие клиента и сервера на основе протокола UDP. Функционирование клиента и сервера реализовать следующим образом: клиент посылает серверу дату в формате ДД.ММ.ГГ, сервер определяет существует ли она и возвращает "истина", если дата корректна, в противном случае - "ложь".
Краткое описание алгоритма:
Серверное приложение:
// Максимальный номер версии WinSock
// Структура для WSAStartup
// Инициализируем WinSock API
// Создаем серверный сокет, использующий протокол UDP
// Создаем структуру данных соединения
// Поле sin_family всегда имеет значение AF_INET
// Слушаем 1280 порт
// Слушаем все сетевые соединения
// Связываем сокет с соединением
// Принимаем данные от приложения-клиента
// Проверяем введенную дату, если дата существует выводим TRUE, в противном случае FALSE
// Посылаем данные на соединенный сокет
// Завершаем работу сокета
// Завершаем использование WinSock DLL
Клиентское приложение:
// Максимальный номер версии WinSock
// Структура для WSAStartup
// Инициализируем WinSock API
// Создаем структуру данных соединения
// Поле sin_family всегда имеет значение AF_INET
// Обращаемся через порт 1280
// Т.к. клиент и сервер на одном компьютере, пишем адрес 127.0.0.1
// Создаем клиентский сокет, использующий протокол UDP
// Подключаемся к серверу
// Отправляем строку на сервер для обработки
// Получаем ответ от сервера
// Завершаем работу сокета
// Завершаем использование WinSock DLL
Листинги с пояснениями:
Серверное приложение:
#define _CRT_SECURE_NO_DEPRECATE 1
#include <iostream>
#include <string>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
int main()
{
// максимальный номер версии WinSock
WORD wVersionRequested;
// структура для WSAStartup
WSADATA wsaData;
// инициализируем WinSock API
wVersionRequested = MAKEWORD(2,2);
int err = WSAStartup(wVersionRequested, &wsaData);
// Создаем серверный сокет, использующий протокол UDP
SOCKET s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
// Создаем структуру данных соединения
struct sockaddr_in ad;
// Поле sin_family всегда имеет значение AF_INET
ad.sin_family = AF_INET;
// Слушаем 1280 порт
ad.sin_port = htons(1280);
// Слушаем все сетевые соединения
ad.sin_addr.s_addr = htonl(INADDR_ANY);
// Принимаем данные от приложения-клиента
char buf[20];
int monthes[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int j=sizeof(ad);
//Связывание сокета с локальным адресом
int c=bind((SOCKET)s,(LPSOCKADDR)&ad, j);
//Если получены какие-то данные, то обработаем их
if (recvfrom((SOCKET)s,(LPSTR)&buf,sizeof(buf),0,(LPSOCKADDR) &ad, &j)!=0)
{
printf("\nDate received: %s",buf);
char cday[2];
cday[0]=buf[0];
cday[1]=buf[1];
int day=atoi(cday);
char cmonth[2];
cmonth[0]=buf[3];
cmonth[1]=buf[4];
int month=atoi(cmonth);
strcpy(buf,"FALSE");
if(month>12)
sendto((SOCKET)s,(LPCSTR)&buf,sizeof(buf),0,(LPSOCKADDR)&ad,j);
else if(day>monthes[month-1])
sendto((SOCKET)s,(LPCSTR)&buf,sizeof(buf),0,(LPSOCKADDR)&ad,j);
else
{
strcpy(buf,"TRUE");
sendto((SOCKET)s,(LPCSTR)&buf,sizeof(buf),0,(LPSOCKADDR)&ad,j);
}
}
// Завершаем работу сокета
closesocket(s);
// Завершаем использование WinSock DLL
WSACleanup();
return 0;
}