Windows IOCP API를 사용하여 TCP 연결이 피어 (RST 패킷 또는 유사하게 전송 됨)에 의해 찢어 졌는지 어떻게 알 수 있습니까? 특히 어떤 데이터도 보내거나받을 수 없습니다. 중복되는 작업은 없습니다. 비동기 알림을 받고 싶습니다. 그렇게 할 수있는 방법이 있습니까?Windows IOCP를 사용하여 단절 (RST/FIN)을 감지하는 방법은 무엇입니까?
답변
연결 종료를 감지하려면 읽기 또는 쓰기 대기가 필요합니다. Remy가 RST에서 제안한대로 둘 중 하나가 반환되지만 보류중인 읽기에서는 원격 측에서 연결의 전송 측을 닫을 때 알림을 받게됩니다.
항상 겹쳐진 읽기 대기 상태를 유지하는 것이 좋습니다. 메모리를 묶고 싶지 않으면 항상 0 바이트로 읽을 수 있습니다.
IOCP 완료 핸들러는 소켓 작업의 성공 또는 실패 여부를 알립니다. 매개 변수는 어떤 경우인지 알려줍니다.
GetQueuedCompletionStatus()
을 사용하는 경우 오류가 발생하면 FALSE
을 반환합니다. 소켓 오류 일 경우 *lpOverlapped
은 실패한 OVERLAPPED
작업의 NULL이 아닌 포인터 값으로 설정됩니다. GetQueuedCompletionStatus()
자체가 실패하면 *lpOverlapped
이 NULL로 설정됩니다. 피어가 올바르게 연결 해제되면 TRUE를 반환하고 대신 *lpNumberOfBytes
을 0으로 설정합니다.
WSAgetOverlappedResult()
을 사용하는 경우 오류가 발생하면 FALSE를 반환합니다. WSAGetLastError()
을 사용하여 소켓 오류인지 여부를 확인하십시오. 피어가 올바르게 연결 해제되면 TRUE를 반환하고 대신 *lpcbTrasfer
을 0으로 설정합니다.
흠. 나는 겹쳐진 연산이 없다. 이런 경우 연결 실패에 대해 어떻게 알릴 수 있습니까? –
어떻게 오버랩 된 작업없이 IOCP를 사용하고 있습니까? IOCP는 중첩 I/O를 중심으로 설계되었습니다. –
필기 또는 읽지 않아도 연결 해제에 대한 알림을 받고 싶습니다. 0 바이트 읽기가 잘 작동합니다. 위의 대답을 참조하십시오. –
테스트 됨. 0 바이트 읽기가 작동합니다. 더 나은 점은 연결 오류가 없다면 완료되지 않는다는 것입니다. 그것은 바쁜 루핑으로 이어지지 않는다. 약간의 어색한 점은 비록 일부 데이터를 읽으 려 할 때 0 바이트 읽기를 취소하고 실제 읽기 요청을 시작해야한다는 것입니다. –
그런 다음 0 바이트 읽기를 사용하지 마십시오. 실제 읽기를 대신 사용하십시오. 데이터가 실제로 도착할 때까지 또는 실패가 발생할 때까지 보류 상태를 유지합니다. –
나는 당신이 읽고 있지 않은 상태에서 당신이 읽는 상태로의 전환을 의미했습니다. BSD 소켓처럼 하나의 작업 대신 2 회의 작업 (취소 + 읽기)이 필요합니다. 하지만 큰 문제는 아닙니다. –