일반적으로 사용되는 listen() 함수를 통해, 일정 갯수의 backlog 수 만큼 미리 accept를 받을수 있다.
그러나, IOCP로 개발을 하면서 AcceptEx() 함수를 사용하는 경우는 이러한 기능이 상당히 방해가 된다.
AcceptEx()를 호출하지 않은 상태에서도 포트로 connect이 들어오면 accept를 미리 해버리기 때문이다.
이를 방지하기 위해 다음 코드를 사용할수 있다. 아래 함수를 호출하게 되면 AcceptEx가 호출되지 않을 경우
listen이 자동적으로 처리되지 않는다.
참고로, 이 함수를 호출하게 되면, netstat 를 통해 LISTEN 대기 중인 포트를 보더라도 표시되지 않는다.
// AcceptEx()를 사용할 경우, listen() 에서 자동적으로 accept를 받지 못하도록 한다.
BOOL on = TRUE;
// fd는 listen() 용으로 생성된 socket으로, bind처리를 마친 소켓이어야 한다.
if (setsockopt( fd, SOL_SOCKET, SO_CONDITIONAL_ACCEPT, (char *)&on, sizeof(on)))
return -1;
BOOL on = TRUE;
// fd는 listen() 용으로 생성된 socket으로, bind처리를 마친 소켓이어야 한다.
if (setsockopt( fd, SOL_SOCKET, SO_CONDITIONAL_ACCEPT, (char *)&on, sizeof(on)))
return -1;