1

我正在尝试执行一些非常基本的网络操作,但我遇到了一些麻烦。

最初,我试图用来NetworkStream.Length创建一个新的byte[],但很明显这是不可能的,因为NetworkStream它不支持查找操作。

然后我找到了一些示例,展示了如何将 复制NetworkStream到 a MemoryStream,这允许查找操作。到现在为止还挺好。

或者是吗?

一旦using语句的范围受到影响,应用程序就会停止。它仍在运行,在做某事,但我真的不知道是什么。这是代码:

    void HandleClientComm(object client)
    {
        TcpClient tcpClient = (TcpClient)client;

        //copy client stream to memory stream to allow seek operations
        MemoryStream clientStream = new MemoryStream();
        using (var clientRequestStream = tcpClient.GetStream())
        {
            clientRequestStream.CopyTo(clientStream);
        }

        //...
    }

所以这就是我的问题让我完全难过的地方。我需要将我的复制NetworkStream到 aMemoryStream以进行一些处理,但事实证明,仅此一项任务就比它应该做的要困难得多。

有没有人遇到过这个问题?

4

1 回答 1

3

TCP 流通常不会终止- 即入站流在技术上是活动的,直到套接字被破坏(或至少:套接字的另一端选择关闭其出站链接,可能保持其入站链接打开以获取回复) .

现在:CopyTo将要读取到流的末尾。一条没有尽头的溪流。的行为Read是:

  • 阻塞直到至少有一个字节可用...
  • 或直到流关闭...
  • 或直到超时

如果未启用超时,并且套接字永远不会关闭,那么:繁荣。

出于这个原因,套接字代码通常需要在“框架”方面非常小心 - 即知道要作为一个单元读取多少数据。这通常是通过数据流中的某种形式的长度前缀来完成的,即“下一条消息是 27 个字节” - 然后你知道只尝试再读取 27 个字节,因为读取第 28 个字节可能会永远阻止你。在基于文本的协议中,这通常使用诸如换行之类的标记值来完成。

于 2013-10-11T22:38:44.737 回答