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