2012-06-26 3 views

답변

3

연결 종료를 감지하려면 읽기 또는 쓰기 대기가 필요합니다. Remy가 RST에서 제안한대로 둘 중 하나가 반환되지만 보류중인 읽기에서는 원격 측에서 연결의 전송 측을 닫을 때 알림을 받게됩니다.

항상 겹쳐진 읽기 대기 상태를 유지하는 것이 좋습니다. 메모리를 묶고 싶지 않으면 항상 0 바이트로 읽을 수 있습니다.

+0

테스트 됨. 0 바이트 읽기가 작동합니다. 더 나은 점은 연결 오류가 없다면 완료되지 않는다는 것입니다. 그것은 바쁜 루핑으로 이어지지 않는다. 약간의 어색한 점은 비록 일부 데이터를 읽으 려 할 때 0 바이트 읽기를 취소하고 실제 읽기 요청을 시작해야한다는 것입니다. –

+1

그런 다음 0 바이트 읽기를 사용하지 마십시오. 실제 읽기를 대신 사용하십시오. 데이터가 실제로 도착할 때까지 또는 실패가 발생할 때까지 보류 상태를 유지합니다. –

+0

나는 당신이 읽고 있지 않은 상태에서 당신이 읽는 상태로의 전환을 의미했습니다. BSD 소켓처럼 하나의 작업 대신 2 회의 작업 (취소 + 읽기)이 필요합니다. 하지만 큰 문제는 아닙니다. –

1

IOCP 완료 핸들러는 소켓 작업의 성공 또는 실패 여부를 알립니다. 매개 변수는 어떤 경우인지 알려줍니다.

GetQueuedCompletionStatus()을 사용하는 경우 오류가 발생하면 FALSE을 반환합니다. 소켓 오류 일 경우 *lpOverlapped은 실패한 OVERLAPPED 작업의 NULL이 아닌 포인터 값으로 설정됩니다. GetQueuedCompletionStatus() 자체가 실패하면 *lpOverlapped이 NULL로 설정됩니다. 피어가 올바르게 연결 해제되면 TRUE를 반환하고 대신 *lpNumberOfBytes을 0으로 설정합니다.

WSAgetOverlappedResult()을 사용하는 경우 오류가 발생하면 FALSE를 반환합니다. WSAGetLastError()을 사용하여 소켓 오류인지 여부를 확인하십시오. 피어가 올바르게 연결 해제되면 TRUE를 반환하고 대신 *lpcbTrasfer을 0으로 설정합니다.

+0

흠. 나는 겹쳐진 연산이 없다. 이런 경우 연결 실패에 대해 어떻게 알릴 수 있습니까? –

+0

어떻게 오버랩 된 작업없이 IOCP를 사용하고 있습니까? IOCP는 중첩 I/O를 중심으로 설계되었습니다. –

+0

필기 또는 읽지 않아도 연결 해제에 대한 알림을 받고 싶습니다. 0 바이트 읽기가 잘 작동합니다. 위의 대답을 참조하십시오. –