Добавил:
inrad
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Компьютерные сети / lab1 / TCPserv / serv
.cpp/*Лабораторная работа №1
Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP.
Функционирование клиента и сервера реализовать следующим образом: клиент посылает два
слова серверу, сервер их сравнивает и возвращает "истина", если они
одинаковы по количеству и порядку следования в них букв, и "ложь" - при невыполнении
хотя бы одного из этих условий.
*/
//подключаем к проекту библиотеку WinSock2.h
#include <winsock2.h>
// подключение остальных библиотек
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
void main()
{
// значение типа word которое определяе максимальный номер версии WinSock, доступный приложению.
WORD wVersionRequested;
//структура wsaData содержит номер версии,
//которая должна использоваться, максимальный номер версии, текстовые строки.
WSADATA wsaData;
//инициализация переменной типа word
wVersionRequested = MAKEWORD(2,2);
// инициализация WinSockAPI
WSAStartup (wVersionRequested, &wsaData);
// создание сокета
SOCKET s = socket (AF_INET, SOCK_STREAM, 0);
//структура адреса
struct sockaddr_in local;
//стандартное значение
local.sin_family = AF_INET;
//порт ассоциированный с сокетом
local.sin_port = htons(1280);
//физический IP адрес для получения или посылки данных для сокета
local.sin_addr.s_addr = htonl (INADDR_ANY);
//связывание конкретного адреса с сокетом
int c = bind(s,(struct sockaddr*) &local, sizeof(local));
//установление соединения с клиентом. помещение сокета в состояние прослушивания
int r = listen (s,5);
//
while (true)
{
// структура определяет удаленный адрес для присоединения сокета
sockaddr_in remote_addr;
int size = size = sizeof (remote_addr);
//открытие соединения
SOCKET s2 = accept (s, (struct sockaddr*) &remote_addr, &size);
char b[255];
//прием данных через сокет потока
while (recv (s2, b, sizeof(b), 0)!=0)
{
// переменная для возврата результата
char Res[10];
//вспомогательная переменная для разбития на лексемы
char * tokenPtr;
//переменные для хранения лексем
char * first;
char * second;
//отделение первой лексемы
tokenPtr = strtok (b, " ");
//определение ее размера
int length = strlen(tokenPtr);
//выделение динамической памяти для первого слова
first = new char [length] ;
strcpy(first, tokenPtr);
//выделение динамической памяти для второго слова
second = new char [100] ;
//счетчик лексем
int count = 1;
// цикл для отделения второй лексемы
while ((tokenPtr != NULL)&&(count==1))
{
count++;
//продолжение разбиения на строки
tokenPtr = strtok (NULL, " ");
//определение второго слова
length = strlen(tokenPtr);
second = NULL;
second = new char [length];
strcpy(second, tokenPtr);
}
//равны или нет введенные слова
if (strcmp(first, second)==0) strcpy(Res,"true");
else strcpy(Res,"false");
//вывод результата в окне сервера
cout<<"_______________"<<endl;
cout<<Res<<endl;
//пересылка данных в открытый сокет
send (s2, Res, sizeof(Res)+1, 0);
first = NULL;
second = NULL;
delete [] first;
delete [] second;
}
//закрытие сокета
closesocket(s2);
}
//завершение работы с WinSock DLL
WSACleanup();
}