Thread/Windows

[Thread] DuplicateHandle 사용 팁

Binceline 2012. 10. 18. 14:45

소켓핸들이 한개로 WSARecv로 수신대기중인 상태에서, WSASend로 데이터를 보내게 되면 WSARecv로 대기중이던게 취소됩니다. 이때 발생하는 에러가 님이 말씀하신 ERROR_OPERATION_ABORTED입니다.

이 에러는 발생해도 끊어지거나 뭐 별다른 일은 일어나지 않습니다.

아마도 데이터를 보낼려고 하는데, 그 핸들이 사용중이니까 일단 사용중인것을 취소하고 보내지 않나 싶네요

하여간, 이 에러가 발생하지 않게 하기 위해서는 핸들을 2개 사용하면 되구요..

WSADuplicateSocket 이나 DuplicateHandle 를 사용해서 복사해서 한개는 수신을 한개는 송신을 하면 됩니다. 
저는 accept에서 발생한 핸들을 수신용으로, 복사해서 나온 핸들을 송신용으로 사용하고 있습니다.

 

새로운 핸들이 발생하면 CreateIoCompletionPort 에 추가를 해주던데

복사된 핸들은 CreateIoCompletionPort 여기에 추가해주지 않았거든요.. 그래도 동작하는데 이상이 없네요

 

저는 DuplicateHandle을 사용해서 복사를 하는데, 아래와 같이 했습니다.

int hr=DuplicateHandle(GetCurrentProcess(), (HANDLE)hsocket, GetCurrentProcess(), (LPHANDLE)&hwritesocket, NULL, FALSE, DUPLICATE_SAME_ACCESS);


출처 : http://cafe.naver.com/ddugi/2

반응형