2011-08-05 2 views
0

C++의 Windows에서 스레드 동기화와 관련된 디자인 문제가 있습니다.모든 활성 스레드에 신호 보내기 (Windows)

스레드를 수신하는 서버 응용 프로그램을 작성 중입니다. 서버가 작동하는 동안 항상 활성 상태를 유지해야합니다. 청취 스레드가 을 연결하면 요청을 연결하고 CONTROL 소켓을 열고 제어 스레드를 새로 시작합니다. 이 스레드는 서버와 클라이언트간에 제어 데이터를 보내고 서버와 모든 백그라운드 소프트웨어를 특정 클라이언트 데이터로 초기화하고 데이터 처리를 시작하는 데 사용됩니다.

제어 소켓을 통한 초기화가 성공하면 제어 스레드는 새로운 소켓 인 DATA 소켓을 열어 서버에서 클라이언트로 데이터를 전달합니다. 또한이 새로운 DATA 소켓으로 보내는 두 개의 새 스레드와 CONTROL 소켓에서 수신중인 다른 스레드를 시작하여 클라이언트가 연결을 종료하려고 할 때까지 기다립니다.

클라이언트가 연결을 닫습니다 비정상적으로, 서버 메시지를 보내는 함수를 호출하지 않고 응용 프로그램을 종료하여 연결을 종료 할 때, 여기에서 발생해야하는 것입니다 :

  • 는 실행의 스레드의 상관이 이벤트를 감지 할 수 있습니다 . 그들은 DATA/CONTROL 소켓에서 송수신하는 동안 어떤 종류의 에러 (WSAECONNRESET)를 받게 될 것이고, 서버 리스닝 스레드를 제외하고는 실행을 멈춰야하는 다른 모든 스레드에 신호를 보내야한다.

이러한 유형의 동작을 달성하는 가장 자연스러운 방법은 무엇입니까?

를 사용하여 멀티 스레드 윈속 서버를 작성하는 경우, 당신은에보고해야한다

+1

많은 스레드를 사용하고있는 것 같습니다. – Steve

+0

이것이 어떻게 우아하게 변경 될지에 대한 건설적인 의견을 환영합니다. 이것은 내 첫 번째 멀티 스레드 응용 프로그램이며 이러한 종류의 문제를 처리하는 일반적인 방법에 익숙하지 않습니다.원래 아이디어의 개선에 대한 아이디어를 게시 하시겠습니까? 서버가 데이터와 제어 소켓을 통해 동시에 전송할 수 있어야합니다. 이것을 2 개의 쓰레드로 분리하지 않으면 어떻게 할 수 있습니까? 또한 recv 및 send 함수는 블로킹 동작을 exibit합니다. 그래서이 것을 두 개의 스레드 (하나는 수신, 다른 하나는 소켓으로 보내는)로 분리하기로 결정한 것입니다. – construKction

+0

@construKction : WSAWaitForMultipleEvents를 참조하십시오. 'recv'는 당신이 이미 "data available"이벤트를 기다리고 있다면 블로킹하지 않습니다. – MSalters

답변

0

(I 스레딩에 대한 윈속 (winsock2.h) 네트워킹 및 표준 Windows API (WINDOWS.H)를 사용하고 있습니다) 입출력 완료 포트. IO 완료 포트를 사용하는 것은 Windows 플랫폼에 네트워크 서비스를 작성하는 가장 확장 가능한 방법입니다.

IO 완료 포트 기반 winsock 서버는 비동기 통신을 사용하므로 소켓에서 차단하는 대신 재미있는 일이 발생하면 스레드 풀이 완료 패킷을받습니다.

어쨌든 WSARecv을 사용하게됩니다. WSARecv가 0이 아닌 값을 반환하면 WSAGetLastError()으로 호출하십시오. 당신이 WSA_IO_PENDING가없는 경우, 오류에 전환을 위해 보는 winsock error code에 관심이있어.

윈속 오류 코드 WSA_OPERATION_ABORTED는 소켓이 닫힌 것을 나타냅니다, 다른 사람이 있지만 (예를 들어 WSAECONNABORTED을).

제목 (예 : C/C++을 통한 Windows)에 좋은 텍스트가 좋습니다.

0

WSAEventSelect() 함수를 사용하여 이벤트 객체를 socket과 연결하고 이벤트에 대한 하나의 이벤트 객체를 만든 다음 WaitForMultipleObjects() 함수에서 이러한 이벤트 객체를 사용하여 스레드가 소켓 이벤트 및 사용자 정의 이벤트를 기다릴 수 있습니다.

관련 문제