【问题标题】:What happens when we do networkstream.write()?当我们执行 networkstream.write() 时会发生什么?
【发布时间】:2016-04-04 11:26:32
【问题描述】:

我有 2 个程序。 1 个服务器和 1 个客户端。

在客户端是这样的:

while(statement)
{
    networkstream.write(data);
}

在服务器中是这样的:

while(statement)
{
    while(statement)
    {
        ReceiveData;
    }

    Do other stuff;
}

因此,虽然客户端可以非常快速地写入网络流,但服务器仍然需要处理数据才能读取更多数据。

例如,当客户端已经完成 4 圈包含写入的循环,而服务器仍然只读取 1 次时会发生什么。

有没有办法让客户知道他什么时候可以再写一次? 当客户制作几个'.write'时会发生什么?服务器是否将它们全部保留并全部读取,或者已发送的数据是否被覆盖?

希望你能理解我的问题。如果您愿意,可以编辑问题标题。

【问题讨论】:

  • networkstream.Write 是同步的。它一直等到数据发送完毕。 networkstream.WriteAsync 不是。你用哪一个?两者都有机制来确保足够的写入/读取
  • 现在我有这样的:networkstream.Write(SendingBuffer, 0, currentPacketLength);
  • 这些是一些非常简单的 TCP 问题。你可以问一百个关于 SO 的问题,但也许查看一些 TCP 介绍文章或一本书会更快? :)

标签: c# networking networkstream


【解决方案1】:

在您的.write 和实际电线之间有一整叠层。这些层做了各种各样的事情,从纠错到确保您的网络流量不会与其他流量发生冲突等;至少,它们为您提供缓冲和阻塞(如果您发送太多或 - 在接收端 - 还没有数据)。

要回答您的问题,沿线某处将是一个缓冲区(一块内存),您的字节将写入其中。直到它们被发送到沿途的下一站,它将阻塞(等待/挂起......)。这些调用将沿着堆栈向下传递,在接收端向上传递,然后从另一侧向下传递,然后再次向上传递。因此,当您的write 返回时,您可以合理地确定一切都很好,除非您返回错误代码、异常或者您的错误处理工作正常。

如果服务器在处理您的请求时速度很慢,它不会像您希望的那样快速到达read,因此您和它们之间的缓冲区将被填满,此时写入停止。

在不同的层上也有很多不同的缓冲区,完整的答案会非常复杂。 https://en.wikipedia.org/wiki/OSI_model

【讨论】:

    猜你喜欢
    • 2013-04-18
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 2011-04-17
    相关资源
    最近更新 更多