|
IOCP 를 이용한 서버를 만들고 있습니다.
작업 쓰레드를 4개로 했을경우이고요.
100개의 클라이언트가 접속되어 있는 상태일경우
, 하나의 작업 쓰레드에서 클라이언트로부터 데이터를 수신(GetQueuedCompletionStatus()를 통해)해서
루프를 통해 나머지 99개 클라이언트에게 이를 전송합니다.
이때 99개 중 첫번째 클라이언트의 통신 속도가 현저히 낮아서 (혹은 Pause 상태)
이전 패킷 전송 처리에 ERROR_IO_PENDING 이 발생하고 있는 상태일 경우
현재 패킷을 전송할수 없는 경우가 생길수 있겠죠.
현재 패킷을 전송하기 위해서 속도가 느린 클라이언트를 위해
IO_PENDING 상태가 풀릴때까지 대기하게 된다면, 나머지 98개의
클라이언트에 대한 전송이 늦어 질겁니다. IO_PENDING 상태일 경우
WriteFile() 로 데이터를 전송하면 ERROR_IO_PENDING 이 계속 발생하게
되는데, PENDING 상태일때 WriteFile() 로 전송을 시도한
데이터는 OS 에서 제공하는 소켓 전송 버퍼에
쌓이고 있는건지 궁금합니다. 그리고, 제공되는 버퍼의 크기는 한정되어
있을것이고, 또한 이럴경우에는 어떤 메시지(?) 가 오게 되는것인지요.
전송 부분만 따로 관리하는 쓰레드를 한개 둘경우에도 마찬가지(IO PENDING 상태)
증상이 발생할것이고, 모든 클라이언트에 대해 전송 쓰레드를 둘경우
IOCP 를 굳이 사용할 필요가 없겠죠.
님들은 이럴경우 어떻게 처리하고 계신지 궁금합니다.
|