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

27

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

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

您能否使用类似于WaitForMultipleObjects()的东西,并将其传递给接收缓冲区和告诉它有数据要发送的事件?

4个回答

9
当我需要编写一个具有客户端-服务器模型的应用程序,其中客户端可以随时离开和进入(我假设您的应用程序也是如此,因为您使用移动设备),我确保客户端向服务器发送一个“在线”消息,表示它们已连接并准备好执行所需的操作。
那时,服务器可以通过同一开放的连接向客户端发送消息。
此外,但我不知道是否适用于您,我还设置了某种心跳,客户端向服务器发送该心跳,让服务器知道它仍然在线。这样,服务器就知道何时强制将客户端从网络中断开,并可以将该客户端标记为离线。

8

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

在网络软件开发中,有一种常见的设计模式叫做反应器模式(请看这本书)。一些知名的网络库提供了该模式的实现(请看ACE)。

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


4

我不确定您是想在C#服务器端还是C++客户端中添加异步部分。

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

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


4

请查看asio。它是一个跨平台的C++库,用于异步IO操作。我不确定它是否对服务器有用(我从未尝试将标准C++ DLL链接到C#项目中),但对客户端来说很有用。

我们在应用程序中使用它,它解决了我们大部分IO并发问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接