동일한 개방형 소켓을 통한 비동기 다방향 서버-클라이언트 통신?

StackOverflow https://stackoverflow.com/questions/1241

  •  08-06-2019
  •  | 
  •  

문제

클라이언트가 Windows Mobile 6 장치에 있고 C++로 작성되었으며 서버가 전체 Windows에 있고 C#으로 작성된 클라이언트-서버 앱이 있습니다.

원래는 클라이언트에서 서버로 메시지를 보내는 데만 필요했고, 서버는 메시지를 받았다는 확인 메시지만 다시 보냈습니다.이제 서버가 실제로 데이터를 요청하기 위해 클라이언트에 메시지를 보낼 수 있도록 업데이트하고 싶습니다.현재 클라이언트가 서버에 데이터를 보낸 후에만 수신 모드에 있도록 설정했기 때문에 서버가 언제든지 요청을 보내는 것을 허용하지 않습니다.클라이언트 데이터를 기다려야 합니다.내 첫 번째 생각은 서버 요청을 수신하는 별도의 개방형 소켓을 사용하여 클라이언트에 또 다른 스레드를 생성하는 것입니다. 서버가 이미 클라이언트를 존중하는 것처럼 말입니다.동일한 스레드 내에서 동일한 소켓을 사용하여 언제든지 모든 서버에 요청을 보낼 수 있는 방법이 있습니까?

당신은 효과에 뭔가를 사용할 수 있습니까? WaitForMultipleObjects() 수신 버퍼와 전송할 데이터가 있음을 알려주는 이벤트를 전달합니까?

도움이 되었습니까?

해결책

클라이언트가 원할 때마다 떠나고 들어갈 수 있는 클라이언트-서버 모델로 애플리케이션을 작성해야 할 때(모바일 장치를 사용하는 애플리케이션에도 해당된다고 가정합니다) 클라이언트가 온라인 서버에 메시지를 보내 연결되어 필요한 모든 작업을 수행할 준비가 되었음을 나타냅니다.

그 때 서버는 동일한 열린 연결을 통해 클라이언트에 다시 메시지를 보낼 수 있습니다.

또한, 하지만 그것이 당신에게 해당되는지는 모르겠습니다. 심장 박동 클라이언트가 서버로 전송되어 아직 온라인 상태임을 알립니다.이렇게 하면 서버는 클라이언트가 네트워크에서 강제로 연결이 끊어진 시기를 알고 해당 클라이언트를 다시 오프라인으로 표시할 수 있습니다.

다른 팁

비동기 통신을 사용하는 것은 단일 스레드에서 완전히 가능합니다!

네트워크 소프트웨어 개발에는 리액터 패턴(Reactor Pattern)이라는 일반적인 디자인 패턴이 있습니다.이 책 좀 봐).일부 잘 알려진 네트워크 라이브러리는 이 패턴의 구현을 제공합니다(에이스를 봐).

간단히 말해서, 리액터는 객체입니다. 모든 소켓을 내부에 등록하고 무언가를 기다립니다.어떤 일이 발생하면(새 데이터 도착, 연결 종료...) 리액터가 이를 알려줍니다.물론 하나의 소켓만 사용하여 비동기적으로 데이터를 보내고 받을 수도 있습니다.

C#의 서버에 비동기 비트를 추가하려는지 C++의 클라이언트에 추가할지 여부가 확실하지 않습니다.

C++에서 이 작업을 수행하는 것에 대해 이야기하고 있다면 데스크톱 Windows 플랫폼은 중첩된 I/O를 사용하는 API를 통해 비동기적으로 소켓 I/O를 수행할 수 있습니다.소켓의 경우 WSASend, WSARecv는 모두 비동기 I/O를 허용합니다(I/O가 완료될 때 설정되는 이벤트로 채울 수 있는 LPOVERLAPPED 매개변수에 대한 설명서를 참조하세요).

Windows Mobile 플랫폼이 이러한 기능을 지원하는지 모르므로 추가로 조사해야 할 수도 있습니다.

확인해 보세요 아시오.비동기 IO를 위한 교차 호환 가능한 C++ 라이브러리입니다.이것이 서버에 유용할지 확신할 수 없지만(표준 C++ DLL을 C# 프로젝트에 연결하려고 시도한 적이 없습니다) 클라이언트에는 유용할 것입니다.

우리는 이를 애플리케이션과 함께 사용하여 대부분의 IO 동시성 문제를 해결했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top