27

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

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

你可以使用一些东西来WaitForMultipleObjects()传递一个接收缓冲区和一个告诉它有数据要发送的事件吗?

4

4 回答 4

9

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

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

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

于 2008-08-04T14:30:12.223 回答
8

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

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

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

于 2008-08-17T13:53:04.733 回答
4

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

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

我不知道 Windows Mobile 平台是否支持这些功能,因此您可能需要进行一些额外的挖掘。

于 2008-08-05T05:30:41.297 回答
4

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

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

于 2008-08-11T10:00:06.437 回答