게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
멀티 쓰레드 기반 채팅 클라이언트 소스 코드
게시물ID : computer_9548짧은주소 복사하기
작성자 :
추천 : 0
조회수 : 1282회
댓글수 : 0개
등록시간 : 2011/06/26 18:00:26
#include <stdio.h> //헤더파일 선언
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <fcntl.h>
#include <pthread.h>
#define BUF_SIZE 100 //버프 사이즈 정의
#define NAME_SIZE 20 //이름 사이즈 정의

void * send_msg(void * arg); //센드 메시지 함수 선언
void * recv_msg(void * arg); //리시브 메시지 함수 선언
void error_handling(char * msg); //에러핸들링 함수 선언

char name[NAME_SIZE]="[DEFAULT]"; //채팅자 이름 배열 선언
char msg[BUF_SIZE]; //메시지 배열 선언

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])); //포트 입력

if(connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr))==-1) //서버 연결 요청
error_handling("connect() error!");
else
puts("connected............\n");

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);
}
꼬릿말 보기
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호