c# - NetworkStream 如何在两个方向上工作?

标签 c# packet tcplistener netstream

我读过一个 Tcp Echo Server 的例子,有些事情我不清楚。

TcpClient client = null;
NetworkStream netStream = null;

try {
  client = listener.AcceptTcpClient(); 
  netStream = client.GetStream();

  int totalBytesEchoed = 0;
  while ((bytesRcvd = netStream.Read(rcvBuffer, 0, rcvBuffer.Length)) > 0) {
    netStream.Write(rcvBuffer, 0, bytesRcvd);
    totalBytesEchoed += bytesRcvd;
  }

  netStream.Close();
  client.Close();
} catch {
  netStream.Close();
}

当服务器收到一个数据包(while 循环)时,他将数据读入 rcvBuffer 并将其写入流中。

令我困惑的是通信中消息的时间顺序。使用 netStream.Write() 写入的数据是立即发送到客户端(甚至可能仍在发送),还是仅在已写入流的数据(由客户端)处理后发送。

下面的问题甚至可以澄清前面的问题:如果客户端通过写入流发送一些数据,该数据是否已移动到服务器端的消息队列中等待读取,因此该流实际上是“空的”?这将解释为什么服务器可以立即写入流 - 因为来自流的数据实际上是在其他地方缓冲的......?

最佳答案

TCP 连接原则上是全双工的。因此,您正在处理 2 个独立的 channel ,是的,双方可能同时进行写作。

关于c# - NetworkStream 如何在两个方向上工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1611582/

相关文章:

c# - 如何在 JavaScript 中调用 Web.api 序列化数组

c# - 如何从 byte[] 数组转换为 html?

c# - 通常只允许每个套接字地址(协议(protocol)/网络地址/端口)使用一次?

c# - 我的 .NET tcp 服务器应用程序将随机使用 100% CPU

C# Marshal.Copy Intptr 到 16 位托管无符号整数数组

c# - 设置 WM_KEYDOWN lParam 参数

c - Perf Profiler 报告过度使用 "do_syscall_64"

networking - Netmap/PF_RING 和 TCP 分段卸载和大型接收卸载

c++ - Windows网络包修改

c# - 异步 CTP AcceptTcpClientAsync 方法