Socket API의 Select함수의 TimeOut 문제점 도움 바랍니다.
500ms마다 Select함수를 호출하여 접속 확인고 이벤트를 보내고 있는데
Select함수에서 계속하여 0값이 리턴되고 있습니다.
현상은 처음에는 Select함수가 정상적으로 동작을 하나 네트워크 접속한뒤 끊어지고 다시금
접속이 되어지면 다음부터는 계속하여 TimeOut이벤트가 발생하고 있습니다.
현재 소스 코드는 아래와 같습니다.
참고로 현재 Connect함수는 Non-blocking함수로 구현이 되어 있습니다.
해결 방법이 없을가요??
LISTPOS pos;
CObjItem * pItem;
CSocketFD * pFD;
int nRet;
timeval timeout;
fd_set fds;
pos = m_wlistObj.FindHead();
while(pItem = (CObjItem *) m_wlistObj.GetAt(pos)))
{
pFD = (CSocketFD *) pItem;
FD_ZERO(& fds);
FD_SET((unsigned int) pFD->m_soc, & fds);
timeout.tv_sec = 0;
timeout.tv_usec = 0;
switch(pFD->m_nSocStatus)
{
case NET_SOCKET_TRY_CONNECT: // try connection
nRet = select(pFD->m_soc + 1, 0, & fds, 0, &timeout);
if(nRet > 0)
{
if(FD_ISSET(pFD->m_soc, & fds))
{
이벤트 전달
}
}
else if(nRet == SOCKET_ERROR)
{
Socket 소멸
}
else
{
타임아웃 체크
}
......
네트웍 절단이나 reset
네트웍 절단이나 reset 패킷 등등으로 인해서 세션이 끊어진건가요?
그런 경우라면 close() 한 다음 다시 connect()하고 select()에서 감시할 fd를 재설정해주셔야 합니다.
Written By the Black Knight of Destructionㄹ
Written By the Black Knight of Destruction
댓글 달기