accept 시 14번오류(EFAULT) 원인이 뭐죠?
글쓴이: myduck / 작성시간: 수, 2003/07/02 - 10:28오전
네트워크 프로그램을 만들고 있습니다.
서버측 프로그램으로 데몬 형태로 만들고 있는데요.
똑같은 소스로 다른 플랫폼에서는(linux, hp, 다른SUN)에서는 아무 문제 없이 실행이 되는데요.
특정 서버(SunOS 5.8 sun4u sparc SUNW,Ultra-5_10)에서 accept 함수에서 14번 오류가 발생합니다.
도저히 원인을 못 찾겠습니다.
main(argc, argv) int argc; char *argv[]; { switch( fork() ) { case -1: exit(1); case 0: setsid(); break; default: exit(0); } while(1) { demon(); } } demon() { pid_t childpid; int addrlen, backlog; int rtn=1; char *ptr; char curtime[128]; int accept_count = 0; char aHostName[32]; /* 서버의 이름 */ _SetUp_SigKill(SigKill_Handler); _SetUp_Signal(SIGTERM, SigTerm_Handler); Read_Config(); /* 환경변수 읽기 */ memset(aHostName, 0x00, sizeof(aHostName)); memcpy(aHostName, "localhost", 9); Sam_file_mon(); /* 모니터 로그파일 생성 */ memset ( curtime, 0x00, sizeof(curtime)); _get_curtime( curtime); fprintf ( mon, "demon start(PORT:%06d, TIME:%s)\n", demon_PORT, curtime); fflush (mon); /* TCP/IP Socket 생성 */ listenfd = Create_Multi_TcpPort(demon_PORT, sPcAddr); if ((ptr = (char *)getenv("LISTENQ")) != NULL) backlog = atoi(ptr); if ( listen(listenfd, backlog) < 0 ) { /* 서버로 설정 */ Error_Handler(errno, errno, "create.. listen failed"); } while(1){ sleep(1); /* Client의 접속을 기다림 */ if ( (nToDsP = accept(listenfd, (struct sockaddr *)&skaddr, &addrlen)) < 0 ) { if (errno == EINTR) continue; else ErrorMsg_Print("accept error"); } ....Create_Multi_TcpPort 는 socket 에서 bind 까지의 라이브러리 입니다.
Error_Handler 는 에러 발생시 화면이나 파일에 write하는 함수 입니다.
여기서 오류가 나는 부분은 accept 다음의 ErrorMsg_Print 입니다.
Forums:
[code:1] if ( (nToDsP = acc
첫번째는 accept의 두번째 파라미터인 skaddr의 선언부분이 안보이네요... 이부분이 적절하게 선언되어 있어서 writable한 영역인지 확인해보시구요...
두번째는 addrlen은 선언만 되어있고, 값은 assign하지 않으셨는데... AF_INET계열이라면 sizeof( struct sockaddr_in ) 값으로 설정하셔야 합니다.
(accept(2)의 세번째 파라미터는 value-result 파라미터입니다.)
우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자
답변 감사합니다.
addrlen = sizeof(struct sockaddr_in);
한줄 추가로 해결 되었습니다.
감사합니다.
댓글 달기