繁体   English   中英

通过同一个开放套接字进行异步多向服务器-客户端通信?

[英]Asynchronous multi-direction server-client communication over the same open socket?

我有一个客户端 - 服务器应用程序,其中客户端在 Windows Mobile 6 设备上,用 C++ 编写,服务器在完整的 Windows 上,用 C# 编写。

最初,我只需要它从客户端向服务器发送消息,服务器只发回它收到消息的确认。 现在,我想更新它,以便服务器可以实际向客户端发送消息以请求数据。 由于我目前设置了它,因此客户端仅在向服务器发送数据后才处于接收模式,这不允许服务器随时发送请求。 我将不得不等待客户数据。 我的第一个想法是在客户端上创建另一个具有单独打开套接字的线程,侦听服务器请求……就像服务器已经对客户端进行了处理一样。 有没有办法,在同一个线程内,使用同一个套接字,随时向所有服务器发送请求?

你能用一些东西来实现WaitForMultipleObjects()的效果,并传递给它一个接收缓冲区和一个告诉它有数据要发送的事件吗?

当我需要使用客户端 - 服务器模型编写一个应用程序时,客户端可以随时离开和进入(我假设您使用移动设备时的应用程序也是这种情况)我确保客户端发送在线消息到服务器,表明他们已连接并准备好做任何他们需要做的事情。

那时服务器可以通过相同的开放连接将消息发送回客户端。

另外,但我不知道这是否适用于您,我将客户端发送到服务器的某种心跳,让它知道它仍然在线。 这样服务器就知道客户端何时被强行与网络断开连接,并且可以将该客户端标记为离线。

在单线程中使用异步通信是完全可能的!

网络软件开发中有一种常见的设计模式称为反应器模式( 参阅本书)。 一些著名的网络库提供了这种模式的实现(看看 ACE )。

简而言之,反应器是一个对象,您将所有套接字注册到其中,然后等待某些事情。 如果发生了某些事情(新数据到达,连接关闭...),反应器会通知您。 当然,您可以只使用一个套接字异步发送和接收数据。

我不清楚您是否想将异步位添加到 C# 中的服务器或 C++ 中的客户端。

如果您正在谈论在 C++ 中执行此操作,桌面 Windows 平台可以通过使用重叠 I/O 的 API 异步执行套接字 I/O。 对于套接字,WSASend、WSARecv 都允许异步 I/O(阅读有关其 LPOVERLAPPED 参数的文档,您可以使用 I/O 完成时设置的事件填充这些参数)。

我不知道 Windows Mobile 平台是否支持这些功能,所以你可能需要做一些额外的挖掘。

查看asio 它是一个用于异步 IO 的交叉兼容 C++ 库。 我不确定这对服务器是否有用(我从未尝试将标准的 c++ DLL 链接到 ac# 项目),但对于客户端它会很有用。

我们将它与我们的应用程序一起使用,它解决了我们的大部分 IO 并发问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM