【问题标题】:Asynchronous multi-direction server-client communication over the same open socket?通过同一个开放套接字进行异步多向服务器 - 客户端通信?
【发布时间】:2010-09-05 07:12:17
【问题描述】:

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

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

您可以使用WaitForMultipleObjects() 的效果并传递一个接收缓冲区和一个告诉它有数据要发送的事件吗?

【问题讨论】:

    标签: c# c++ sockets


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        我不知道Windows Mobile平台是否支持这些功能,所以你可能需要做一些额外的挖掘。

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            猜你喜欢
            • 2018-06-30
            • 2012-04-21
            • 1970-01-01
            • 2011-08-14
            • 1970-01-01
            • 2012-08-30
            • 2012-11-02
            • 2014-01-08
            • 1970-01-01
            相关资源
            最近更新 更多