클라이언트는 Windows Mobile 6 디바이스에 있고 C++로 작성된 클라이언트-서버 앱이 있으며 서버는 전체 Windows에 있고 C#으로 작성되어 있습니다.
원래는 클라이언트에서 서버로 메시지를 보내는 데만 필요했고 서버는 메시지를 받았다는 확인만 보냈습니다. 이제 서버가 실제로 클라이언트에게 데이터를 요청하는 메시지를 보낼 수 있도록 업데이트하고 싶습니다. 현재 클라이언트가 서버에 데이터를 보낸 후에만 수신 모드에 있도록 설정되어 있기 때문에 서버가 언제든지 요청을 보낼 수 없습니다. 클라이언트 데이터를 기다려야 합니다. 제 첫 번째 생각은 서버가 이미 클라이언트에 대해 가지고있는 것처럼 서버 요청을 수신하는 별도의 열린 소켓이있는 클라이언트에 다른 스레드를 만드는 것입니다. 동일한 스레드 내에서 동일한 소켓을 사용하여 모든 서버에 언제든지 요청을 보낼 수 있는 방법이 있나요?
WaitForMultipleObjects()`와 같은 것을 사용하여 수신 버퍼와 전송할 데이터가 있음을 알려주는 이벤트를 전달할 수 있습니까?
클라이언트가 원할 때 언제든지 나갔다 들어올 수 있는 클라이언트-서버 모델로 애플리케이션을 작성해야 할 때(모바일 기기를 사용하는 여러분의 애플리케이션도 마찬가지일 것입니다), 저는 클라이언트가 서버에 온라인 메시지를 전송하여 연결되었고 필요한 작업을 수행할 준비가 되었음을 알리도록 했습니다.
그 때 서버는 동일한 열린 연결을 통해 클라이언트에 메시지를 다시 보낼 수 있습니다.
또한, 이것이 귀하에게 해당되는지는 모르겠지만, 클라이언트가 서버에 전송하는 일종의 하트 비트 가있어 서버가 여전히 온라인 상태임을 알립니다. 이렇게 하면 서버가 클라이언트가 네트워크에서 강제로 연결이 끊어진 시점을 알고 해당 클라이언트를 다시 오프라인으로 표시할 수 있습니다.
비동기식 통신을 통해 충분히 가능한 단일 스레드!
반응자 패턴 디자인 패턴 좁히어 것은 일반적인 네트워크 소프트웨어 개발 () 이라고 한다 ([이걸봐 책] [1]). 잘 알려진 library) 은 네트워크 구축 시 이 패턴 ([여바바 dell. 에이스] [2]).
간단히 말하면, 당신은 당신의 모든 객체를 문제가 등록한 소켓 인사이드라면 뭔가 기다립니다. 만약 무슨 일이 (새로운 데이터 연결, 닫으십시오 도착했다.) 이 원자로가 알려줍니다. 물론, 소켓 비동기식으로 데이터를 주고 수신되었습니다 하나만 사용할 수 있습니다.
[1]: http://www.amazon.fr/pattern-oriented-software-architecture-concurrent-networked/dp/ sr_1_9? 키드 = 0471606952, 1218980593, s = english-books& utf8& /ref = ie = sr = 1-9 &. [2]: http://www.cs.wustl.edu/ ~ schmidt/ACE.html
비동기 비트를 C#으로 서버에 추가할지, 아니면 C++로 클라이언트에 추가할지 명확하지 않습니다.
C++로 이 작업을 수행하는 경우, 데스크톱 Windows 플랫폼은 중복 I/O를 사용하는 API를 통해 소켓 I/O를 비동기적으로 수행할 수 있습니다. 소켓의 경우 WSASend, WSARecv는 모두 비동기 I/O를 허용합니다(I/O가 완료될 때 설정되는 이벤트로 채울 수 있는 LPOVERLAPPED 매개변수에 대한 설명서를 참조하세요).
Windows Mobile 플랫폼에서 이러한 기능을 지원하는지 여부는 알 수 없으므로 추가 조사를 해야 할 수도 있습니다.