【问题标题】:Windows Phone 8 - Keep socket open and receive data of unknown lengthWindows Phone 8 - 保持套接字打开并接收未知长度的数据
【发布时间】:2013-12-23 08:36:18
【问题描述】:

我有一个套接字,我想在其中接收多个未知长度的消息:文本、媒体、..

我看到了它是如何与 Windows.Networking.Sockets 一起工作的,似乎发件人应该先发送长度,这不是我的情况

我在 System.Net.Sockets 中看到了一些改进,但没有发现任何监听数据包接收的事件。

我的问题是:我必须不时检查套接字的数据吗?有没有更好的实现方式?

【问题讨论】:

  • TCP 101:如果没有更高级别的协议,则不能有任何大于一个字节的消息。
  • 您想保存这些数据而不必知道解析它的应用程序规则吗?一种想法是一次从套接字读取一个充满数据的缓冲区,直到发送方关闭 TCP 会话。如果要分离不同类型的数据,则必须研究要支持的各种应用程序,并在收到的数据到达时对其进行解析。然后你就可以知道你是否已经完成了一个工作单元。

标签: c# sockets windows-phone-8 communication tcpclient


【解决方案1】:

Windows Phone 8 方法

使用System.Net.Sockets.SocketReceiveAsync 方法支持异步网络操作。您需要做的就是在进行此调用之前正确配置SocketAsyncEventArgs,并且只有在收到数据时才能引发处理程序。

this MSDN article 中的示例显示了如何同步执行读取操作,但在内部它使用的是异步模式。如果您从代码中删除 ManualResetEvent 部分,则调用将失败,并且该事件只会在数据准备好处理时触发。

桌面/完整的 .NET 方法

使用TcpClient 类而不是Socket,您将能够获得一个实现BeginReadNetworkStream 对象 - 一种异步方法,仅当有新数据要读取时才会调用回调函数(或远程端已关闭)。

  • 注意:BeginRead 的 MSDN 示例已在 EndRead 的页面上完成。将这两个代码 sn-ps 一起用于工作代码。

【讨论】:

  • 谢谢,但是 Windows phone 中没有 TcpClient
  • @NadaNaoushi,我也添加了一个 WP8 答案。
【解决方案2】:

您可以使用 select 函数来跟踪您打开的描述符并接收通过套接字到达的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    • 2013-04-19
    相关资源
    最近更新 更多