c# -在同一个开放套接字上异步多方向服务器客户端通信?

Translate

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

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

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

This question and all comments follow the "Attribution Required."

所有的回答

Translate

当我需要使用客户端-服务器模型编写应用程序时,客户端可以随时离开并进入(如果您使用移动设备时,您的应用程序也是如此),我可以确保客户端发送线上消息发送到服务器,表明它们已连接并准备执行所需的操作。

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

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

来源
Translate

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

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

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

来源
Translate

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

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

我不知道Windows Mobile平台是否支持这些功能,因此您可能必须进行一些其他挖掘。

来源
roo
Translate

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

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

来源