2010-06-26 5 views
1

몇 가지 테스트/프로파일 링 목적으로 IOCP를 사용하여 간단한 더미 서버/더미 클라이언트 프로그램을 만들었습니다. (또한 비동기 네트워크 프로그래밍에 익숙하지 않음을 알고 싶습니다.)ConnectEx with IOCP 문제

더미 클라이언트가 ConnectEx 함수를 사용하여 서버에 연결하려고하면 서버가 원본 클라이언트와 잘 작동하는 것처럼 보이지만 IOCP 작업자 스레드 GetQueuedCompletionStatus 함수에 의해 여전히 차단되고 서버가 연결을 수락하는 동안 결과를 반환하지 않습니다.

이 문제를 해결하기 위해 문제 및/또는 이유는 무엇이며 어떻게해야합니까?

+0

더 많은 코드를 표시하십시오. 어쨌든, 서버를 telnet 할 때 무엇을합니까? (telnet localhost , 간단한 tcp 클라이언트로 매우 유용합니다). –

+0

실제 코드는 회사의 자체 라이브러리를 기반으로하므로 유감스럽게 생각 합니다만 클라이언트의 스켈레톤은 다음과 같이 설명 할 수 있습니다. WSAstartup -> IOCP 생성 -> 작업 스레드 시작 -> IOCtl을 사용하여 ConnectEx 가져 오기 -> 바인드 소켓 -> ConnectEx 전화 -> 소켓을 IOCP에 할당하십시오. 소켓이 이미 연결되어 있습니다. 반복적으로 서버에 연결하려고하면 WSAGetLastError 오류가 발생합니다. 내 서버 tommorow 텔넷 시도해 보겠습니다. 고맙습니다! – summerlight

+0

ConnectEx가 새로운 스레드에서 연결 목적으로 만 호출 될 때 제대로 작동하는 것 같습니다. 그래도 여전히이 문제의 정확한 이유는 모르겠습니다. – summerlight

답변

0

허용 된 소켓을 IOCP에 연결 한 후에도 작업자 스레드는 "잠금 해제"완료 이벤트를 게시 할 때까지 GetQueuedCompletionStatus에서 차단 된 상태로 유지됩니다. 새 소켓을 "잠금 해제"하지 않으면 시스템에서 수신/쓰기 작업의 완료 이벤트를 보내지 않습니다. 자세한 내용은 ckeck 푸시 프레임 워크 http://www.pushframework.com의 소스 코드는 IOCP를 사용하는 C++ 네트워크 응용 프로그램 프레임 워크입니다. "잠금 해제"트릭은 "IOCPQueue"클래스에 있습니다.

+1

흥미로운 코드 ... IMHO IOCP를 만들기 위해 만드는 더미 소켓이 socket()을 사용하고 있고 WSASocket()이 아닌 것처럼 중첩 된 사용을 위해 만들어지지 않았기 때문에이 IOCP를 잘못 만들고 있습니다. WSA_FLAG_OVERLAPPED'는 소켓에 대한 "overlapped I/O completion을 위해 열린"요구 사항과 관련하여 http://msdn.microsoft.com/en-us/library/aa363862(VS.85).aspx에 대한 문서를 참조하십시오. 두 번째로 첫 번째 소켓을 사용하는 것이 IOCP를 만드는 것이라면 단순히 NULL을 전달하면됩니다. 셋째, IOCP를 사용할 때 '잠금 해제'가 필요하다는 사실을 절대로 발견하지 못했습니다. –

+0

위의 Len의 설명과 관련하여 http://msdn.microsoft.com/en-us/library/ms740506%28v=vs.85%29.aspx 비고 섹션에서 "작성된 소켓에는 중복 된 속성을 기본 " –

2

귀하의 의견에 자신의 질문에 답변 해 주셨습니다.

일련의 이벤트가 잘못되었습니다. 사용자가 Bind, ConnectEx, IOCP에 연결한다고 말합니다.

바인딩해야하며 소켓을 IOCP에 연결 한 다음 ConnectEx를 호출해야합니다.