동일한 개방형 소켓을 통한 비동기 다방향 서버-클라이언트 통신?
문제
클라이언트가 Windows Mobile 6 장치에 있고 C++로 작성되었으며 서버가 전체 Windows에 있고 C#으로 작성된 클라이언트-서버 앱이 있습니다.
원래는 클라이언트에서 서버로 메시지를 보내는 데만 필요했고, 서버는 메시지를 받았다는 확인 메시지만 다시 보냈습니다.이제 서버가 실제로 데이터를 요청하기 위해 클라이언트에 메시지를 보낼 수 있도록 업데이트하고 싶습니다.현재 클라이언트가 서버에 데이터를 보낸 후에만 수신 모드에 있도록 설정했기 때문에 서버가 언제든지 요청을 보내는 것을 허용하지 않습니다.클라이언트 데이터를 기다려야 합니다.내 첫 번째 생각은 서버 요청을 수신하는 별도의 개방형 소켓을 사용하여 클라이언트에 또 다른 스레드를 생성하는 것입니다. 서버가 이미 클라이언트를 존중하는 것처럼 말입니다.동일한 스레드 내에서 동일한 소켓을 사용하여 언제든지 모든 서버에 요청을 보낼 수 있는 방법이 있습니까?
당신은 효과에 뭔가를 사용할 수 있습니까? WaitForMultipleObjects()
수신 버퍼와 전송할 데이터가 있음을 알려주는 이벤트를 전달합니까?
해결책
클라이언트가 원할 때마다 떠나고 들어갈 수 있는 클라이언트-서버 모델로 애플리케이션을 작성해야 할 때(모바일 장치를 사용하는 애플리케이션에도 해당된다고 가정합니다) 클라이언트가 온라인 서버에 메시지를 보내 연결되어 필요한 모든 작업을 수행할 준비가 되었음을 나타냅니다.
그 때 서버는 동일한 열린 연결을 통해 클라이언트에 다시 메시지를 보낼 수 있습니다.
또한, 하지만 그것이 당신에게 해당되는지는 모르겠습니다. 심장 박동 클라이언트가 서버로 전송되어 아직 온라인 상태임을 알립니다.이렇게 하면 서버는 클라이언트가 네트워크에서 강제로 연결이 끊어진 시기를 알고 해당 클라이언트를 다시 오프라인으로 표시할 수 있습니다.
다른 팁
C#의 서버에 비동기 비트를 추가하려는지 C++의 클라이언트에 추가할지 여부가 확실하지 않습니다.
C++에서 이 작업을 수행하는 것에 대해 이야기하고 있다면 데스크톱 Windows 플랫폼은 중첩된 I/O를 사용하는 API를 통해 비동기적으로 소켓 I/O를 수행할 수 있습니다.소켓의 경우 WSASend, WSARecv는 모두 비동기 I/O를 허용합니다(I/O가 완료될 때 설정되는 이벤트로 채울 수 있는 LPOVERLAPPED 매개변수에 대한 설명서를 참조하세요).
Windows Mobile 플랫폼이 이러한 기능을 지원하는지 모르므로 추가로 조사해야 할 수도 있습니다.
확인해 보세요 아시오.비동기 IO를 위한 교차 호환 가능한 C++ 라이브러리입니다.이것이 서버에 유용할지 확신할 수 없지만(표준 C++ DLL을 C# 프로젝트에 연결하려고 시도한 적이 없습니다) 클라이언트에는 유용할 것입니다.
우리는 이를 애플리케이션과 함께 사용하여 대부분의 IO 동시성 문제를 해결했습니다.