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

#define pthread_join WaitForSingleObject

#endif

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

FILE *fl;

int alllog=0;

class TD{

public:

char Data[60];

char Nick[20];

};

int Count=-0;

TD Chat[20];

char d[20];

TD Data;

int s;

void Event(int sig){

strcpy(Data.Nick,d);

strcpy(Data.Data,"#disconnect");

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

if(alllog) fclose(fl);

signal(sig,SIG_DFL);

raise(sig);

}

DWORD WINAPI InputThread(void *p){

while(1){

TD data;

int *c=(int*)p;

int Socket=c[0];

clrscr();

gotoxy(1,2);

for(int i=Count-1;i>=0;i--){

if (i<Count)printf("%s:%s\n",Chat[i].Nick,Chat[i].Data);

}

strcpy(data.Nick,d);

scanf("%s",data.Data);

int rec=send(Socket,(char*)&data,sizeof(data),0);

if(rec==-1){

printf("Немогу передать данные",Socket);

int l=1;

if(alllog) fclose(fl);

pthread_exit(l);

}

}

}

DWORD WINAPI OutputThread(void *p){

TD data;

int Count=-0;

TD Chat[20];

while(1){

gotoxy(1,1);

int *c=(int*)p;

int Socket=c[0];

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

Count++;

if (Count>20){

for(int i=0;i<19;i++) Chat[i]=Chat[i+1];

Count=20;

}

Chat[Count-1]=data;

if (rec==-1){

printf("Немогу принять данные от %d",Socket);

int l=1;

if(alllog) fclose(fl);

pthread_exit(l);

}

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

gotoxy(1,2);

for(int i=Count-1;i>=0;i--){

printf("%s:%s\n",Chat[i].Nick,Chat[i].Data);

}

}

}

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

{

clrscr();

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

if (alllog){

time_t myclock;

myclock=time(NULL);

char fn[255];

strcpy(fn,"ChatClient ");

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);

}

gotoxy(1,1);

pthread_mutex_t cs,cond;

pthread_mutex_init(&cs);

pthread_mutex_init(&cond);

char addr[16];

TD Data;

pthread_t Thread1,Thread2;

cout<< "Введите адресс сервера: ";

cin>>addr;

cout<< "Введите ваш ник: ";

cin>>d;

strcpy(Data.Nick,d);

socklen_t sz;

struct sockaddr_in ssa;

struct sockaddr *sp;

struct in_addr sip;

sp=(struct sockaddr *)&ssa;

sz=sizeof(ssa);

s=socket(AF_INET, SOCK_STREAM, 0);

if(s == -1){

perror("Создание сокета невозможно");

if(alllog) fclose(fl);

return 1;

}

char data[128];

ssa.sin_family = AF_INET;

ssa.sin_port=htons(1234);

ssa.sin_addr.s_addr=inet_addr(addr);

if(ssa.sin_addr.s_addr == INADDR_NONE){

printf("ip адресс неверен\n");

if(alllog) fclose(fl);

return 1;

}

if(connect(s, sp, sz) == -1){

perror("Не удалось установить соеденение");

if(alllog) fclose(fl);

return 1;

}

signal(SIGINT,*Event);

sigset(SIGTERM,*Event);

sigset(SIGABRT,*Event);

sigset(SIGILL,*Event);

sigset(SIGFPE,*Event);

strcpy(Data.Data,"#connect");

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

if (sed==-1){

printf("Немогу передать данные");

return 1;

}

clrscr();

DWORD ID1,ID2;

Thread1=pthread_create(NULL, 0, &InputThread, &s,0,&ID1) ;

Thread2=pthread_create(NULL, 0, &OutputThread, &s,0,&ID2) ;

pthread_join(Thread1,INFINITE);

pthread_join(Thread2,INFINITE);

if(alllog){

fclose(fl);

};

return EXIT_SUCCESS;

}

//---------------------------------------------------------------------------