select() 함수의 timeout 에 대해 다시 질문 드립니다. 제발 꼭
글쓴이: black0328 / 작성시간: 월, 2003/10/20 - 4:33오후
tv.tv_sec = 60; tv.tv_usec=0; do{ FD_ZERO(&rfds); FD_SET(client_accept,&rfds); if((ss=select(client_accept+1,&rfds,(fd_set *)0,(fd_set *)0,&tv))<1){ close_socket(); }else{ //select() >=1 인 경우 if(FD_ISSET(client_accept,&rfds)) { recvByte += recv(client_accept, fileMessage+recvByte, MAX_PACKET_SIZE-recvByte, 0); } } }while(recvByte !=MAX_PACKET_SIZE)
******************************************
이상 제가 구현한 코드입니다.
recv 를 받기 시작하고 60초가 지나면 무조건 타임아웃이 걸립니다. 제가 구현 하고 싶은 기능은 recv 가 아무런 것도 받지 않고 60초가 지나면 타임아웃이 걸리게 하려고 하는데....계속 데이타는 recv 하는데 타임아웃이 걸립니다. 무엇이 잘못된것일까요?
Forums:
man에 return 값이 0일 때 타임아웃이라고 명시돼 있으니 그걸 사
man에 return 값이 0일 때 타임아웃이라고 명시돼 있으니 그걸 사용하시는게 좋을 것 같습니다. 무엇보다 타임아웃이 걸렸을때 file descriptor set들이 어떤 상태를 가지는지가 표준화 돼 있을 것 같지는 않습니다.
그리고 linux에서는 문제가 생길 소지가 있는 부분이 linux에서는 i/o 작업이 발생했을 때 tv의 값이 변경됩니다. 따라서 반복적으로 호출되는 부분이라면 i/o작업 처리시에 이 값을 reset 해주셔야 합니다.
오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.
tv 값을 초기화 하세요.
tv 값을 루프 매번 마다 초기화하세요.
--
Minimalist Programmer
tv 값 입력하는 부분을 select 바로 앞부분에 쓰세요.위에
tv 값 입력하는 부분을 select 바로 앞부분에 쓰세요.
위에 두분의 말씀의 뜻이 그렇네요
초보의 해석이였습니다. ^^;;
^^Y 재미있는 하루...
[code:1]do{ tv.tv_sec = 60;
///////////////////////////////////////////////////////////////////////////
thanks !!!!
this code work well!!!
recv 후 60초 를 말하는거 같은데 ..recv 바로 밑에 타임을
recv 후 60초 를 말하는거 같은데 ..
recv 바로 밑에 타임을 60으로 다시 셋팅 하시면 됩니다.
hi 용
댓글 달기