2011-01-13 4 views
3

내가 쓰고있는 네트워크 라이브러리는 TCP 소켓을 통해 메시지를 보내고받을 필요가있다. 메시지는 언제든지 전송 또는 수신 될 수 있습니다. 즉 전이중 채널로 작동해야합니다.단일 스레드로 TCP를 통해 전이중 채널을 구현하는 방법은 무엇입니까?

두 개의 스레드를 사용하여 이러한 시나리오를 구현할 수있었습니다. 주 스레드 호출 send()와 주로 recv() 호출시 차단 된 전용 스레드입니다.

제 질문은 : 단일 스레드로 동일한 시나리오를 구현할 수 있습니까? 나는. 일부 콜백 함수를 등록하여?

사이드 노트 :이 시나리오는 C++, Java 및 Python으로 구현해야합니다.

답변

4

예, 가능합니다. 다중화 된 I/O를 허용하는 API를 사용해야합니다. C/C++ 및 Python에서는 select() 및 non-blocking I/O를 사용할 수 있으므로 차단하는 유일한 네트워킹 호출은 select()입니다. 또한 poll()과 epoll()과 효율성 및 이식성의 정도가 다른 동일한 것을 수행하는 여러 가지 유사한 API가 있습니다. 자바도 non-blocking I/O APIs 있습니다.

또 다른 가능성은 OS에 I/O 트랜잭션을 시작하도록 알리는 비동기 I/O를 사용하고 작업을 마쳤을 때 (어떤 메커니즘을 통해) 사용자에게 알리는 것입니다. 그러나 네트워크 프로그래밍 스타일에 익숙하지 않아 자세한 내용은 제공하지 않겠습니다.

0

일반적으로 라이브러리는 응용 프로그램의 주 루프/이벤트 루프에 인터페이스를 제공하여이를 수행합니다.

예를 들어, 대부분의 단일 스레드 네트워크 사용 응용 프로그램에는 select(), poll() 또는 그와 유사한 블록이있는 메인 루프가 있습니다. 라이브러리는 응용 프로그램이 포함해야하는 파일 설명자를 select()/poll() 호출로 반환하고 응용 프로그램이 해당 파일 설명자가 읽을 수있을 때 호출해야하는 콜백 함수를 반환합니다.

관련 문제