Last active
February 13, 2017 19:50
-
-
Save MisterTimur/20cdf917a917a84520d406bb241b7492 to your computer and use it in GitHub Desktop.
TrSite.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Абудлов Тимур 2017 год . | |
#pragma region ----- Заголовок . | |
#include "stdafx.h" | |
#undef UNICODE | |
#define WIN32_LEAN_AND_MEAN | |
#include <windows.h> | |
#include <winsock2.h> | |
#include <ws2tcpip.h> | |
#include <stdlib.h> | |
#include <stdio.h> | |
#include <conio.h> | |
#include <ctime> | |
#include <cmath> | |
#include <fstream> | |
#define DEFAULT_PORT "8080" // Номер порта | |
#pragma comment (lib, "Ws2_32.lib") | |
#pragma endregion | |
#pragma region ----- Всякие мелочи . | |
bool EstBuk(char C,char iZna[]){ // Ищит букву в строке | |
bool Rez=false; | |
for (int f=0;((iZna[f]!=0)&&(Rez==false));f++) | |
if (iZna[f]==C) Rez=true; | |
return Rez; | |
}; | |
char HEXTOINT(char i){ // Переводит букву в число A-10 F-15 | |
char Rez=0; | |
if ((i>='0') && (i<='9')) Rez=i-'0' ;else | |
if ((i>='A') && (i<='F')) Rez=i-'A'+10;else | |
if ((i>='a') && (i<='f')) Rez=i-'a'+10; | |
return Rez; | |
} | |
#pragma endregion | |
#pragma region ----- Структура описывающая Строку . | |
int KolStr=0;// Всего строк в системе создано количество | |
const int MaxLenStr=1024*64;// Максимальная длина строки | |
class TStr{ // структура описывающася строку | |
public: | |
int Len;// Длина строки в конце строки всегда 0 Byte[Len]=0; | |
char Byte[MaxLenStr];// Буквы из котрых состоит строка | |
void AddBuk(char c){ // Добавляет букву в конец строки | |
if (Len<MaxLenStr) { // Проверка строки на переполнение | |
Byte[Len]=c; // Дописываю букву | |
Len=Len+1 ; // Увеличиваю длину строки | |
Byte[Len]=0; // Дописываю ноль в конце строки | |
} | |
} | |
void AddBukS(char c){ // Добавляет букву в начало строки | |
if (Len<MaxLenStr) { // Проверка строки на переполнение | |
for(int f=Len;f>=0;f--) Byte[f+1]=Byte[f]; | |
Byte[0]=c ; // Дописываю букву | |
Len=Len+1 ; // Увеличиваю длину строки | |
Byte[Len]=0; // Дописываю ноль в конце строки | |
} | |
} | |
void SetZna(char c[]){ // Создает строку с заданым текстом SetZna("Текст") | |
Len=0; | |
while ((Len<MaxLenStr)&&(c[Len]!=0)) AddBuk(c[Len]); | |
Byte[Len]=0; | |
}; | |
void SetZna(TStr*iStr){ // Создает строку с заданым текстом SetZna("Текст") | |
SetZna(iStr->Byte); | |
}; | |
void DelDo(TStr*iRez,char iZna[]){ // Удаляет бувы из строки до заданых символов | |
iRez->SetZna(""); | |
int f=0 ; | |
while ((f<Len) && (EstBuk(Byte[f],iZna)==false)) | |
{iRez->AddBuk(Byte[f]);f++;} | |
int n=f;// сдвигаю оригинальную строку | |
while (f<Len) {Byte[f-n]=Byte[f];f++;}; | |
Len=Len-n; | |
Byte[Len]=0; | |
} | |
void DelTo(TStr*iRez,char iZna[]){ // Удаляет буквы из строки до заданых символов включая сам сивол | |
DelDo(iRez,iZna); | |
if (Len>0){ | |
for (int f=0;f<Len;f++) | |
Byte[f]=Byte[f+1]; | |
Len=Len-1; | |
Byte[Len]=0;} | |
} | |
void DelTo(char iZna[]){ | |
TStr*iRez=new TStr; | |
DelTo(iRez,iZna); | |
delete iRez; | |
} | |
void DelSp() { // Удаляет все пробелы из строки | |
int f1=0;int f2=0; | |
while (f1<Len){ | |
if (Byte[f1]==' '){ | |
for (f2=f1;f2<Len;f2++) | |
Byte[f2]=Byte[f2+1]; | |
Len=Len-1;} | |
f1=f1+1;}} | |
void AddStr(TStr*iStr){ // Добавлят строку в конец | |
for (int f=0;f<iStr->Len;f++) AddBuk(iStr->Byte[f]); | |
} | |
void AddLn(){ // Добавляет перевод строки | |
AddBuk(13);AddBuk(10); | |
} | |
void SetNom(int iNom){ // записывает число как строку | |
int f=0;char S[11]; | |
do { | |
S[f]=iNom % 10 + '0';f++;iNom /= 10; | |
} while (iNom!=0);S[f]=0;Len=f; | |
for (f=1;f<=Len;f++) | |
Byte[f-1]=S[Len-f]; | |
Byte[Len]=0; | |
} | |
void AddNom(int iNom){ // Добавляет число как строку в конец строки | |
TStr*Str=new TStr(); | |
Str->SetNom(iNom); | |
AddStr(Str); | |
delete Str; | |
} | |
void AddStrLn(TStr*iStr){ // Добавляет строку и перевод строки в конец строки | |
AddStr(iStr); | |
AddLn(); | |
} | |
void AddStrLn(char iStr[]){ | |
TStr*Str =new TStr; | |
Str->SetZna(iStr); | |
AddStrLn(Str); | |
delete Str; | |
} | |
void A(char iStr[]){ | |
AddStrLn(iStr); | |
} | |
void AddStr(char iStr[]){ // Добавляет строку в конец строки | |
TStr*Str = new TStr; | |
Str->SetZna(iStr); | |
AddStr(Str); | |
delete Str; | |
} | |
void Gen(int n){ // Гененрирует строку из случайных букв длиной n | |
Len=n; | |
srand((unsigned int)time(0)); | |
for (int f=0;f<Len;f++) | |
Byte[f]='a'+rand()%26; | |
Byte[Len]=0; | |
} | |
void HexToBin(){ // Переводит строку HEX в текст | |
for (int f=0;f<Len/2;f++){ | |
Byte[f]=HEXTOINT((unsigned char)Byte[f*2]) *16+ | |
HEXTOINT((unsigned char)Byte[f*2+1]); | |
} | |
Len=Len/2; | |
Byte[Len]=0; | |
} | |
void AddNol(int iKol){ // добавляет нули AddNol(3) 3 -> 003 | |
int f=0;int Kol=iKol-Len; | |
for(f=1;f<=Kol;f++) AddBukS('0'); | |
} | |
TStr() { // Конструктор | |
Len=0; // Длина строки 0 | |
Byte[Len]=0; // В конце строки 0 | |
KolStr=KolStr+1; // Сщетчик Количество всего созданых строк | |
} | |
~TStr() { // Детруктор строки | |
Len=0; | |
Byte[Len]=0; | |
KolStr=KolStr-1; // Уменьшаю Количество всего созданых строк | |
} | |
}; | |
#pragma endregion | |
#pragma region ----- Операции с строками . | |
void Cop(TStr *iS1,TStr *iS2){ // Копирует значения из строки iS2 в строку iS1 | |
for (int f=0;f<=iS2->Len;f++)iS1->Byte[f]=iS2->Byte[f]; | |
iS1->Len=iS2->Len; | |
} | |
void Cop(TStr *iS1,char iS2[]){ | |
TStr*S2=new TStr(); | |
S2->SetZna(iS2); | |
Cop(iS1,S2); | |
delete S2; | |
} | |
bool Rav(TStr *iS1,TStr *iS2){ // Сравнивает строки | |
bool Rez=false; | |
if (iS1->Len==iS2->Len) { | |
int f=0;Rez=true; | |
while ((f<iS1->Len)&&(Rez==true)) | |
if (iS1->Byte[f]!=iS2->Byte[f]) Rez=false;else f++; } | |
return Rez; | |
} | |
bool Rav(TStr *iS1,char iS2[]){ // Сравнивает строки | |
TStr*S2=new TStr; | |
S2->SetZna(iS2); | |
bool Rez=Rav(iS1,S2); | |
delete S2; | |
return Rez; | |
} | |
#pragma endregion | |
#pragma region ----- Структура описывающая Переменные . | |
const int MaxKolPer=32; | |
class TPer{ | |
public: | |
int Kol; | |
TStr *PUT; | |
TStr *RAS; | |
TStr *SES; | |
TStr *LOG; | |
TStr *PAS; | |
int NSE;// Номер в масиве сесий | |
int NLO;// Номер пользователя | |
TStr *Nams[MaxKolPer]; | |
TStr *Znas[MaxKolPer]; | |
void Add(TStr *iNam,TStr *iZna){ | |
if (Kol<MaxKolPer){ | |
Kol=Kol+1; | |
Nams[Kol] = new TStr; | |
Znas[Kol] = new TStr; | |
Cop(Nams[Kol],iNam); | |
Cop(Znas[Kol],iZna); | |
} | |
} | |
void Add(char c[],TStr *iZna){ | |
TStr *Nam = new TStr; | |
Nam->SetZna(c); | |
Add(Nam,iZna); | |
delete Nam; | |
} | |
void Add(char iNam[],char iZna[]){ | |
TStr *Nam = new TStr; | |
TStr *Zna = new TStr; | |
Nam->SetZna(iNam); | |
Zna->SetZna(iZna); | |
printf("[%s]",iNam); | |
Add(Nam,Zna); | |
delete Nam; | |
delete Zna; | |
} | |
int FinNam(TStr *iNam){ | |
int f=1 ; int Rez = 0 ; | |
while ((f<=Kol)&&(Rez==0)) | |
if (Rav(Nams[f],iNam)) Rez=f ; else f++ ; | |
return Rez; | |
} | |
int FinNam(char iNam[]){ | |
TStr*Nam=new TStr; | |
Nam->SetZna(iNam); | |
int Rez = FinNam(Nam); | |
delete Nam; | |
return Rez; | |
} | |
void SetZna(TStr *iNam,TStr *iZna){ | |
int Rez; | |
Rez=FinNam(iNam); | |
if (Rez!=0) Cop(Znas[Rez],iZna);else | |
if (Kol<MaxKolPer) Add(iNam,iZna); | |
} | |
void SetZna(char iNam[],TStr*iZna){ | |
TStr*Nam=new TStr; | |
Nam->SetZna(iNam); | |
SetZna(Nam,iZna) ; | |
delete Nam ; | |
} | |
void SetZna(char iNam[],char iZna[]){ | |
TStr*Nam=new TStr; | |
TStr*Zna=new TStr; | |
Nam->SetZna(iNam); | |
Zna->SetZna(iZna); | |
SetZna(Nam,Zna) ; | |
delete Nam ; | |
delete Zna ; | |
} | |
void GetZna(TStr*iRez,TStr *iNam){ | |
int N=FinNam(iNam); | |
if (N!=0) Cop(iRez,Znas[N]); | |
} | |
void GetZna(TStr*iRez,char iNam[]){ | |
TStr *Nam= new TStr; | |
Nam->SetZna(iNam); | |
int N=FinNam(Nam); | |
if (N!=0) Cop(iRez,Znas[N]); | |
delete Nam; | |
} | |
void HexToStr(){ | |
for (int f=1;f<Kol;f++) Znas[f]->HexToBin(); | |
} | |
void LNN(TStr *iStr) { // Разбивает строку на строки | |
TStr *S=new TStr;// ПРомежуточная строка | |
int f=0;// Счетчик букв | |
while (f<iStr->Len) { | |
if (iStr->Byte[f]==13 ) {Add("",S);S->SetZna("");} else | |
if (iStr->Byte[f]>=' ') S->AddBuk(iStr->Byte[f]); | |
f++;} | |
delete S; | |
} | |
void PST(TStr *iStr){ // Парсинг строки | |
int f=0 ; // Читает строку типа ИМЯ=ЗНАЧЕНИЕ&X=12;Z=14 | |
TStr*Nam = new TStr; | |
TStr*Zna = new TStr; | |
while (f<iStr->Len){ | |
iStr->DelTo(Nam,"=" );Nam->DelSp(); | |
iStr->DelTo(Zna,"&; ");Zna->DelSp(); | |
if (Nam->Len!=0) SetZna(Nam,Zna); | |
} | |
delete Nam; | |
delete Zna; | |
} | |
void PZA(TStr *iStr) { // Парсер запроса от браузера | |
//====================================================== | |
TPer*LNN=new TPer() ;// Строки с запросом | |
TStr*SSS=new TStr() ;// ПРомежуточная переменная | |
LNN->LNN(iStr) ;// Разбиваю запрос на строки | |
//====================================================== | |
Cop(SSS,LNN->Znas[1]); // Достаю первую строку запроса | |
SSS->DelTo(PUT,"/?") ; // Удаляю надпись GET | |
SSS->DelTo(PUT,"? ") ; // ЧИтаю путь файла | |
PUT->DelSp() ; // удаляю пробелы | |
if (PUT->Len==0) PUT->SetZna("index.html"); | |
RAS->SetZna(PUT) ; // Читаю расширение файла | |
RAS->DelTo(".") ; // Читаю расширение файла | |
PST(SSS) ; // Парсирую GET Запрос | |
//====================================================== | |
// Читаем зачения Имя : Значение | |
TStr*NAM = new TStr ; // Наименование переменой | |
TStr*ZNA = new TStr ; // Значение переменой | |
int n=2 ; // Номер строки | |
while ((n<MaxKolPer)&&(LNN->Znas[n]->Len!=0)){ | |
Cop(ZNA,LNN->Znas[n]); | |
ZNA->DelTo(NAM,":");NAM->DelSp(); | |
ZNA->DelSp(); | |
Add(NAM,ZNA); | |
n++;} | |
delete NAM ; // Удаляю времные переменные | |
delete ZNA ; // Удаляю времные переменные | |
//====================================================== | |
// Парсирую коки | |
GetZna(SSS,"Cookie") ; | |
PST(SSS); | |
//====================================================== | |
// Парсирую DataSend | |
GetZna(SSS,"DataSend"); | |
if (SSS->Len>0) { | |
SSS->HexToBin(); | |
PST(SSS); | |
} | |
//====================================================== | |
// Читаю сесмюю если нету назначаю | |
GetZna(SES,"SES"); | |
if (SES->Len==0) SES->Gen(16); | |
SetZna("SES",SES); | |
//====================================================== | |
// удаляю временые переменные | |
delete SSS; | |
delete LNN; | |
} | |
TPer(){ | |
Kol=0; | |
Nams[0] =new TStr(); | |
Znas[0] =new TStr(); | |
PUT=new TStr(); // Путь к Файлу | |
RAS=new TStr(); // Расширение файла | |
SES=new TStr(); // Номер сессии | |
LOG=new TStr(); // Номер сессии | |
PAS=new TStr(); // Номер сессии | |
} | |
~TPer(){ | |
delete PUT ; | |
delete RAS ; | |
delete SES ; | |
delete LOG ; | |
delete PAS ; | |
delete Nams[0]; | |
delete Znas[0]; | |
for (int f=1;f<=Kol;f++){ | |
delete Nams[f]; | |
delete Znas[f]; | |
} | |
} | |
}; | |
#pragma endregion | |
#pragma region ----- Структура описывающая качпу . | |
struct TCOL { | |
public: | |
unsigned char R, G, B, A;// Цвета и альфа канал | |
int Y;// Яркость | |
void SetCol(unsigned char iR,unsigned char iG,unsigned char iB,unsigned char iA,int iY){ | |
R=iR; | |
G=iG; | |
B=iB; | |
A=iA; | |
Y=iY; | |
}; // Метод для установки уветов | |
}; // Описание цвета | |
struct TCOO{ | |
int x=0; | |
int y=0; | |
void SetCoo(int iX,int iY){ | |
x=iX; | |
y=iY; | |
}; // Метод для установки уветов | |
}; | |
struct TLI{ | |
TCOL C; | |
TCOO A; | |
TCOO B; | |
}; | |
const int MaxKolin=16; | |
struct TTrSim{ | |
int Kol=0; | |
TLI LIN[MaxKolin]; | |
void AddLin(int x1,int y1,int x2,int y2){ | |
LIN[Kol].A.x=x1; | |
LIN[Kol].A.y=y1; | |
LIN[Kol].B.x=x2; | |
LIN[Kol].B.y=y2; | |
Kol=Kol+1; | |
} | |
void SetCoo(int iX,int iY){ | |
for (int f=0;f<Kol;f++){ | |
LIN[f].A.x=LIN[f].A.x+iX; | |
LIN[f].A.y=LIN[f].A.y+iY; | |
LIN[f].B.x=LIN[f].B.x+iX; | |
LIN[f].B.y=LIN[f].B.y+iY; | |
} | |
} | |
void SetCoo(TCOO iCoo){ | |
SetCoo(iCoo.x,iCoo.y); | |
} | |
void SetSiz(float iSiz){ | |
for (int f=0;f<Kol;f++){ | |
LIN[f].A.x=(int)((float)LIN[f].A.x*iSiz); | |
LIN[f].A.y=(int)((float)LIN[f].A.y*iSiz); | |
LIN[f].B.x=(int)((float)LIN[f].B.x*iSiz); | |
LIN[f].B.y=(int)((float)LIN[f].B.y*iSiz); | |
} | |
} | |
void SetSiz(TCOO iCoo){ | |
SetSiz(1); | |
} | |
}; | |
struct TTrSims{ | |
TTrSim TrSims[255]; | |
TTrSims(){ | |
TrSims['A'].AddLin(0 ,0 ,50 ,100); | |
TrSims['A'].AddLin(50 ,100,100,0 ); | |
TrSims['A'].AddLin(25 ,50 ,75 ,50 ); | |
TrSims['B'].AddLin(0 ,0 ,0 ,100); | |
TrSims['B'].AddLin(0 ,100,50 ,100); | |
TrSims['B'].AddLin(50 ,100,100,90 ); | |
TrSims['B'].AddLin(100,90 ,100,80 ); | |
TrSims['B'].AddLin(100,80 ,25 ,70 ); | |
TrSims['B'].AddLin(50 ,70 ,0 ,70 ); | |
TrSims['B'].AddLin(50 ,70 ,100,60 ); | |
TrSims['B'].AddLin(100,60 ,100,10 ); | |
TrSims['B'].AddLin(100,10 ,50 ,0 ); | |
TrSims['B'].AddLin(50 ,0 ,0 ,0 ); | |
TrSims['C'].AddLin(0 ,0 ,0 ,100); | |
TrSims['C'].AddLin(0 ,100,100 ,100); | |
TrSims['C'].AddLin(0 ,0 ,100 ,0); | |
TrSims['D'].AddLin(0 ,0 ,0 ,100); | |
TrSims['D'].AddLin(0 ,100,50 ,100); | |
TrSims['D'].AddLin(50 ,100,100 ,75 ); | |
TrSims['D'].AddLin(100,75 ,100 ,25 ); | |
TrSims['D'].AddLin(100,25 ,50 ,0 ); | |
TrSims['D'].AddLin(50 ,0 ,0 ,0 ); | |
TrSims['E'].AddLin(0 ,0 ,0 ,100); | |
TrSims['E'].AddLin(0 ,0 ,100 ,0 ); | |
TrSims['E'].AddLin(0 ,50 ,100 ,50 ); | |
TrSims['E'].AddLin(0 ,100,100 ,100); | |
TrSims['F'].AddLin(0 ,0 ,0 ,100); | |
TrSims['F'].AddLin(0 ,50 ,75 ,50 ); | |
TrSims['F'].AddLin(0 ,100,100 ,100); | |
TrSims['G'].AddLin(0 ,25 ,0 ,75 ); | |
TrSims['G'].AddLin(0 ,75 ,25 ,100); | |
TrSims['G'].AddLin(25 ,100,75 ,100); | |
TrSims['G'].AddLin(75 ,100,100 ,75 ); | |
TrSims['G'].AddLin(0 ,25 ,25 ,0 );//-- | |
TrSims['G'].AddLin(25 ,0 ,75 ,0 ); | |
TrSims['G'].AddLin(75 ,0 ,100 ,25 ); | |
TrSims['G'].AddLin(100,25 ,50 ,25 ); | |
TrSims['H'].AddLin(0 ,0 ,0 ,100); | |
TrSims['H'].AddLin(0 ,50 ,100 ,50 ); | |
TrSims['H'].AddLin(100,0 ,100 ,100); | |
TrSims['I'].AddLin(25 ,100,75 ,100); | |
TrSims['I'].AddLin(25 ,0 ,75 ,0 ); | |
TrSims['I'].AddLin(50 ,0 ,50 ,100); | |
TrSims['J'].AddLin(0 ,25 ,25 ,0 ); | |
TrSims['J'].AddLin(25 ,0 ,50 ,0 ); | |
TrSims['J'].AddLin(50 ,0 ,75 ,25 ); | |
TrSims['J'].AddLin(75 ,25 ,75 ,100); | |
TrSims['J'].AddLin(75 ,100,25 ,100); | |
TrSims['K'].AddLin(0 ,0 ,0 ,100); | |
TrSims['K'].AddLin(0 ,50 ,100 ,100); | |
TrSims['K'].AddLin(0 ,50 ,100 ,0 ); | |
TrSims['L'].AddLin(0 ,0 ,0 ,100); | |
TrSims['L'].AddLin(0 ,0 ,100 ,0 ); | |
TrSims['M'].AddLin(0 ,0 ,0 ,100); | |
TrSims['M'].AddLin(100,0 ,100 ,100); | |
TrSims['M'].AddLin(0 ,100,50 ,50 ); | |
TrSims['M'].AddLin(50 ,50 ,100 ,100); | |
TrSims['N'].AddLin(0 ,0 ,0 ,100); | |
TrSims['N'].AddLin(100,0 ,100 ,100); | |
TrSims['N'].AddLin(0 ,100,100 , 0); | |
TrSims['O'].AddLin(0 ,25 ,0 ,75 ); | |
TrSims['O'].AddLin(0 ,75 ,25 ,100 ); | |
TrSims['O'].AddLin(25 ,100,75 ,100 ); | |
TrSims['O'].AddLin(75 ,100,100,75 ); | |
TrSims['O'].AddLin(100,75 ,100,25 ); | |
TrSims['O'].AddLin(100,25 ,75 ,0 ); | |
TrSims['O'].AddLin(75 ,0 ,25 ,0 ); | |
TrSims['O'].AddLin(25 ,0 ,0 ,25 ); | |
TrSims['P'].AddLin(0 ,0 ,0 ,100); | |
TrSims['P'].AddLin(0 ,50 ,75 ,50 ); | |
TrSims['P'].AddLin(75 ,50 ,100 ,60 ); | |
TrSims['P'].AddLin(100,60 ,100 ,80 ); | |
TrSims['P'].AddLin(100,80 ,75 ,100); | |
TrSims['P'].AddLin(75 ,100,0 ,100); | |
TrSims['Q'].AddLin(0 ,25 ,0 ,75 ); | |
TrSims['Q'].AddLin(0 ,75 ,25 ,100 ); | |
TrSims['Q'].AddLin(25 ,100,75 ,100 ); | |
TrSims['Q'].AddLin(75 ,100,100,75 ); | |
TrSims['Q'].AddLin(100,75 ,100,25 ); | |
TrSims['Q'].AddLin(100,25 ,75 ,0 ); | |
TrSims['Q'].AddLin(75 ,0 ,25 ,0 ); | |
TrSims['Q'].AddLin(25 ,0 ,0 ,25 ); | |
TrSims['Q'].AddLin(100,0 ,50 ,50 ); | |
TrSims['R'].AddLin(0 ,0 ,0 ,100); | |
TrSims['R'].AddLin(0 ,50 ,75 ,50 ); | |
TrSims['R'].AddLin(75 ,50 ,100 ,60 ); | |
TrSims['R'].AddLin(100,60 ,100 ,80 ); | |
TrSims['R'].AddLin(100,80 ,75 ,100); | |
TrSims['R'].AddLin(75 ,100,0 ,100); | |
TrSims['R'].AddLin(75 ,50 ,100 , 0); | |
TrSims['S'].AddLin(100,75 ,75 ,100 ); | |
TrSims['S'].AddLin(75 ,100,25 ,100 ); | |
TrSims['S'].AddLin(25 ,100,0 ,50 ); | |
TrSims['S'].AddLin(0 ,50 ,75 ,50 ); | |
TrSims['S'].AddLin(75 ,50 ,100,25 ); | |
TrSims['S'].AddLin(100,25 ,75 ,0 ); | |
TrSims['S'].AddLin(75 ,0 ,25 ,0 ); | |
TrSims['S'].AddLin(25 ,0 ,0 ,25 ); | |
TrSims['T'].AddLin(10 ,100,90 ,100 ); | |
TrSims['T'].AddLin(50 ,100,50 ,0 ); | |
TrSims['U'].AddLin(0 ,100,0 ,25 ); | |
TrSims['U'].AddLin(0 ,25 ,25 ,0 ); | |
TrSims['U'].AddLin(25 ,0 ,75 ,0 ); | |
TrSims['U'].AddLin(75 ,0 ,100,25 ); | |
TrSims['U'].AddLin(100,25 ,100,100 ); | |
TrSims['V'].AddLin(0 ,100,50 ,0 ); | |
TrSims['V'].AddLin(50 ,0 ,100,100 ); | |
TrSims['W'].AddLin(0 ,100,25 ,0 ); | |
TrSims['W'].AddLin(25 ,0 ,50 ,50 ); | |
TrSims['W'].AddLin(50 ,50 ,75 ,0 ); | |
TrSims['W'].AddLin(75 ,0 ,100,100 ); | |
TrSims['X'].AddLin(0 ,0 ,100,100 ); | |
TrSims['X'].AddLin(0 ,100,100,0 ); | |
TrSims['Y'].AddLin(50 ,0 ,50 ,50 ); | |
TrSims['Y'].AddLin(50 ,50 ,0 ,100 ); | |
TrSims['Y'].AddLin(50 ,50 ,100,100 ); | |
TrSims['Z'].AddLin(0 ,100,100 ,100 ); | |
TrSims['Z'].AddLin(0 ,0 ,100 ,100 ); | |
TrSims['Z'].AddLin(0 ,0 ,100 ,0 ); | |
} | |
}; | |
TTrSims TrSims; | |
const int MAxHirTex=200; | |
const int MAxVisTex=200; | |
class TTe { // Структура описывающая картинку | |
public: | |
char NAM[1000]; // Имя картинки | |
unsigned int TEX; // Идентификатор структуры | |
int Hir; // Ширина | |
int Vis; // Высота | |
char DAT[(MAxHirTex*MAxVisTex * 4)+255]; // Массив с пикселями | |
void Cle() { | |
for (int f = 1; f<MAxHirTex*MAxVisTex * 4; f++) | |
DAT[f] = 200; | |
}; // Очистка массива | |
void WPi(int iX, int iY, TCOL iCol) { | |
DAT[(((iY - 1)*Hir + iX) - 1) * 4 + 0] = iCol.R; | |
DAT[(((iY - 1)*Hir + iX) - 1) * 4 + 1] = iCol.G; | |
DAT[(((iY - 1)*Hir + iX) - 1) * 4 + 2] = iCol.B; | |
DAT[(((iY - 1)*Hir + iX) - 1) * 4 + 3] = iCol.A; | |
};// Записать пиксель | |
TCOL RPi(int iX, int iY) { | |
TCOL Rez; | |
Rez.R = DAT[(((iY - 1)*Hir + iX) - 1) * 4 + 0]; | |
Rez.G = DAT[(((iY - 1)*Hir + iX) - 1) * 4 + 1]; | |
Rez.B = DAT[(((iY - 1)*Hir + iX) - 1) * 4 + 2]; | |
Rez.A = DAT[(((iY - 1)*Hir + iX) - 1) * 4 + 3]; | |
return Rez; | |
};// Прочитать пиксель | |
void LoadFromFile(char iNam[]) { | |
// Написано по матерьялам http://www.gamedev.ru/code/articles/TGA | |
// и http://cppstudio.com/post/446/ | |
// http://www.cplusplus.com/reference/istream/istream/read/ | |
char * buf = new char [MAxHirTex*MAxVisTex * 4]; | |
int SiHe;// Длина текстовой информации в конце заголовка файла | |
char KOlBI;// Количество бит на цвет ; | |
int NBM = 0;// номер байта читаемого после заголовка он же номер куда нужно записывать в масиве | |
int NBF = 1;// Номер читаемого байта из файла | |
int len = 0; | |
std::ifstream fin(iNam,std::ios_base::binary); // открыли бинарный файл для чтения | |
if (fin.is_open()==true) // если файл открыт | |
{ | |
fin.read(buf,(MAxHirTex*MAxVisTex * 4)); // читаю файл в буфер | |
fin.close(); // закрываем файл | |
len = (MAxHirTex*MAxVisTex * 4);// тут нужно будет дописать количество реально прочитаных байт | |
if (len > 18) { // Если файл удалося прочитать | |
SiHe = (BYTE)buf[0];// Длина текстовой информации после первого 18-ти байтового блока. Может быть использована для описания файла | |
Hir = ((unsigned char) buf[12] + ((unsigned char)buf[13] * 256));// Читаем ширину изображения | |
Vis = ((unsigned char) buf[14] + ((unsigned char)buf[15] * 256));// Читаем Высоту изображения | |
KOlBI = buf[16];// Читаем количество бит на пиксель 24 или 32 | |
NBF = 17 + SiHe;// читаем после заголовка | |
NBM = 0;// записываем пиксели с нулегого байта в масив | |
if (KOlBI == 32) | |
while ((NBF + 3) <= len) { // читаем пкоа не кончился (файл буфер) | |
DAT[NBM + 0] = buf[NBF + 3];// Переворачиваем последовательность ABGR в RGBA | |
DAT[NBM + 1] = buf[NBF + 2]; | |
DAT[NBM + 2] = buf[NBF + 1]; | |
DAT[NBM + 3] = buf[NBF + 0]; | |
NBF = NBF + 4;// Номер читаемого байа | |
NBM = NBM + 4;// Номер записываемого байта | |
}; | |
} | |
} | |
} | |
void Rehetka(){ | |
TCOL col1 ; // Используеться для рисования картинки по умолчаню | |
col1.R = 0;// указываю фоновый цвет | |
col1.G = 0; | |
col1.B = 0; | |
col1.A = 255;// НЕ прозрачный | |
col1.Y = 0; | |
TCOL col2 ; // Используеться для рисования картинки по умолчаню | |
col2.R = 200;// указываю фоновый цвет | |
col2.G = 200; | |
col2.B = 200; | |
col2.A = 255;// НЕ прозрачный | |
col2.Y = 0 ; | |
for (int x = 1; x <= Hir; x++) // В цикле рисуем сетку квадратиками | |
for (int y = 1; y <= Vis; y++) | |
if(((x == 1) || (x == Hir)) | |
|| ((y == 1) || (y == Vis)) | |
|| (((double)x / 5) == round(x / 5)) | |
|| (((double)y / 5) == round(y / 5))) | |
{WPi(x, y, col1);} else {WPi(x, y, col2);} | |
} | |
void Line(int x1, int y1, int x2, int y2,TCOL iCol){ | |
int RasX = x2 - x1 ; | |
int RasY = y2 - y1 ; | |
int MRas=abs(RasY); if (abs(RasX)>abs(RasY)) MRas=abs(RasX); | |
float HagX=(float)RasX/(float)MRas; | |
float HagY=(float)RasY/(float)MRas; | |
float x=(float)x1; | |
float y=(float)y1; | |
for (int f=0;f<=MRas;f++){ | |
WPi((int)x,(int)y,iCol); | |
x=x+HagX; | |
y=y+HagY; | |
} | |
} | |
void Line(TLI iLin,TCOL iCol){ | |
Line(iLin.A.x,iLin.A.y,iLin.B.x,iLin.B.y,iCol); | |
} | |
void Bukv(TTrSim iBuk,TCOO iCoo,float iSiz,TCOL iCol){ | |
iBuk.SetSiz(iSiz); | |
iBuk.SetCoo(iCoo); | |
for (int l=0;l<iBuk.Kol;l++) Line(iBuk.LIN[l],iCol); | |
} | |
TTrSim Bukv(char iBuk,TCOO iCoo,float iSiz,TCOL iCol){ | |
TTrSim Buk=TrSims.TrSims[iBuk]; | |
Bukv(Buk,iCoo,iSiz,iCol); | |
return Buk; | |
} | |
void Text(TStr*iStr ,TCOO iCoo,float iSiz,TCOL iCol){ | |
for (int f=0;f<iStr->Len;f++){ | |
Bukv(iStr->Byte[f],iCoo,iSiz,iCol); | |
iCoo.x=iCoo.x+(int)(120*iSiz); | |
} | |
} | |
void Text(char iStr[],TCOO iCoo,float iSiz,TCOL iCol){ | |
TStr*Str = new TStr; | |
Str->SetZna(iStr); | |
Text(Str,iCoo,iSiz,iCol); | |
delete Str; | |
} | |
TStr*TgaAsStr(){ | |
TStr*Rez = new TStr(); | |
Rez->Byte[0 ]=0;//Длина текстовой информации после первого 18-ти байтового блока. Может быть использована для описания файла | |
Rez->Byte[1 ]=0;//Идентификатор наличия цветовой карты, здесь не описан - устарел | |
Rez->Byte[2 ]=0;//Тип данных - запакованный или нет | |
Rez->Byte[3 ]=0;//Информация о цветовой карте - нужно пропустить эти 5 байт | |
Rez->Byte[4 ]=0;//Информация о цветовой карте - нужно пропустить эти 5 байт | |
Rez->Byte[5 ]=0;//Информация о цветовой карте - нужно пропустить эти 5 байт | |
Rez->Byte[6 ]=0;//Информация о цветовой карте - нужно пропустить эти 5 байт | |
Rez->Byte[7 ]=0;//Информация о цветовой карте - нужно пропустить эти 5 байт | |
Rez->Byte[8 ]=0;// int Начало изображения по оси X | |
Rez->Byte[9 ]=0;// int Начало изображения по оси X | |
Rez->Byte[10]=0;// int Начало изображения по оси Y | |
Rez->Byte[11]=0;// int Начало изображения по оси Y | |
Rez->Byte[12]=0;// int Ширина изображения | |
Rez->Byte[13]=0;// int Ширина изображения | |
Rez->Byte[14]=0;// int высота изображения | |
Rez->Byte[15]=0;// int высота изображения | |
Rez->Byte[16]=24;//Кол-во бит на пиксель - здесь только 24 или 32 | |
Rez->Byte[17]=0 ;//Описание - пропускайте если длина описания 0 то сздесь начинаються данные | |
Rez->Byte[18]=0 ;//если длина описания 0 то сздесь начинаються данные | |
TCOL COO;Rez->Len=18; | |
for (int x = 1; x <= Hir; x++) // В цикле рисуем сетку квадратиками | |
for (int y = 1; y <= Vis; y++) { | |
COO=RPi(x,y); | |
Rez->Byte[Rez->Len+0]=COO.R; | |
Rez->Byte[Rez->Len+1]=COO.G; | |
Rez->Byte[Rez->Len+2]=COO.B; | |
Rez->Len=Rez->Len+3; | |
} | |
return Rez; | |
} | |
TStr*BmpAsStr() // В каждом элементе упаковано все три RGB-байта | |
{ // Написано по матерьялам | |
// http://math.ivanovo.ac.ru/dalgebra/Khashin/gr/bmp/bmp.html | |
// http://gamesmaker.ru/programming/graphics/format-dannyh-bmp-bitmap/ | |
// http://c-site.h1.ru/infa/bmp_struct.htm | |
TStr*Rez = new TStr(); | |
//-------------------------------------------------------------------------------------------------- | |
Rez->Byte[0 ]=0x42;// WORD bfType; // 0x4d42 | 0x4349 | 0x5450 | |
Rez->Byte[1 ]=0x4d;// WORD bfType; // 0x4d42 | 0x4349 | 0x5450 | |
Rez->Byte[2 ]=0 ;// int bfSize; // размер файла 14+40+100*100*4 | |
Rez->Byte[3 ]=0 ;// int bfSize; // размер файла | |
Rez->Byte[4 ]=0 ;// int bfSize; // размер файла | |
Rez->Byte[5 ]=0 ;// int bfSize; // размер файла | |
Rez->Byte[2]=54+(Vis*Hir); | |
Rez->Byte[6 ]=0 ;// int bfReserved; // зарезервировано | |
Rez->Byte[7 ]=0 ;// int bfReserved; // зарезервировано | |
Rez->Byte[8 ]=0 ;// int bfReserved; // зарезервировано | |
Rez->Byte[9 ]=0 ;// int bfReserved; // зарезервировано | |
Rez->Byte[10]=54 ;// int bfOffBits; // смещение до поля данных, 14+40 | |
Rez->Byte[11]=0 ;// int bfOffBits; // смещение до поля данных, | |
Rez->Byte[12]=0 ;// int bfOffBits; // смещение до поля данных, | |
Rez->Byte[13]=0 ;// int bfOffBits; // смещение до поля данных, | |
//-------------------------------------------------------------------------------------------------- | |
Rez->Byte[14]=40 ;// int biSize; // размер струкуры в байтах: 40(BITMAPINFOHEADER) или 108(BITMAPV4HEADER) или 124(BITMAPV5HEADER) | |
Rez->Byte[15]=0 ;// int biSize; // размер струкуры в байтах: 40(BITMAPINFOHEADER) или 108(BITMAPV4HEADER) или 124(BITMAPV5HEADER) | |
Rez->Byte[16]=0 ;// int biSize; // размер струкуры в байтах: 40(BITMAPINFOHEADER) или 108(BITMAPV4HEADER) или 124(BITMAPV5HEADER) | |
Rez->Byte[17]=0 ;// int biSize; // размер струкуры в байтах: 40(BITMAPINFOHEADER) или 108(BITMAPV4HEADER) или 124(BITMAPV5HEADER) | |
Rez->Byte[18]=Hir ;// int biWidth; // ширина в точках | |
Rez->Byte[19]=0 ;// int biWidth; // ширина в точках | |
Rez->Byte[20]=0 ;// int biWidth; // ширина в точках | |
Rez->Byte[21]=0 ;// int biWidth; // ширина в точках | |
Rez->Byte[22]=Vis ;// int biHeight; // высота в точках | |
Rez->Byte[23]=0 ;// int biHeight; // высота в точках | |
Rez->Byte[24]=0 ;// int biHeight; // высота в точках | |
Rez->Byte[25]=0 ;// int biHeight; // высота в точках | |
Rez->Byte[26]=1 ;// WORD biPlanes; // всегда должно быть 1 | |
Rez->Byte[27]=0 ;// WORD biPlanes; // всегда должно быть 1 | |
Rez->Byte[28]=32 ;// WORD biBitCount; // 0 | 1 | 4 | 8 | 16 | 24 | 32 | |
Rez->Byte[29]=0 ;// WORD biBitCount; // 0 | 1 | 4 | 8 | 16 | 24 | 32 | |
Rez->Byte[30]=0 ;// int biCompression; // BI_RGB | BI_RLE8 | BI_RLE4 |// BI_BITFIELDS | BI_JPEG | BI_PNG// реально используется лишь BI_RGB | |
Rez->Byte[31]=0 ;// int biCompression; // BI_RGB | BI_RLE8 | BI_RLE4 |// BI_BITFIELDS | BI_JPEG | BI_PNG// реально используется лишь BI_RGB | |
Rez->Byte[32]=0 ;// int biCompression; // BI_RGB | BI_RLE8 | BI_RLE4 |// BI_BITFIELDS | BI_JPEG | BI_PNG// реально используется лишь BI_RGB | |
Rez->Byte[33]=0 ;// int biCompression; // BI_RGB | BI_RLE8 | BI_RLE4 |// BI_BITFIELDS | BI_JPEG | BI_PNG// реально используется лишь BI_RGB | |
Rez->Byte[34]=0 ;// int biSizeImage; // Количество байт в поле данных // Обычно устанавливается в 0 | |
Rez->Byte[35]=0 ;// int biSizeImage; // Количество байт в поле данных // Обычно устанавливается в 0 | |
Rez->Byte[36]=0 ;// int biSizeImage; // Количество байт в поле данных // Обычно устанавливается в 0 | |
Rez->Byte[37]=0 ;// int biSizeImage; // Количество байт в поле данных // Обычно устанавливается в 0 | |
Rez->Byte[38]=0 ;// int biXPelsPerMeter;// горизонтальное разрешение, точек на дюйм | |
Rez->Byte[39]=0 ;// int biXPelsPerMeter;// горизонтальное разрешение, точек на дюйм | |
Rez->Byte[40]=0 ;// int biXPelsPerMeter;// горизонтальное разрешение, точек на дюйм | |
Rez->Byte[41]=0 ;// int biXPelsPerMeter;// горизонтальное разрешение, точек на дюйм | |
Rez->Byte[42]=0 ;// int biYPelsPerMeter;// вертикальное разрешение, точек на дюйм | |
Rez->Byte[43]=0 ;// int biYPelsPerMeter;// вертикальное разрешение, точек на дюйм | |
Rez->Byte[44]=0 ;// int biYPelsPerMeter;// вертикальное разрешение, точек на дюйм | |
Rez->Byte[45]=0 ;// int biYPelsPerMeter;// вертикальное разрешение, точек на дюйм | |
Rez->Byte[46]=0 ;// int biClrUsed; // Количество используемых цветов // (если есть таблица цветов) | |
Rez->Byte[47]=0 ;// int biClrUsed; // Количество используемых цветов // (если есть таблица цветов) | |
Rez->Byte[48]=0 ;// int biClrUsed; // Количество используемых цветов // (если есть таблица цветов) | |
Rez->Byte[49]=0 ;// int biClrUsed; // Количество используемых цветов // (если есть таблица цветов) | |
Rez->Byte[50]=0 ;// int biClrImportant; // Количество существенных цветов. // Можно считать, просто 0 | |
Rez->Byte[51]=0 ;// int biClrImportant; // Количество существенных цветов. // Можно считать, просто 0 | |
Rez->Byte[52]=0 ;// int biClrImportant; // Количество существенных цветов. // Можно считать, просто 0 | |
Rez->Byte[53]=0 ;// int biClrImportant; // Количество существенных цветов. // Можно считать, просто 0 | |
TCOL COO;Rez->Len=54; | |
for (int y = 1; y <= Vis; y++) | |
for (int x = 1; x <= Hir; x++) {// В цикле рисуем сетку квадратиками | |
COO=RPi(x,y); | |
Rez->Byte[Rez->Len+0]=COO.B; | |
Rez->Byte[Rez->Len+1]=COO.G; | |
Rez->Byte[Rez->Len+2]=COO.R; | |
Rez->Byte[Rez->Len+3]=COO.A; | |
Rez->Len=Rez->Len+4; | |
} | |
return Rez; | |
} | |
TTe(char iNam[], int iHir, int iVis) { | |
Hir = iHir;// Указываю Ширину картинки | |
Vis = iVis;// указываю высоту картинки | |
//Rehetka(); | |
Cle(); | |
TCOL Col; | |
//Col.SetCol(0,0,0,0,0); | |
//LoadFromFile(iNam);// если существует Картинка с таким именем то загружаем | |
};// Конструктор картинок | |
}; | |
#pragma endregion | |
#pragma region ----- Структура описывающая Пользователей . | |
const int MaxKolLog=16;// максимальное количество пользователей | |
int NewLog[MaxKolLog]; | |
class TLogs { | |
public: | |
TPer Logs[MaxKolLog]; | |
int Fin(TStr*iLog){ | |
int Rez=0;int f=1; | |
while ((f<MaxKolLog) && (Rez==0)){ | |
if (Rav(Logs[f].LOG,iLog)) Rez=f; | |
f++;} | |
return Rez; | |
} | |
int New(int iNomZap){ | |
NewLog[iNomZap]=-1; | |
while (NewLog[iNomZap]==-1) Sleep(100); | |
int Rez=NewLog[iNomZap]; | |
return Rez; | |
} | |
int Add(TStr*iLog,TStr*iPas,int iNomZap) { | |
int Rez=New(iNomZap); | |
if (Rez!=0){ | |
Logs[Rez].LOG->SetZna(iLog); | |
Logs[Rez].PAS->SetZna(iPas); | |
} | |
return Rez; | |
} | |
TLogs(){ | |
} | |
~TLogs(){ | |
} | |
}; | |
TLogs Logs; | |
#pragma endregion | |
#pragma region ----- Структура описывающая Сессии . | |
const int MaxKolSes=16; // Максимальное воличество сесий | |
int NewSes[MaxKolSes]; | |
class TSess{ | |
public: | |
TPer Ses[MaxKolSes]; | |
int Fin(TStr*iSes){ // Поиск сесии в списке | |
int Rez=0;int f=1; | |
while ((f<MaxKolSes) && (Rez==0)){ | |
if (Rav(Ses[f].SES,iSes)==true) Rez=f; | |
f++; | |
} | |
return Rez; | |
} | |
int New(TStr*iSes,int iNomZap){ | |
NewSes[iNomZap]=-1; | |
while (NewSes[iNomZap]==-1) Sleep(100); | |
int Rez=NewSes[iNomZap]; | |
return Rez; | |
} | |
int Con(TPer*iPer,int iNomZap){ // Достает списко хранимых значений если есть | |
int Rez=0;// Номер куда записал сесию в масиве | |
if (iPer->SES->Len!=0) // Если в списке параметров есть поле SES | |
{//-------------------------------------------------------------------- | |
Rez=Fin(iPer->SES);// Ищю сесию с таким номером в масиве сесий | |
if (Rez==0) Rez=New(iPer->SES,iNomZap);// Если сесии не существует ищим место | |
if (Rez!=0) { // Копирую нужные значения | |
TStr*SSS=new TStr;// Создаю временую строку | |
Cop(Ses[Rez].SES,iPer->SES);// Записываю номер сесси | |
if (iPer->FinNam("RegReg")!=0) {iPer->GetZna(SSS,"RegReg");Ses[Rez].SetZna("RegReg",SSS);} | |
if (iPer->FinNam("EntEnt")!=0) {iPer->GetZna(SSS,"EntEnt");Ses[Rez].SetZna("EntEnt",SSS);} | |
delete SSS;// Удаляю временую строку | |
} | |
}//-------------------------------------------------------------------- | |
// присоеденяю логин -------------------------------------------------- | |
// -------------------------------------------------------------------- | |
return Rez; | |
} | |
TSess(){ // Конструктор | |
}; | |
~TSess(){ // Деструктор | |
}; | |
}; | |
TSess Sess;// Сдесь храняться данные от всех сесий | |
#pragma endregion | |
#pragma region ----- Структура описывающая Сообщения . | |
int KolId=1; | |
class TMes { // Структура для хранения сообщений | |
public: | |
int Id; // Уникальный идентификатор сообщения | |
time_t Data; // Дата сообщения | |
bool Priv; // ПРиватное особщенеи или нет | |
int Tip; // Тип сообщения чат нвоость уведомление | |
TStr *Chat; // К Какому чату разделу относиться сообщение | |
TStr *Log1; // ОТ кого сообщение | |
TStr *Log2; // Кому сообщение | |
TStr *Text; // Текст сообщения | |
bool Edit; // Зпись редактируеться | |
void Cre(){ // ПРосто создает все поля пока так сойдет | |
Chat=new TStr(); | |
Text=new TStr(); | |
Log1=new TStr(); | |
Log2=new TStr(); | |
} | |
TMes(){ | |
Data=(int)0; | |
Edit=false; | |
Tip=0; | |
Priv=false; | |
Chat=NULL; | |
Text=NULL; | |
Log1=NULL; | |
Log2=NULL; | |
Id=KolId; | |
KolId=KolId+1; | |
} | |
~TMes(){ | |
if (Chat!=NULL) delete Chat; | |
if (Text!=NULL) delete Text; | |
if (Log1!=NULL) delete Log1; | |
if (Log2!=NULL) delete Log2; | |
} | |
}; | |
void Cop(TMes*iMes1,TMes*iMes2){ // Копирет сообщение создает нужные поля если нужно | |
iMes1->Data=iMes2->Data; | |
iMes1->Edit=iMes2->Edit; | |
iMes1->Priv=iMes2->Priv; | |
iMes1->Tip =iMes2->Tip ; | |
iMes1->Id =iMes2->Id ; | |
if (iMes1->Chat==NULL) iMes1->Chat=new TStr(); | |
if (iMes1->Text==NULL) iMes1->Text=new TStr(); | |
if (iMes1->Log1==NULL) iMes1->Log1=new TStr(); | |
if (iMes1->Log2==NULL) iMes1->Log2=new TStr(); | |
Cop(iMes1->Chat,iMes2->Chat); | |
Cop(iMes1->Text,iMes2->Text); | |
Cop(iMes1->Log1,iMes2->Log1); | |
Cop(iMes1->Log2,iMes2->Log2); | |
} | |
TMes CreMes(TStr*iMes){ | |
TMes Rez; | |
Rez.Data=time(NULL); | |
Rez.Data=time(NULL); | |
return Rez; | |
} | |
const int MaxKolMes=16; // Максимальное количество сообщений | |
int NewMes[MaxKolMes]; | |
class TCha{ // time (NULL); // Массив с ссообщениями | |
public: | |
int Kol;// | |
TMes*Mess[MaxKolMes]; // Масив где храняться сообщения | |
int New(TMes*iMes,int iNomZap){ // Ищим самое старое сообщение | |
NewMes[iNomZap]=-1; | |
while (NewMes[iNomZap]==-1) Sleep(100); | |
int Rez=NewMes[iNomZap]; | |
return Rez; | |
} | |
void Add(TMes*iMes,int iNomZap) { // Добавить сообщение | |
int R=New(iMes,iNomZap); // ТО куда будем записывать сообщение | |
if (R!=0) { | |
Cop(Mess[R],iMes); // копируем сообщение | |
Mess[R]->Edit=true; // Разрешаю редактирование | |
} | |
} | |
int AddH(TMes*iMes,int iKol){ // Добавляет сообщения в списке в хронологическом порядке | |
int f=1 ; int Rez=0; | |
while ((f<=MaxKolMes)&&(f<=iKol)&&(Rez==0)){ | |
if (Mess[f]->Data<iMes->Data){ | |
delete Mess[iKol+1]; | |
for (int f2=iKol;f2>=f;f2--) Mess[f2+1]=Mess[f2]; | |
Rez=f; | |
Mess[Rez]=new TMes; | |
Cop(Mess[Rez],iMes);// копирую сообщение | |
if (Kol<=iKol)Kol=Kol+1; | |
}f++; | |
} | |
return Rez; | |
} | |
TCha*Get(TPer*Per,int iKol){ // Получить последнии сообщения | |
TCha*Rez = new TCha;// Список выводимых сообщенй | |
int f=0 ; | |
for (f=1;(f<MaxKolMes);f++) | |
Rez->AddH(Mess[f],iKol); | |
return Rez; | |
} | |
TCha (){ // Конструктор | |
Kol=0; | |
for (int f=0;f<MaxKolMes;f++) // пока так упсть будет | |
Mess[f]=new TMes(); | |
} | |
~TCha (){ // Деструктор | |
for (int f=0;f<MaxKolMes;f++) // Для отладки сойдет и так | |
delete Mess[f]; | |
} | |
}; | |
TCha*Cha=new TCha(); | |
void PrintCha(TCha*iCha) { | |
for (int f=0;f<MaxKolMes;f++) | |
{ | |
printf("[ "); | |
printf(" %d ",f); | |
if (iCha->Mess[f]->Text!=NULL) | |
printf(" %s ",iCha->Mess[f]->Text->Byte); | |
printf(" ] \n\r"); | |
} | |
}; | |
#pragma endregion | |
#pragma region ----- Страницы сайта . | |
void JS_convertFromHex(TStr*Rez){ | |
// Преобразует строку в HEX | |
Rez->AddStrLn("function convertFromHex(hex) {"); | |
Rez->AddStrLn("var hex = hex.toString();"); | |
Rez->AddStrLn("var str = '';"); | |
Rez->AddStrLn("for (var i = 0; i < hex.length; i += 2)"); | |
Rez->AddStrLn("str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));"); | |
Rez->AddStrLn("return str;"); | |
Rez->AddStrLn("}"); | |
Rez->AddLn(); | |
} | |
void JS_convertToHex(TStr*Rez){ | |
// Преобразует строку в HEX | |
Rez->AddStrLn("function convertToHex(str) {"); | |
Rez->AddStrLn("var hex = '';"); | |
Rez->AddStrLn("for(var i=0;i<str.length;i++) {"); | |
Rez->AddStrLn("hex += ''+str.charCodeAt(i).toString(16);"); | |
Rez->AddStrLn("}"); | |
Rez->AddStrLn("return hex;"); | |
Rez->AddStrLn("}") ; | |
} | |
void JS_AddMesInChat(TStr*Rez){ | |
// Добавляет сообщение в Чат | |
Rez->AddStrLn("function AddMesInChat(iId,iTex){"); | |
Rez->AddStrLn("if (document.getElementById(iId)==null){"); | |
Rez->AddStrLn(" var newDiv = document.createElement('div');"); | |
Rez->AddStrLn(" newDiv.style.marginTop='1%';"); | |
Rez->AddStrLn(" newDiv.style.paddingLeft='1%';"); | |
Rez->AddStrLn(" newDiv.id=iId;"); | |
Rez->AddStr (" newDiv.innerHTML=iTex;"); | |
Rez->AddStrLn(" if (document.getElementById('cha')!=null){"); | |
Rez->AddStrLn(" var cha=document.getElementById('cha');"); | |
Rez->AddStrLn(" var i = 0 ; var ex=false ; "); | |
Rez->AddStrLn(" while ((i<cha.children.length)&&(ex==false)) { "); | |
Rez->AddStrLn(" if (cha.children[i].getAttribute('id')>iId) "); | |
Rez->AddStrLn(" {ex=true;cha.insertBefore(newDiv,cha.children[i]);}else"); | |
Rez->AddStrLn(" if (cha.children[i].getAttribute('id')==iId){ ex=true;"); | |
Rez->AddStrLn(" if (cha.children[iS].innerHTML!=iTex) "); | |
Rez->AddStrLn(" cha.children[i].innerHTML=iTex; "); | |
Rez->AddStrLn(" } i++;} "); | |
Rez->AddStrLn(" if (ex==false) cha.appendChild(newDiv); "); | |
Rez->AddStrLn("} } } "); | |
} | |
void JS_GetData(TStr*R){ | |
R->A(" function GetData() { "); | |
// Заголовок ================================================== | |
R->A(" DataSend='VER='+convertToHex('01')+';'; "); | |
R->A(" var nam=document.getElementById('nam'); "); | |
// Пакетная передача ================================================== | |
R->A(" if (AcaAca!=''){ "); | |
R->A(" DataSend=DataSend+'AcaAca='+convertToHex(AcaAca)+';' "); | |
R->A(" AcaAca=''; "); | |
R->A(" } "); | |
R->A(" if (ChaCha!=''){ "); | |
R->A(" DataSend=DataSend+'ChaCha='+convertToHex(ChaCha)+';' "); | |
R->A(" ChaCha=''; "); | |
R->A(" } "); | |
R->A(" if (RegReg!=''){ "); | |
R->A(" DataSend=DataSend+'RegReg='+convertToHex(RegReg)+';' "); | |
R->A(" RegReg=''; "); | |
R->A(" } "); | |
R->A(" if (EntEnt!=''){ "); | |
R->A(" DataSend=DataSend+'EntEnt='+convertToHex(EntEnt)+';' "); | |
R->A(" EntEnt=''; "); | |
R->A(" } "); | |
R->A("}"); | |
} | |
void JS_add_script(TStr*Rez){ | |
// Код обмена данными клиент сервер | |
// Отправляет запрос DataSend серверу | |
// И Выполняет полученый JavaScript | |
Rez->AddStrLn("function add_script() { "); | |
Rez->AddStrLn("var newScript = document.createElement('script');"); | |
Rez->AddStrLn("newScript.type = 'text/javascript';"); | |
Rez->AddStrLn("newScript.language = 'javascript';"); | |
Rez->AddStrLn("GetData();"); | |
Rez->AddStrLn("UR='http://192.168.0.107:8080/script.js?DataSend='+convertToHex(DataSend); "); | |
Rez->AddStrLn("newScript.src=UR;"); | |
Rez->AddStrLn("document.getElementsByTagName('head')[0].appendChild(newScript);"); | |
Rez->AddStrLn("document.getElementsByTagName('head')[0].removeChild(newScript);"); | |
Rez->AddStrLn("}"); | |
} | |
void JS_InitEvent(TStr*R){ | |
R->A(" if (document.getElementById('aca')!=null){ "); | |
R->A(" document.getElementById('aca').onkeypress=function() { "); | |
R->A(" AcaAca=AcaAca+'nam='+convertToHex(document.getElementById('nam').value)+';'; "); | |
R->A(" Add_script(); "); | |
R->A(" } "); | |
R->A(" } "); | |
R->A(" if (document.getElementById('cha')!=null){ "); | |
R->A(" document.getElementById('cha').onclick=function(){ "); | |
R->A(" ChaCha=ChaCha+'Mes='+convertToHex(document.getElementById('Mes').value)+';'; "); | |
R->A(" document.getElementById('Mes').value=''; "); | |
R->A(" Add_script(); "); | |
R->A(" } "); | |
R->A(" } "); | |
R->A(" if (document.getElementById('reg')!=null){ "); | |
R->A(" document.getElementById('reg').onclick=function() { "); | |
R->A(" RegReg=RegReg+'log='+convertToHex(document.getElementById('log').value)+';'; "); | |
R->A(" RegReg=RegReg+'pas='+convertToHex(document.getElementById('pas').value)+';'; "); | |
R->A(" RegReg=RegReg+'cap='+convertToHex(document.getElementById('cap').value)+';'; "); | |
R->A(" add_script(); "); | |
R->A(" } "); | |
R->A(" } "); | |
R->A(" if (document.getElementById('ent')!=null){ "); | |
R->A(" document.getElementById('ent').onclick=function() { "); | |
R->A(" EntEnt=EntEnt+'log='+convertToHex(document.getElementById('log').value)+';'; "); | |
R->A(" EntEnt=EntEnt+'pas='+convertToHex(document.getElementById('pas').value)+';'; "); | |
R->A(" add_script(); "); | |
R->A(" } "); | |
R->A(" } "); | |
} | |
void AddMesInChat(TStr*Rez,int iId,TStr*iTex){ | |
Rez->AddStr("AddMesInChat('"); | |
Rez->AddStr("cha"); | |
TStr*s=new TStr(); | |
s->SetNom(iId); | |
s->AddNol(9); | |
Rez->AddStr(s); | |
delete s; | |
Rez->AddStr("','"); | |
Rez->AddStr(iTex); | |
Rez->AddStrLn("');"); | |
} | |
void SiteJava(TStr*Rez,TPer*Per){ | |
// Скрипт находящийся на каждой странице | |
Rez->AddLn(); | |
Rez->AddStrLn("<script type='application/javascript'>"); | |
Rez->AddStrLn("var DataSend='';");// ОТправляемая строка | |
Rez->AddStrLn("var ChaCha='' ;");// Отправка сообщения | |
Rez->AddStrLn("var AcaAca='' ;");// Личные данные | |
Rez->AddStrLn("var RegReg='' ;");// Форма регистрации | |
Rez->AddStrLn("var EntEnt='' ;");// Форма входа | |
Rez->AddStrLn("var NomLog='' ;");// Форма входа | |
JS_convertFromHex(Rez); | |
JS_convertToHex(Rez); | |
JS_AddMesInChat(Rez); | |
JS_GetData(Rez); | |
JS_add_script(Rez); | |
JS_InitEvent(Rez); | |
Rez->AddStrLn("setTimeout('add_script()',2000);"); | |
Rez->AddStrLn("</script>"); | |
} | |
void SiteVerh(TStr*Rez,TPer*Per){ // Верх сайта | |
Rez->AddStrLn("<html><head></head><body><center>"); | |
// Основной DIV блок сайта background-color: #136F74; | |
Rez->AddStrLn("<div style='width:80%;height:75%;background-color: Yellow;'>"); | |
} | |
void SiteNizz(TStr*Rez,TPer*Per){ // Низ сайта | |
Rez->AddStrLn("</div>");// Конец Основного DIV блока | |
SiteJava(Rez,Per); | |
Rez->AddStrLn("</center></body></html>"); | |
} | |
void SiteMenu(TStr*R,TPer*Per){ // Меню сайта color: #fff; | |
R->A("<hr>"); | |
if (Per->NLO==0) R->A("<a href='enter.html' style='text-decoration:none;' id='AEnt' >Вход</a> "); | |
if (Per->NLO==0) R->A("<a href='registration.html' style='text-decoration:none;' id='AReg'>Регистрация</a> "); | |
R->A("<a href='index.html' style='text-decoration:none;'>Настройки</a> "); | |
R->A("<a href='chat.html' style='text-decoration:none;'>Чат</a>"); | |
R->A("<hr>"); | |
} | |
void SiteMain(TStr*Rez,TPer*Per){ //Описывает главную страницу сайта | |
SiteVerh(Rez,Per);// Верх сайта | |
SiteMenu(Rez,Per);// Меню сайта | |
Rez->AddStrLn("<div style='width:100%;height:100%;background-color: red;'>"); | |
Rez->AddStrLn("<center><br>"); | |
Rez->AddStrLn("Отображаемое Имя<br>"); | |
Rez->AddStrLn("<input type='text' id='nam' value='' ><br>"); | |
Rez->AddStrLn("Логин<br>"); | |
Rez->AddStrLn("<input type='text' id=='log' value='' ><br>"); | |
Rez->AddStrLn("Пароль<br>"); | |
Rez->AddStrLn("<input type='password' id=='pas' value='' ><br>"); | |
Rez->AddStrLn("</center>"); | |
Rez->AddStrLn("</div>"); | |
SiteNizz(Rez,Per);// Низ сайта | |
}; | |
void SiteEntr(TStr*Rez,TPer*Per){ //Описывает страницу входа на сайт | |
SiteVerh(Rez,Per);// Верх сайта | |
SiteMenu(Rez,Per);// Меню сайта | |
Rez->AddStrLn("<div style='width:100%;height:100%;background-color: red;'>"); | |
Rez->AddStrLn("<div id='DivEnt'>"); | |
if (Per->NLO==0) { | |
Rez->AddStrLn("<center><br>"); | |
Rez->AddStrLn("Логин<br>"); | |
Rez->AddStrLn("<input type='text' id='log' value='' ><br>"); | |
Rez->AddStrLn("Пароль<br>"); | |
Rez->AddStrLn("<input type='password' id='pas' value='' ><br><br>"); | |
Rez->AddStrLn("<input type='button' id='ent' value='Вход.' ><br>"); | |
Rez->AddStrLn("</center>"); | |
} else { | |
Rez->AddStrLn("<br><br><br>Добро пожаловать !"); | |
} | |
Rez->AddStrLn("</div>"); | |
Rez->AddStrLn("</div>"); | |
SiteNizz(Rez,Per);// Низ сайта | |
}; | |
void SiteRegi(TStr*Rez,TPer*Per){ //Описывает страницу регистрации | |
SiteVerh(Rez,Per);// Верх сайта | |
SiteMenu(Rez,Per);// Меню сайта | |
Rez->AddStrLn("<div style='width:100%;height:100%;background-color: red;'>"); | |
Rez->AddStrLn("<div id ='DivReg'>"); | |
if (Per->NLO==0) { | |
Rez->AddStrLn("Логин<br>"); | |
Rez->AddStrLn("<input type='text' id='log' name= 'log' value='' ><br>"); | |
Rez->AddStrLn("Пароль<br>"); | |
Rez->AddStrLn("<input type='password' id='pas' name= 'pas' value='' ><br>"); | |
Rez->AddStrLn("Повторите Пароль<br>"); | |
Rez->AddStrLn("<input type='password' id='pas2' value='' ><br><br>"); | |
Rez->AddStrLn("<img src='captcha.bmp'><br><br>"); | |
Rez->AddStrLn("ПРоверочный код<br>"); | |
Rez->AddStrLn("<input type='text' id='cap' name='cap' value='' ><br><br>"); | |
Rez->AddStrLn("<input type='button' id='reg' name='reg' value='Зарегестрироватся.' ><br><br>"); | |
} else | |
{ | |
Rez->AddStrLn("<br><br><br>Вы зарегестрированы !"); | |
} | |
Rez->AddStrLn("</div>"); | |
Rez->AddStrLn("</div>"); | |
SiteNizz(Rez,Per);// Низ сайта | |
}; | |
void SiteChat(TStr*Rez,TPer*Per){ //Описывает страницу с чатом | |
SiteVerh(Rez,Per);// Верх сайта | |
SiteMenu(Rez,Per);// Меню сайта | |
Rez->AddStrLn("<div style='width:100%;height:100%;outline: 1px solid orange;background-color: silver;'> "); | |
Rez->AddStrLn("<div style='width:100%;height:100%;overflow: scroll;' id='cha' align=left ></div>"); | |
Rez->AddStrLn("<div style='width:100%;'>"); | |
Rez->AddStrLn("<input style='display:block;float:left;width:70%;' type='text' name='ChaMes' id='ChaMes'>"); | |
Rez->AddStrLn("<input style='display:block;width:30%;' type='submit' name='sub' id='sub'>"); | |
Rez->AddStrLn("</div>"); | |
Rez->AddStrLn("</div>"); | |
Rez->AddStrLn("</div>"); | |
SiteNizz(Rez,Per);// Низ сайта | |
}; | |
void OtvetJav(TStr*Rez,TPer*iPer,int iNomZap){ // Ответ сервера скрипт | |
TStr *ChaCha = new TStr();// чат | |
TStr *AcaAca = new TStr();// настройки | |
TStr *RegReg = new TStr();// регистрация | |
TStr *EntEnt = new TStr();// вход | |
iPer->GetZna(ChaCha ,"ChaCha");// Странийа чата | |
iPer->GetZna(EntEnt ,"EntEnt");// Страница входа | |
iPer->GetZna(RegReg ,"RegReg");// Страница регистрации | |
iPer->GetZna(AcaAca ,"AcaAca");// Страница настроек | |
if (ChaCha->Len!=0) { //============================================= | |
TStr*SSS=new TStr() ; | |
TMes*Mes=new TMes() ;// Создаю макет сообщения | |
Mes->Cre() ;// Создаю все нужные поля | |
TPer*Per=new TPer() ;// Читаю данные с ChaCha | |
Per->PST(ChaCha) ; | |
Mes->Data=time(NULL) ;// указываю время события | |
Cop(Mes->Log1,iPer->LOG) ;// Указываю свой логин | |
Cop(Mes->Log2,"") ;// Указываю ЛОгин получателя сообщения | |
Per->GetZna(SSS,"Mes"); | |
SSS->HexToBin() ; | |
Cop(Mes->Text,SSS) ;// Указываю текст события | |
Cha->Add(Mes,iNomZap) ;// Добавляю событие | |
iPer->SetZna("ChaCha",""); | |
delete Mes ; | |
TCha *Otv ; | |
Otv=Cha->Get(iPer,3) ; // достаю последни 3 сообещния в чате | |
PrintCha(Otv) ; // | |
for (int f=1;f<=Otv->Kol;f++) | |
AddMesInChat(Rez,Otv->Mess[f]->Id,Otv->Mess[f]->Text); | |
delete Otv ; | |
delete Per ; | |
delete SSS ; | |
} //==================================================== | |
if (RegReg->Len!=0) { //============================================= | |
TPer*Per=new TPer() ; // Читаю данные с RegReg | |
TStr*PAS=new TStr() ; // СОздаю временую строку | |
TStr*LOG=new TStr() ; // СОздаю временую строку | |
RegReg->HexToBin() ; | |
Per->PST(RegReg) ; | |
Per->HexToStr() ; | |
Per->GetZna(LOG,"log") ; | |
Per->GetZna(PAS,"pas") ; | |
int n=Logs.Fin(LOG) ; | |
if (n==0) { // Если такого логина не существует | |
n=Logs.Add(LOG,PAS,iNomZap); | |
iPer->NLO=n ; | |
Rez->A(" document.getElementById('DivReg').innerHTML='<br><br><br>Вы зарегестрированы !'; "); | |
Rez->A(" document.getElementById('AEnt').remove(); "); | |
Rez->A(" document.getElementById('AReg').remove(); "); | |
} | |
iPer->SetZna("RegReg",""); | |
delete Per ; | |
delete LOG ; | |
delete PAS ; | |
}//=================================================================== | |
if (EntEnt->Len!=0) { //============================================= | |
TPer*Per=new TPer() ; // Читаю данные с RegReg | |
TStr*PAS=new TStr() ; // СОздаю временую строку | |
TStr*LOG=new TStr() ; // СОздаю временую строку | |
EntEnt->HexToBin() ; | |
Per->PST(EntEnt) ; | |
Per->HexToStr() ; | |
Per->GetZna(LOG,"log") ; | |
Per->GetZna(PAS,"pas") ; | |
int n=Logs.Fin(LOG) ; | |
if (n!=0) { // Если такого логина не существует | |
iPer->NLO=n ; | |
Rez->A(" document.getElementById('DivEnt').innerHTML='<br><br><br>Добро пожаловать !'; "); | |
Rez->A(" document.getElementById('AEnt').remove(); "); | |
Rez->A(" document.getElementById('AReg').remove(); "); | |
} | |
iPer->SetZna("EntEnt",""); | |
delete Per ; | |
delete LOG ; | |
delete PAS ; | |
}//=================================================================== | |
Rez->AddStrLn("if (document.getElementById('nam')!=null)"); | |
Rez->AddStr("document.getElementById('nam').value='"); | |
TStr*Nam=new TStr(); | |
iPer->GetZna(Nam,"nam"); | |
Nam->HexToBin(); | |
Rez->AddStr(Nam); | |
delete Nam; | |
Rez->AddStrLn("';"); | |
Rez->AddStrLn("if (document.getElementById('cha')!=null){"); | |
Rez->AddStrLn("cha.scrollTop = 9999;}"); | |
Rez->AddStrLn("setTimeout('add_script()',3000);"); | |
delete ChaCha; | |
delete EntEnt; | |
delete RegReg; | |
delete AcaAca; | |
}; | |
void OtvetCap(TStr*Rez,TPer*Per){ | |
TTe*TTT = new TTe("test.bmp",100,25); | |
TCOL COL;COL.SetCol(0,0,0,0,0); | |
TCOO COO;COO.SetCoo(3,3); | |
TStr*Cap = new TStr(); | |
Cap->Gen(5); | |
Per->SetZna("Cap",Cap); | |
TTT->Text("TIMUR",COO,(float)0.15,COL); | |
TStr*T; | |
T=TTT->BmpAsStr(); | |
Rez->AddStr(T); | |
delete Cap; | |
delete T; | |
delete TTT; | |
} | |
#pragma endregion | |
#pragma region ----- Структура описывающая Запрос . | |
class TZapros { | |
public: | |
bool Rab = false;// Состояние запроса | |
HANDLE Han ; // указатель на запрос | |
SOCKET Soc = INVALID_SOCKET;// Чёкит запроса | |
int Run(int iNomZap) { | |
TPer *Per= new TPer();// Переменные | |
TStr *Zap= new TStr();// Строка запроса | |
TStr *Otv= new TStr();// СТрока ответа | |
TStr *Htm= new TStr();// содержимое ответа | |
// Читаем входные данные ====================== | |
Zap->Len = recv(Soc,Zap->Byte,MaxLenStr,0); | |
Zap->Byte[Zap->Len]=0; | |
//============================================= PAR | |
Per->PZA(Zap); | |
//============================================= SES | |
int n=Sess.Con(Per,iNomZap);Per->NSE=n; | |
if (n!=0){ // если удалось соз или найти сесию | |
if (Rav(Per->PUT,"captcha.bmp" )) OtvetCap(Htm,&Sess.Ses[n]);else // Выводит Кпчу | |
if (Rav(Per->PUT,"script.js" )) OtvetJav(Htm,&Sess.Ses[n],iNomZap);else // Возвр скрипт исполняемый в браузкрк | |
if (Rav(Per->PUT,"enter.html" )) SiteEntr(Htm,&Sess.Ses[n]);else // Возвр скрипт исполняемый в браузкрк | |
if (Rav(Per->PUT,"registration.html")) SiteRegi(Htm,&Sess.Ses[n]);else // Возвр скрипт исполняемый в браузкрк | |
if (Rav(Per->PUT,"chat.html" )) SiteChat(Htm,&Sess.Ses[n]);else // Возвращаем страницу чата | |
if (Rav(Per->PUT,"index.html" )) SiteMain(Htm,&Sess.Ses[n]);else // Главная страница пользователя | |
SiteMain(Htm,&Sess.Ses[n]); // Главная страница пользователя | |
} else Htm->SetZna("<html>The server is temporarily unavailable</html>"); | |
//============================================= | |
if (Rav(Per->RAS,"html")) { | |
Otv->AddStrLn("HTTP/1.1 200 OK"); | |
// Язык ответа сервера русский | |
Otv->AddStrLn("Content-Language: ru"); | |
// Формат ответа HTML | |
Otv->AddStrLn("Content-Type: text/html"); | |
// Если сесия не назанчена то устанавливает | |
if (Per->SES->Len!=0){Otv->AddStr("Set-Cookie: SES=");Otv->AddStrLn(Per->SES);} | |
// Длина контента | |
Otv->AddStr("Content-Length: "); | |
Otv->AddNom(Htm->Len + 4);Otv->AddLn(); | |
// Конец заголовка | |
Otv->AddStr("Connection: close"); | |
Otv->AddLn();Otv->AddLn(); | |
Otv->AddStr(Htm); | |
Otv->AddLn();Otv->AddLn(); | |
} | |
if (Rav(Per->RAS,"js" )) { | |
Otv->AddStrLn("HTTP/1.1 200 OK"); | |
// Язык ответа сервера русский | |
Otv->AddStrLn("Content-Language: ru"); | |
// Формат ответа HTML | |
Otv->AddStrLn("Content-Type: text/html"); | |
// Если сесия не назанчена то устанавливает | |
if (Per->SES->Len!=0) {Otv->AddStr("Set-Cookie: SES=");Otv->AddStrLn(Per->SES);} | |
// Длина контента | |
Otv->AddStr("Content-Length: "); | |
Otv->AddNom(Htm->Len + 4);Otv->AddLn(); | |
// Конец заголовка | |
Otv->AddStr("Connection: close"); | |
Otv->AddLn();Otv->AddLn(); | |
Otv->AddStr(Htm); | |
Otv->AddLn();Otv->AddLn(); | |
} | |
if (Rav(Per->RAS,"bmp" )) { | |
Otv->AddStrLn("HTTP/1.1 200 OK"); | |
Otv->AddStrLn("Content-type: image/bmp"); | |
Otv->AddLn(); | |
Otv->AddStr(Htm); | |
} | |
// Отдаем данные ======================= | |
int Otp = send(Soc,Otv->Byte,MaxLenStr,0); | |
delete Per; | |
delete Zap; | |
delete Otv; | |
delete Htm; | |
closesocket(Soc);// Закрываю соеденение | |
printf("%d\n\r",KolStr); | |
Rab = false;// Указыват что может принимать новый запрос | |
return 0; | |
} | |
}; | |
#pragma endregion | |
#pragma region ----- Структура описывающая Запросы . | |
DWORD WINAPI RunZapros(LPVOID lpParam); | |
const int MaxKolZap=16; | |
class TZapross{ | |
public: | |
TZapros Zapross[MaxKolZap];// Список запросов | |
void StartZapros(SOCKET ClientSocket){ | |
int f = 1; | |
while (( f < MaxKolZap) && ( Zapross[f].Rab)) f++; | |
if (( f < MaxKolZap) && (!Zapross[f].Rab)) { | |
Zapross[f].Rab=true; | |
Zapross[f].Soc = ClientSocket; | |
Zapross[f].Han = CreateThread( | |
NULL, // Атрибуты безопасности по умолчанию | |
0, // Размер стека используется по умолчанию | |
RunZapros, // Функция потока | |
(LPVOID)f, // Аргумент функции потока | |
0, // Флажки создания используются по умолчанию | |
NULL); // Возвращает идентификатор потока | |
SetThreadPriority(Zapross[f].Han, THREAD_PRIORITY_LOWEST); | |
} | |
} | |
}; | |
TZapross Zapross;// Структура хранящая все запросы | |
DWORD WINAPI RunZapros(LPVOID lpParam) | |
{ // Запускзапроса на обработку | |
Zapross.Zapross[(int)lpParam].Run((int)lpParam); | |
return 0; | |
} | |
#pragma endregion | |
DWORD WINAPI RunDispath(LPVOID lpParam) | |
{ // Межпоточный обмен данными | |
while (true) { Sleep(100); | |
for(int NZ=1;NZ<MaxKolZap;NZ++){ | |
if (NewSes[NZ]==-1) { | |
int Rez=0;int f=1; // ищим место | |
for (f=1;((f<MaxKolSes)&&(Sess.Ses[f].SES->Len!=0));f++); | |
if ((f>0) && (f<MaxKolSes)) Rez=f; else Rez=0;// Если места нет 0 | |
NewSes[NZ]=Rez; | |
} | |
if (NewMes[NZ]==-1){ | |
int f=1;int RDA=(int)time(0);int Rez=0; | |
while ((f<MaxKolMes)&&(Cha->Mess[f]->Data!=0)){ // Ищим самое древнее сообщение что бы его перезаписать | |
if (Cha->Mess[f]->Data<RDA){ // если дата сообщения более ранняя | |
RDA=(int)Cha->Mess[f]->Data; | |
Rez=f;} | |
f++;} | |
if (Rez>=MaxKolMes) Rez=0; | |
NewMes[NZ]=Rez; | |
} | |
if (NewLog[NZ]==-1){ | |
int Rez=0;int f=1; // ищим место | |
for (f=1;((f<MaxKolLog)&&(Logs.Logs[f].LOG->Len!=0));f++); | |
if ((f>0) && (f<MaxKolLog)) Rez=f; else Rez=0;// Если места нет 0 | |
NewLog[NZ]=Rez; | |
} | |
}} | |
return 0; | |
} | |
DWORD WINAPI RunServer(LPVOID lpParam) | |
{ /* Работа сервера */ | |
WSADATA wsaData; | |
int iResult; | |
SOCKET ListenSocket = INVALID_SOCKET; | |
SOCKET ClientSocket = INVALID_SOCKET; | |
struct addrinfo *result = NULL; | |
struct addrinfo hints; | |
// Initialize Winsock | |
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); | |
if (iResult != 0) { printf("WSAStartup failed with error: %d\n", iResult); return 1; } | |
ZeroMemory(&hints, sizeof(hints)); | |
hints.ai_family = AF_INET; | |
hints.ai_socktype = SOCK_STREAM; | |
hints.ai_protocol = IPPROTO_TCP; | |
hints.ai_flags = AI_PASSIVE; | |
// Resolve the server address and port | |
iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result); | |
if (iResult != 0) { printf("getaddrinfo failed with error: %d\n", iResult); WSACleanup(); return 1; } | |
// Create a SOCKET for connecting to server | |
ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol); | |
if (ListenSocket == INVALID_SOCKET) { | |
printf("socket failed with error: %ld\n", WSAGetLastError()); | |
freeaddrinfo(result); WSACleanup(); return 1; | |
} | |
// Setup the TCP listening socket | |
iResult = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen); | |
if (iResult == SOCKET_ERROR) { | |
printf("bind failed with error: %d\n", WSAGetLastError()); | |
freeaddrinfo(result); | |
closesocket(ListenSocket); | |
WSACleanup(); | |
return 1; | |
} | |
freeaddrinfo(result); | |
iResult = listen(ListenSocket, SOMAXCONN); | |
if (iResult == SOCKET_ERROR) { | |
printf("listen failed with error: %d\n", WSAGetLastError()); | |
closesocket(ListenSocket); | |
WSACleanup(); | |
return 1; | |
} | |
for (int f = 1; f < MaxKolZap; f++) | |
Zapross.Zapross[f].Rab = false; | |
do { | |
Sleep(100); | |
// Accept a client socket | |
ClientSocket = accept(ListenSocket, NULL, NULL); | |
if (ClientSocket == INVALID_SOCKET) closesocket(ClientSocket); | |
else Zapross.StartZapros(ClientSocket); | |
//for (int f = 1; f < MaxKolZapross; f++) | |
//if (!Zapross->Zapross[f].Rab) StartZapros(f, ClientSocket); | |
} while (true); | |
closesocket(ClientSocket); | |
WSACleanup(); | |
return 0; | |
} | |
int StartServer() | |
{ // Процедура запуска сервера | |
HANDLE Dispath;// указатель на сервер | |
Dispath = CreateThread( | |
NULL, // атрибуты безопасности по умолчанию | |
0, // размер стека используется по умолчанию | |
RunDispath, // функция потока | |
NULL, // аргумент функции потока | |
0, // флажки создания используются по умолчанию | |
NULL); // возвращает идентификатор потока | |
SetThreadPriority(Dispath, THREAD_PRIORITY_LOWEST); | |
HANDLE Server;// указатель на сервер | |
Server = CreateThread( | |
NULL, // атрибуты безопасности по умолчанию | |
0, // размер стека используется по умолчанию | |
RunServer, // функция потока | |
NULL, // аргумент функции потока | |
0, // флажки создания используются по умолчанию | |
NULL); // возвращает идентификатор потока | |
SetThreadPriority(Server, THREAD_PRIORITY_LOWEST); | |
return 0; | |
} | |
int main() | |
{ | |
printf("Start Server \n"); | |
StartServer(); | |
_getch();// тут типа ожидания нажатия любой кнопки | |
printf("Stop Server \n"); | |
return 0; | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment