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

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

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

===============>>#1 票数:8 已采纳

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

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

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

===============>>#2 票数:7

在单线程中完全可以使用异步通信!

网络软件开发中有一种常见的设计模式叫做reactor模式( 看看这本书 )。 一些众所周知的网络库提供了这种模式的实现( 看看ACE )。

简而言之,反应堆是一个物体,你在里面注册所有的插座,然后等待一些东西。 如果发生了某些事情(新数据到达,连接关闭......),反应堆将通知您。 当然,您只能使用一个套接字异步发送和接收数据。

===============>>#3 票数:3

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

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

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

===============>>#4 票数:3

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

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

  ask by Adam Haile translate from so

未解决问题?本站智能推荐:

关注微信公众号