|
비 동기 상태의 소켓 일때, 대기열이 많아서 당장 모든 처리를 할 수 없을 때
일어나는 문제입니다. 콜백 함수를 정의하셨으면 해당 콜백으로 완료되었을시
넘어오도록 할 수 있고요,
만약, 통신 루틴 설계상에서 이 에러가 많이 나타난다면,
통신 루틴의 쓰레드 Priority 를 약간 높여 주시는 것이 좋습니다.
cuperido
넘초보 님이 쓰신 글 :
: IOCP 를 이용한 통신을 하고 있습니다.
:
: 제가 궁금한것은 서버에서 송신시에 ERROR_IO_PENDING 상태입니다.
:
: 아래처럼 데이터를 보낼때
:
: ret = ::WriteFile((HANDLE)socketValue, packet, packetSize, &wBytes, (LPOVERLAPPED)&ol);
:
: ERROR_IO_PENDING 상태라면, 보내고자 하는 packet 이 이미 소켓버퍼에 들어간건지,
:
: 아니면, ERROR_IO_PENDING 상태 해제후에 다시 packet 을 WriteFile 로 넣어주어야 하는것인지..
:
: ERROR_IO_PENDING 시에 wBytes(전송된바이트) 를 보면 항상 0 으로 되어 있더군요.
:
: wBytes 의 값이 소켓 버퍼에 넣어진 값인지, 아니면 클라이언트로 전송이 완료된 값인질 모르겠네요..
:
: 소켓버퍼에 넣이진 값이라면, ERROR_IO_PENDING 해제후에 나머지 값을 넣어주면 될거라고 보는데,
:
: 항상 이 값이 ERROR_IO_PENDING시에는 0 이라서요.....
:
:
: GetOverlappedResult() 함수로 ERROR_IO_PENDING 해제를 기다렸다면, 위에서 보내고자 하는
:
: packet 데이터가 전송된 것인지, 만약 그렇다면 GetOverlappedResult() 으로 ERROR_IO_PENDING 으로
:
: 헤제를 기다리지 않고 바로 다음 데이터를
:
: ret = ::WriteFile((HANDLE)socketValue, packet2, packet2Size, &wBytes, (LPOVERLAPPED)&ol);
:
: 와 같이 계속 보낼경우에 발생할 수 있는 문제는 어떤게 있을까요?
:
:
: ReadFile 의 경우 ERROR_IO_PENDING 시에, 그냥 기다려면 클라이언트로부터 데이터가 올테고,
:
: 이때 다시 읽어들이면 될텐데, 음...
:
:
: 도움 부탁드립니다.....
|