#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);
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.