- •Часть 1
- •Клиентское приложение:
- •Серверное приложение:
- •Клиентское приложение:
- •Серверное приложение:
- •Клиентское приложение:
- •Серверное приложение:
- •Клиентское приложение:
- •Клиентское приложение:
- •Часть 2
- •Interframe gap, jam-последовательность, slot time, collision window – назначение и расчет
- •Список использованной литературы.
Серверное приложение:
#define _CRT_SECURE_NO_DEPRECATE 1
#include <iostream>
#include <string>
#include <sstream>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
DWORD WINAPI ThreadFunc(LPVOID);
int main()
{
// максимальный номер версии WinSock
WORD wVersionRequested;
// структура для WSAStartup
WSADATA wsaData;
// инициализируем WinSock API
wVersionRequested = MAKEWORD(2,2);
int err = WSAStartup(wVersionRequested, &wsaData);
// Создаем серверный сокет
SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
// Создаем структуру данных соединения
struct sockaddr_in local;
// Поле sin_family всегда имеет значение AF_INET
local.sin_family = AF_INET;
// Слушаем 1280 порт
local.sin_port = htons(1280);
// Слушаем все сетевые соединения
local.sin_addr.s_addr = htonl(INADDR_ANY);
// Связываем сокет с соединением
int c = bind(s,(struct sockaddr*)&local, sizeof(local));
// Инициализируем прослушивание сокета
int r = listen(s, 5);
// Сокет для клиента
SOCKET client_socket;
// Адрес клиента
sockaddr_in client_addr;
int client_addr_size = sizeof(client_addr);
// цикл извлечения запросов на подключение из очереди
while ((client_socket = accept(s, (sockaddr *)&client_addr, &client_addr_size))) {
// Вызов нового потока для обслуживания клиента
DWORD thID;
CreateThread(NULL, NULL, ThreadFunc, &client_socket, NULL, &thID);
}
return 0;
}
DWORD WINAPI ThreadFunc(LPVOID client_socket)
{
// Получаем клиентский сокет
SOCKET s = *((SOCKET *)client_socket);
char buf[100];
stringstream sResult, sNum;
// Получаем данные из сокета
while (recv(s, buf, sizeof(buf), 0)) {
// Обрабатываем полученную строку
if (strlen(buf) % 2 == 0)
for (unsigned int i = 3; i < strlen(buf)-2; i++)
sResult<<buf[i];
else
for (unsigned int i = 0; i < strlen(buf); i++)
sResult<<buf[i];
// Отправляем результат клиенту
send(s, sResult.str().c_str(), sResult.str().length() + 1, 0);
}
// Завершаем работу клиентского сокета
closesocket(s);
return 0;
}
Клиентское приложение:
#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 string: ";
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<<"Result string: "<<b<<endl;
}
// Завершаем работу сокета
closesocket(s);
// Завершаем использование WinSock DLL
WSACleanup();
return 0;
}
Результаты тестирования:
Рисунок 5 – Запущено серверное приложение
Рисунок 6 – Результат работы клиентского приложения
Задача №4
Постановка задачи:
Осуществить взаимодействие клиента и сервера без установления логического соединения (UDP). Реализовать параллельное соединение с использованием многопоточности. Функциональные возможности выбрать по варианту.
Вводится текст. Вывести строки, содержащие двузначные числа.