Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Копия кс мои задачи.doc
Скачиваний:
15
Добавлен:
24.02.2016
Размер:
629.76 Кб
Скачать

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

#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). Реализовать параллельное соединение с использованием многопоточности. Функциональные возможности выбрать по варианту.

Вводится текст. Вывести строки, содержащие двузначные числа.