2008-08-04 50 views
20

我有一个客户端 - 服务器应用程序,客户端位于Windows Mobile 6设备上,用C++编写,服务器位于完整Windows上,并用C#编写。通过相同的开放套接字进行异步多方向服务器 - 客户端通信?

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

你能用WaitForMultipleObjects()的影响,并传递一个接收缓冲区和一个事件,告诉它有数据要发送?

回答

7

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

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

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

3

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

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

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

3

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

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

7

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

网络软件开发中有一种常见的设计模式,称为反应堆模式(look at this book)。一些众所周知的网络库提供了这种模式的实现(look at ACE)。

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