2010-08-18 5 views
0

C++에서 소켓의 경우 수신 기능을 차단하지 않기 위해 어떻게 스레드를 사용할 수 있습니까?C++을 사용하여 Windows 스레딩

// Receive until the peer closes the connection 
do { 

    iResult = recv(lhSocket, recvbuf, recvbuflen, 0); 
    if (iResult > 0) 
     printf("Bytes received: %d\n", iResult); 
    else if (iResult == 0) 
     printf("Connection closed\n"); 
    else 
     printf("recv failed: %d\n", WSAGetLastError()); 

} while(iResult > 0); 

closesocket(lhSocket); 
WSACleanup(); 
+1

나는 이것에 대해 절대 확신하지는 않지만 대신 Boost.Asio를 사용하는 것이 비동기적이고 완벽하게 교차 플랫폼이며 스레드를 사용하지 않아도되므로 훨씬 편리하다고 생각합니다. http://www.boost.org/doc/libs/1_44_0/doc/html/boost_asio.html –

답변

2

새 스레드를 만들려면 CreateThread()으로 전화하십시오. 소켓에서받은 정보로 UI를 업데이트하려면 윈도우에 대한 사용자 메시지 (WM_USER보다 큰 값으로)를 정의하고 PostMessage()으로 전화하여 원하는 정보를 창에 알려야합니다.

+0

DWORD WINAPI ThreadFunc (LPVOID lpParam) { char szMsg [80]; printf (szMsg, "ThreadFunc : Parameter = % d \ n", ((int *) lpParam)); return 0; } void main() { DWORD dwThreadId, dwThrdParam = 1; 핸들 hThread; hThread = CreateThread ( NULL, 어떤 보안 속성 없습니다 // 0, // 사용의 기본 스택 크기는 ThreadFunc, // 스레드 함수 및 dwThrdParam은, // 인수가 스레드 기능 0, // 사용 기본 생성 플래그 & dwThreadId) ; // 스레드 식별자를 반환합니다. // 성공을 위해 반환 값을 확인합니다. if (hThread == NULL) CloseHandle (hThread); } 화면에 아무 것도 인쇄되지 않습니까? –

+0

@Swapnil 아마도 스레드가 생성되면 프로그램이 종료되기 때문일 것입니다. CreateThread()는 스레드가 생성되는 즉시 반환하므로 스레드가 아무 것도 인쇄 할 시간이 없을 수 있습니다. CreateThread() 호출 후 스레드 핸들 WaitForSingleObject()에 대한 호출을 추가 할 경우 인쇄 된 것이 표시되어야합니다. – Andy