IOCP를 이용한 서버를 만들면서...
프로그래밍 :
2009/05/31 06:44
| 대략 구조가 accept를 하는 스레드와 worker스레드로 서버가 구성되어있다. accept를 하는 스레드는 큰 입출력이 필요 없으므로 간결한 구조로 가기 위해 non-blocking 모드로 소켓을 생성하고 무한 루프를 돌렸다. 그리고 서버 가용성 테스트를 위해서 0.05초에 약 170바이트 정도의 패킷을 전송하는 더미 클라이언트를 64개 정도 붙였다. 그리고 나서 accept 스레드를 종료하여 서버를 종료 시키기 위해 루프가 멎을수 있도록 조건값을 변경 시켰다. 그런데도 감감 무소식...... 디버거로 accept 스레드의 루프에 브레이크 포인트를 걸었으나 안걸림... 이게 뭔일이디야.. 그래서 혹시나 해서 EventSelect로 바꿔보았다.. 잘 된다... 이걸 어찌 설명해야할지.. IOCP하고 non-blocking 소켓은 쓰지 말아야 하는건가? 클라이언트를 한두개 붙였을 때는 non-blocking으로 해도 잘 걸렸는데 worker스레드가 좀 바쁘게 돌아가면 감감 무소식이다. 스레드 우선순위에서 밀리는 것인가.. 모르겠군.. |





댓글을 달아 주세요
IOCP이벤트를 강제로 날릴수있어요..
날려보세요..
핸들을 NULL로 날려서 핸들이 NULL일때 끝내면 될듯..
그 문제가 아닙니다.
worker 스레드를 종료하기 전에 accept 스레드를 종료할때 문제입니다. accept 스레드는 위 글에도 써놨지만 IOCP를 안쓰고 있거든요.
서버 종료 명령을 내리면 accept 스레드를 먼저 종료합니다. accept 스레드가 종료되면서 worker 스레드에게 이벤트를 날립니다. 그런데 accept스레드가 종료가 안되니 저런 현상이 발생한 것이지요..
어차피 종료하실거라면, 먼저 listen 소켓부터 종료해보심이..
listen 소켓을 닫는다는 것에 대해서 좀 더 자세히 설명해 주실수 있으시나요? 어차피 accept함수는 비동기로 되어 있어서 일정한 시간 후에 자동으로 리턴 되도록 되어있습니다.
listen 소켓을 종료한다는건, 처음에 server 로 지정한 소켓을 말하는건데 accept 에서 즉각 리턴을 안하니깐 스레드가 바로 종료안하는게 아닐까요? 그래서 accept 가 잡고있는 listen 하고 있는 소켓을 먼저 종료해도 될거같다고 글을 남긴건데요, 제가 non-blocking 모드로 소켓을 한건 예전에 공부할때 사용한적 빼곤 없어서 별로 도움이 안될 것 같네요.
무슨 말씀이신지 이해했습니다. 조언 감사합니다.