inet_ntoa함수 관련 질문있습니다.. 이해가 안가네요 ㅠ
글쓴이: daimon123 / 작성시간: 토, 2014/12/06 - 12:02오전
쓰레드를 이용한 채팅 서버 소스중 일부입니다.
int main(int argc,char **argv) { int listensock,connsock; struct sockaddr_in server; struct sockaddr_in s_client; int len; int i; int res; if(argc != 2) { printf("%s 의 포트 넘버를 입력해 주세요.. \n",argv[0]); exit(1); } if(pthread_mutex_init(&mutex,NULL) != 0)//뮤텍스 초기화 함수,실패시 0 이외의 값을 반환 { printf("뮤텍스 초기화 실패 \n"); return -1; } listensock = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP); memset(&server,0,sizeof(server));//server주소 정보를 담고있는 구조체 정보 0으로 초기화 server.sin_addr.s_addr = htonl(INADDR_ANY); server.sin_port = htons(atoi(argv[1])); server.sin_family = AF_INET; if(bind(listensock,(struct sockaddr *)&server,sizeof(server)) == -1) //bind,실패일경우 { printf("bind()할수 없습니다.. \n"); return -1; } if(listen(listensock,MAX_CLIENT) == -1)//대기용 소켓(listensock)으로 클라이언트 connect요청을 기다린다,대기큐 사이즈 = MAX_CLIENT(5) { printf("listen 실패.. \n"); return -1; } printf("Listen....\n"); for(i = 0; i < MAX_CLIENT;i++) { list_c[i] = INVALID_SOCK; } while(1) { int n=0; len = sizeof(s_client); connsock = accept(listensock,(struct sockaddr *)&s_client,&len); char *str; char ipaddr[64]; str = inet_ntoa(s_client.sin_addr); printf("%s 의 클라이언트가 접속.. \n",str); //이부분이 core dump 뜨면서 세그멘테이션 오류가 계속나는데요 이유를 모르겠네요 ㅠ
클라이언트부분은
connsock = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP); memset(&client,0,sizeof(client)); client.sin_addr.s_addr = inet_addr(argv[1]); client.sin_family = AF_INET; client.sin_port = htons(atoi(argv[2])); printf("사용자 명을 입력하세요 \n"); scanf("%s",nickname); if(connect(connsock,(struct sockaddr*)&client,sizeof(client)) == -1) { printf("connect에 실패했습니다. \n"); return -1; }
위와같은 주소형식을 넣어주었구요.. 저 inet_ntoa 클라이언트 ip출력부분을 제외하면 정상작동은 됩니다.
고수님들의 조언 부탁드립니다. ㅠ
Forums:
음.. accept 리턴값 체크해보세요..
왜 inet_ntoa 가 NULL 을 리턴하는가에 대한 파악이 필요할듯해요..
댓글 달기