== 서버 == {{{ #include #include #include #include #include #include #include #include #define BUFF_SIZE 1024 int thread_num[25]; //스레드 번호 (해당 스레드 활성화시 번호 값 + 1, 비활성화시 0) //ex) thread_num[스레드 번호]==스레드 번호+1 int client_socket_array[25]; //클라이언트 소캣, 각 스레드 마다 자신의 번호에 해당하는 소캣 사용 //ex) 스레드가 사용 중인 소캣 == client_socket_array[스레드 번호] char id[100][256]; char password[100][256]; char id_state[100]; int id_num; char chat[100][BUFF_SIZE+5]; char chat_s[100], chat_e; void* rutine(void* data)//data = &thread_num[스레드 번호] { int t_num,i_num; int client_socket; char buff_rcv[BUFF_SIZE+5],buff_snd[BUFF_SIZE+5]; int rcv; int i,j; t_num=*((int*)data); //사용자가 이해하기 쉽도록 스레드 번호에 +1 값을 쓰도록 한다. client_socket=client_socket_array[t_num-1]; //코드의 간결화를 위해 값을 복사한다. recv(client_socket, buff_rcv,BUFF_SIZE,0); sprintf(buff_snd,"test\n"); send(client_socket, buff_snd, strlen(buff_snd)+1,0); printf("%dth client connected\n",t_num); //접속 검사 코드 //로그인 루프 recv(client_socket, buff_rcv,BUFF_SIZE,0); if(buff_rcv[0]=='n')//새 계정 생성 { printf("client try to make ID\n"); sprintf(buff_snd,"i\n"); send(client_socket, buff_snd, strlen(buff_snd)+1,0);//id 요구 recv(client_socket, buff_rcv,BUFF_SIZE,0); for(i=0;buff_rcv[i];i++) id[id_num][i]=buff_rcv[i]; printf("%dth client's name : %s\n",t_num,buff_rcv); sprintf(buff_snd,"p\n"); send(client_socket, buff_snd, strlen(buff_snd)+1,0);//password 요구 recv(client_socket, buff_rcv,BUFF_SIZE,0); printf("%dth client's password : %s\n",t_num,buff_rcv); for(i=0;buff_rcv[i];i++) password[id_num][i]=buff_rcv[i]; i_num=id_num; id_num++; printf("%dth client made new ID",t_num); sprintf(buff_snd,"a\n"); send(client_socket, buff_snd, strlen(buff_snd)+1,0);//접속 확인 } else { printf("client try to login\n"); while(1) { sprintf(buff_snd,"i\n"); send(client_socket, buff_snd, strlen(buff_snd)+1,0);//id 요구 recv(client_socket, buff_rcv,BUFF_SIZE,0); for(i=0;i0) { printf("received\n"); sprintf(buff_snd,"%dth client : %s",num,buff_rcv); chat_e++; chat_e%=100; for(i=0;i<20;i++) { if(thread_num[i]) send(client_socket_array[i],buff_snd,strlen(buff_snd)+1,0); } for(i=0;i #include #include #include #include #include #include #include #define BUFF_SIZE 1024 void gotoxy(int x,int y) { printf("\033[%d;%df",y,x); //터미널 출력 위치 변경 함수, y값이 화면 길이보다 크면 화면 길이로 처리된다.(버그의 원인) fflush(stdout); } int client_socket; int check; void* rcv_thread(void *data) { int i; char buff_rcv[BUFF_SIZE+5]; int rcv; while(1) { rcv=recv(client_socket, buff_rcv, BUFF_SIZE, 0); if(rcv>0) { while(check==1); check=2; for(i=0;i0) { printf("connecting succesed\n"); } else { printf("disconnected\n"); close(client_socket); return 0; } //로그인 시스템 printf("new in=n / login=l : "); scanf("%s\n",buff_snd); send(client_socket,buff_snd,strlen(buff_snd)+1,0); while(1) { if(recv(client_socket,buff_rcv,BUFF_SIZE,0)>0) { switch(buff_rcv[0]) { case 'i' : printf("ID : "); scanf("%s",buff_snd); send(client_socket,buff_snd,strlen(buff_snd)+1,0); break; case 'p' : printf("PASSWORD : "); scanf("%s",buff_snd); send(client_socket,buff_snd,strlen(buff_snd)+1,0); break; } if( buff_rcv == 'a' ) break; } else { printf("disconnected\n"); close(client_socket); return 0; } } memset(&p_thread[0],0,sizeof(p_thread[0])); pthread_create(&p_thread[0],NULL,rcv_thread,(void *)NULL); memset(&p_thread[1],0,sizeof(p_thread[1])); pthread_create(&p_thread[1],NULL,snd_thread,(void *)NULL); pthread_join(p_thread[0],(void**)&rcv); pthread_join(p_thread[1],(void**)&rcv); close(client_socket); return 0; } }}}