2014-02-05 5 views
2

TCP 기반 서버 (C 언어) 구현 방법을 검토 중입니다. 서버는 클라이언트와의 연결을 수락하고 클라이언트로부터 명령을 수신 한 다음 응답을 보냅니다. 아주 간단한 것들 - 그러나 명령의 처리는 시스템의 다른 스레드에 의해 수행되어야하며, 이는 믹스에 대해 약간의 동시성을 가져옵니다.소켓 보내기/받기 용 별도 스레드?

그래서 비 블로킹 소켓과 select()를 사용하거나 블로킹 소켓과 두 개의 별도의 comms 스레드 (하나는 송신 용, 하나는 수신 용)를 사용하여 모든 TCP 통신을 하나의 스레드에서 처리할지 여부를 결정하려고합니다. .

후자에 대한 우려는 소켓 동기화를 처리하는 것입니다. 송신 스레드에서 소켓을 닫으면 수신 스레드에서 어떤 일이 발생합니까 (또는 그 반대) .. 어떻게 처리하고 올바른 방식으로 정리할 것인가? .

조언을 주시면 감사하겠습니다.

답변

3

클라이언트에 별도의 수신 및 송신 스레드가 필요하지 않습니다. 클라이언트가 승인되면 (특히 명령/응답 프로토콜을 구현할 때) 수신 및 송신 모두 해당 클라이언트에 대한 모든 I/O를 처리하는 하나의 스레드를 작성하십시오. 그러나 별도의 스레드를 사용하도록 선택하면 한 스레드에서 소켓을 닫으면 같은 소켓을 사용하는 다른 스레드에서 감지 할 수없는 오류가 발생합니다. 소켓 오류가 발생할 때 각 스레드를 종료 한 다음 소켓을 닫을 책임이있는 스레드를 결정하십시오.

그러나 많은 수의 동시 클라이언트를 처리해야하는 경우 스레딩이 최선의 선택이 아닙니다. 비 차단 소켓을 사용하는 비동기 I/O (또는 Windows에서 I/O 완료 포트 사용)는 스레드 수가 적기 때문에 더 좋습니다.