int main(int argc, char* argv[]){ //메인 함수 int sock; //소켓, 파일디스크립터 변수 선언 struct sockaddr_in serv_addr; //소켓 구조체 선언 pthread_t snd_thread, rcv_thread; //쓰레드 선언 void * thread_return; //쓰레드 리턴 선언 if(argc!=4){ //IP, 포트 입력 확인 printf("Usage : $s <IP> <port> <name>\n", argv[0]); exit(1); }
sprintf(name, "[%s]", argv[3]); //채팅자 이름 선언 sock=socket(PF_INET, SOCK_STREAM, 0); //소켓 함수 호출 if(sock == -1) //소켓 미생성 시 에러 출력 error_handling("socket() error"); memset(&serv_addr, 0, sizeof(serv_addr)); //소켓 정보 초기화 serv_addr.sin_family=AF_INET; //IP_v4 사용 serv_addr.sin_addr.s_addr=inet_addr(argv[1]); //서버 IP 입력 serv_addr.sin_port=htons(atoi(argv[2])); //포트 입력
pthread_create(&snd__thread, NULL, send_msg, (void*)&sock); //센드 메시지 쓰레드 생성 pthread_creadte(&rcv_thread, NULL, recv_msg, (void*)&sock); //리시브 메시지 쓰레드 생성 pthread_join(snd_thread, %thread_return); //쓰레드 센드 메시지 ID 생성 pthread_join(rcv_thread, %thread_return); //쓰레드 리시브 메시지 ID 생성 close(sock); //소켓 종료 return 0; }
void * send_msg(void * arg){ //센드 메시지 함수 int sock=*((int*)arg); //호출 받은 소켓 연결 char name_msg[NAME_SIZE+BUF_SIZE]; //메시지 배열 선언 while(1){ //메시지 입력 fgets(msg, BUF_SIZE, stdin); if(!strcmp(msg, "q\n")||!strcmp(msg,"Q\n")){ close(sock); exit(0); } sprintf(name_msg,"%s %s", name, msg); //메시지 배열에 입력 write(sock, name_msg, strlen(name_msg)); //메시지 소켓 출력 } return NULL; } void * recv_msg(void * arg){ //리시브 메시지 함수 int sock=*((int*)arg); //호출 받은 소켓 연결 char name_msg[NAME_SIZE+BUF_SIZE]; //메시지 배열 선언 int str_len; //메시지 길이 변수 선언 while(1){ str_len=read(sock, name_msg, NAME_SIZE+BUF_SIZE-1); //메시지 수신 if(str_len=-1) return (void*)-1; name_msg[str_len]=0; //배열 초기화 fputs(name_msg, stdout); //메시지 출력 } return NULL; } void error_handling(char *msg){ //에러핸들링 함수 fputs(msg, stderr); fputc('\n', stderr); exit(1); }