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
if ( (nToDsP = accept(listenfd, (struct sockaddr *)&skaddr, &addrlen)) < 0 ) { if (errno == EINTR) continue; else ErrorMsg_Print("accept error"); }첫번째는 accept의 두번째 파라미터인 skaddr의 선언부분이 안보이네요... 이부분이 적절하게 선언되어 있어서 writable한 영역인지 확인해보시구요...
두번째는 addrlen은 선언만 되어있고, 값은 assign하지 않으셨는데... AF_INET계열이라면 sizeof( struct sockaddr_in ) 값으로 설정하셔야 합니다.
(accept(2)의 세번째 파라미터는 value-result 파라미터입니다.)
우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자
답변 감사합니다.
addrlen = sizeof(struct sockaddr_in);
한줄 추가로 해결 되었습니다.
감사합니다.
댓글 달기