TcpClient.GetStream()。CopyTo(MemoryStream)是否会停止应用程序的继续?

时间:2013-10-11 22:23:37

标签: c# .net tcp stream

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

最初,我尝试使用NetworkStream.Length创建新的byte[],但很明显这是不可能的,因为NetworkStream不支持搜索操作。

然后我找到了一些示例,展示了如何将NetworkStream复制到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复制到MemoryStream进行一些处理,但仅此一项任务就比应该更加困难。

以前有人遇到过这个问题吗?

1 个答案:

答案 0 :(得分:3)

TCP流通常未终止 - 即入站流在技术上是活动的,直到套接字被破坏(或者至少:套接字的另一端选择关闭其出站链接,也许保持他们的入站链接打开以获得回复。)

现在:CopyTo想要读取流的结束没有结束的流Read的行为是:

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

如果没有启用超时,并且套接字没有关闭,那么:繁荣。

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