본 자료는
1. 문제 발생 코드
2. 해결 방법
순서로 진행합니다.
Windows Socket 프로그램 개발 시 Windows Embedded Compact 7 이하의 버전에서 Socket Option 설정 기능을 지원하지 않는 문제로 수신 Time out 처리를 사용할 수 없어 이를 해결하는 방법을 Code를 통해 제공하고자 합니다.
※ 자세한 내용은 "SmartX Framework 프로그래밍 가이드 > SmartTCPMultiServer, SmartTCPClient"를 참고하시기 바랍니다.
1. 문제 발생 코드
아래 Code를 사용해 Socket Option을 설정해야 하지만, Windows Embedded Compact 7 이하의 버전에서는 지원이 되지 않아 Socket에서 Receive 계열의 함수에서 Timeout 기능을 사용할 수 없습니다.
C++ |
---|
struct timeval timeout; timeout.tv_usec = 200000; int i = setsockopt(m_CommSocket, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)); |
2. 해결 방법
Winsock에서 Socket의 상태를 확인하는 함수를 지원하고 있습니다. 이 함수를 이용하여 지금 수신된 데이터가 있는지 먼저 확인하고 처리하도록 하면 Receive Timeout 기능을 간편하게 구현할 수 있습니다. C++ 에서는 Select() 함수가 Socket의 상태의 변화를 감지하여 Return하며 만약 설정된 시간 이전에 Socket의 상태가 변경될 경우 바로 Return하도록 되어있으며. 여기서 말하는 상태의 변경이라는 것은 대표적으로 Socket의 송신/수신/오류 등의 상태의 감지를 말할 수 있습니다. 아래 코드를 확인해보시기 바랍니다.
C++ Prototype |
---|
int select( int maxfd, fd_set* readset, fd_set* writeset, fd_set* exceptset, struct timeval * timeout); |