2010-06-16 2 views
1

내가 다음과와 WSASend 호출 (콜백 함수 않은 Windows I/O 완료 포트) 게시 말 : 나는 완료 포트에서 "write_done"알림을받을 때둘 이상의 버퍼가있는 WSASend() - 불완전한 완료 할 수 있습니까?

void send_data() 
{ 
    WSABUF wsaBuff[2]; 
    wsaBuff[0].len = 20; 
    wsaBuff[1].len = 25; 
    WSASend(sock, &wsaBuff[0], 2, ......); 
} 

, 그 수를 wsaBuff [1] 것 wsaBuff [0]은 부분적으로 만 전송됩니다 (예 : 7 바이트).

답변

0

중첩 된 소켓 IO를 수행하는 데 선호되는 방법으로 완료되지 않은 경우 완료 알림/루틴/이벤트가 응용 프로그램에서 사용 된 구조를 정리/재활용 할 수있는 유일한 방법입니다.

또한 사용할 수 없습니다. WSASend 호출은 사용 된 버퍼에 관계없이 여전히 단일 IO 호출입니다.

2

다른 유사한 질문 중 하나에 대한 답장에서 이것이 실패 할 가능성이있는 유일한 경우는 리소스가 부족한 상태 (비 페이징 풀 또는 잠긴 페이지 제한 가능성이 높은 문제) 일 때입니다. ENOBUFS의 부분 완료 및 오류 리턴이 발생할 수 있습니다. 그리고 다시 말했듯이, IOCP 개발 작업에서 10 년 동안 나는 프로덕션에서이 문제를 결코 본적이 없었습니다. 시스템을 죽이기 위해 스트레스 테스트를 실시한 상황에서였습니다 (문자 그대로 비 페이징 풀 고갈은 때때로 나쁜 행동을하는 운전자가 상자를 파란 화면으로 만들 수 있음).

오류를 기록하기 위해 코드를 추가하고 소켓을 닫으면 오류가 발생할 가능성을 처리하고 계속 진행할 수 있습니다. 당신의 실패 처리 코드가 실행되면 놀랄 것입니다. 그러나 문제가 무엇인지 알면 알게 될 것이며, 문제를 재현 할 수 있다면 실제로 더 잘 처리해야하는지 생각하는 데 더 많은 시간을 할애 할 수 있습니다.

+0

Len입니까? 이 특정 질문에주의를 기울이십시오 - 단일 WSASend() 호출이고 여러 개가 아니므로 WSABUF 배열을 하나의 연속 버퍼로 취급해야합니다. 내 질문은 사실 전부입니다. – Poni

+0

소켓의 송신 버퍼 크기를 0으로 설정하면 버퍼가 메모리에 잠기므로 잠긴 페이지 한도를 초과하면 ENOBUFS가 반환 될 수 있습니다. 마찬가지로 우리 중 어느 누구도 페이지가 아닌 정확한 풀 사용에 대해 관여하지 않습니다. 이 상황. 당신이 scatter/gather I/O를 사용한다는 사실은 실제로 IMHO와 관련이 없습니다. 또한 WSASend()에 대한 문서에서이 상황으로 인해 발생할 수있는 오류가 발생할 수 없다고 말하지 않기 때문에 발생할 수 있다고 가정해야하므로 오류가 발생할 수 있다고 가정해야합니다. –