2011-06-10 6 views
1

중복 된 I/O와 함께 Winsock2를 사용하고 있습니다. 이것은 WSAOecl 구조체와 함께 WSARecv를 호출하고 나중에 데이터에 대해 WSAWaitForMultipleEvents를 기다리는 것을 의미합니다.디버거에서 Winsock2 데이터 손실이 발생했습니다.

나는 이상한 관찰을 내 응용 프로그램에 보내는 모든 데이터를 느슨하게하는 동안 디버거를 사용하여 중지합니다. 이 데이터가 OS의 어딘가에 쌓여서 WSARecv에 대한 다음 호출시 전달 될 것이라고 생각했습니다.

내 가정이 틀렸습니까?

+0

코드에 다른 부분이 있는데, 여기서 설명한 상황으로 인해 버그가 생성되어서는 안되며 OS에 프로그램에 전달되지 않은 데이터 더미가있는 경우가 있습니다. 하지만 운영 체제 자체에는 한계가 있기 때문에 오버플로가 발생하면 어떻게 될지 알 수 없습니다. – Ali1S232

+0

나는 조금 더 조사하고 디버거에서 WSAOVERLAPPED와 assciated 버퍼에 데이터가 쌓인 것을 본다. 나는이 데이터에 대해 어떤 이벤트도받지 못하는 것 같습니다. 다음 데이터 청크가 수신되면 버퍼가 덮어 쓰여지고 새 데이터에 대한 이벤트가 표시 될 수 있습니다. 정말 이상합니다. – MrZomg

답변

1

UDP 또는 TCP?

각 호출마다 별도의 OVERLAPPED 구조와 구조 당 별도의 이벤트를 사용한다고 가정합니다.

이벤트와 중복 된 I/O를 사용하는 것이 특히 확장 가능하지 않다는 것을 명심하십시오. 소켓을 I/O 완료 포트와 연결하고 이벤트 전체를 완전히 건너 뛰는 것이 훨씬 쉽습니다.

+0

은 TCP 용입니다. 내가 사용한 후 ZeroMemory 중복 된 구조 및 WASResetEvent뿐만 아니라 사용되는 이벤트. 이상한 것은 디버거에 의해 일시 중지되지 않았을 때 잘 동작한다는 것입니다. 이벤트/중복 구조의 오용에 관한 어떠한 오류도 존재하지 않아야합니까? – MrZomg

+0

예, 그렇지만 디버거로 인해 경쟁 조건이 더 자주 나타날 수 있습니다 ... 코드를 볼 수 있습니까? –

관련 문제