Echo Сервер. Программа для отправки файлов, страница 2

#define socklen_t int

#define sigset signal

#define pthread_create CreateThread

#endif

//--------------------------------------------------------------------------#pragma argsused

TClientList *CL;

pthread_mutex_t cs;

pthread_t Thread;

int s, c;

int maxconnection=30;

int alllog=0;

FILE *fl;

time_t myclock;

class TD{

public:

char Data[60];

char Nick[20];

};

void Event(int sig){

myclock=time(NULL);

fprintf(fl,"%s Сервер завершил работу по сигналу %d\n",ctime(&myclock),sig);

fclose(fl);

closesocket(s);

signal(sig,SIG_DFL);

raise(sig);

}

DWORD WINAPI Send(void *p){

int *c=(int *)p;

TD Data;

int Socket=c[0];

int ex=0;

while(!ex){

int rec=recv(Socket,(char*)&Data,sizeof(Data),0);

if (rec==-1){

myclock=time(NULL);

fprintf(fl,"%s Немогу принять данные от %d\n",ctime(&myclock),Socket);

int l=1;

pthread_exit(l);

}

myclock=time(NULL);

if (Data.Data[0]=='#'){

if(strcmp(Data.Data,"#connect")==0){

pthread_mutex_lock(&cs);

int ret=CL->Append(Socket);

if (ret){

if (ret==-1){

myclock=time(NULL);

fprintf(fl,"%s Лимит пользователей исчерпан\n",ctime(&myclock));

pthread_mutex_unlock(&cs);

int l=2;

pthread_exit(l);

}

if (ret==-2){

myclock=time(NULL);

fprintf(fl,"%s Попытка DoS атаки от пользователя %s\n",ctime(&myclock),Data.Nick);

pthread_mutex_unlock(&cs);

int l=2;

pthread_exit(l);

}

}

if(!alllog) fprintf(fl,"%s %s:%s\n",ctime(&myclock),Data.Nick,Data.Data);

pthread_mutex_unlock(&cs);

}

if(strcmp(Data.Data,"#disconnect")==0){

pthread_mutex_lock(&cs);

if (CL->Delete(Socket)){

myclock=time(NULL);

fprintf(fl,"%s Ошибка удаления\n",ctime(&myclock));

pthread_mutex_unlock(&cs);

int l=3;

pthread_exit(l);

}           

if(!alllog)fprintf(fl,"%s %s:%s\n",ctime(&myclock),Data.Nick,Data.Data);

pthread_mutex_unlock(&cs);

int l=0;

ex=1;

}        

}

pthread_mutex_lock(&cs);

int j=CL->Count();

if(alllog) fprintf(fl,"%s %s:%s\n",ctime(&myclock),Data.Nick,Data.Data);

int Sc;

for(int i=0;i<j;i++){

Sc=CL->Get(i);

int sed=send(Sc,(char *)&Data,sizeof(Data),0);

if (sed==-1){

myclock=time(NULL);

fprintf(fl,"%s Немогу передать данные от %d\n",ctime(&myclock),Sc);

!CL->Delete(Sc);

}

}

pthread_mutex_unlock(&cs);        

}

}

int main(int argc,char* argv[]){

clrscr();

if ((argc>1)&&(strcmp(argv[1],"-alllog")==0)) alllog=1;

if ((argc>2)&&(strcmp(argv[1],"-max")==0)) maxconnection=atoi(argv[2]);

if ((argc>3)&&(strcmp(argv[3],"-alllog")==0)) alllog=1;

myclock=time(NULL);

char fn[255];

strcpy(fn,"ChatServer");

/*   strcat(fn,ctime(&myclock));

int k=0;

while (fn[k]!='\n'){

k++;

};

fn[k]=0;}*/

strcat(fn,".log");

fl=fopen(fn,"w+");

WSADATA wsd;

if (WSAStartup(MAKEWORD(2,2),&wsd)!=0){

fprintf(fl,"Невозможно загрузить WinSock!");

fclose(fl);

exit(1);

}

pthread_mutex_init(&cs);

CL=new TClientList(maxconnection);

socklen_t sz;

struct sockaddr_in ssa, csa;

struct sockaddr *sp, *cp;

time_t itime;

sp=(struct sockaddr *)&ssa;

cp=(struct sockaddr *)&csa;

sz=sizeof(ssa);

s=socket(PF_INET, SOCK_STREAM, 0);

if(s == -1){

myclock=time(NULL);

fprintf(fl,"%s Создание сокета невозможно\n",c);

fclose(fl);

exit(1);

}

signal(SIGINT,*Event);

sigset(SIGTERM,*Event);

sigset(SIGABRT,*Event);

sigset(SIGILL,*Event);

sigset(SIGFPE,*Event);

ssa.sin_family = PF_INET;

ssa.sin_port = htons(1234);