c# - 端口 21 (FTP) 上的 NetworkStream 在收到值为 10(换行符)的字节时停止读取

标签 c# network-programming newline networkstream linefeed

我有一个程序使用 NetworkStream.Read 和 NetworkStream.Write 发送 88 字节的原始数据(不是字符串)。

第 58 个字节的值恰好为 10(新行)。一旦接收到此字节,接收程序实例流就停止读取,就像 ReadLine 而不是读取原始数据。

场景是一致的,当我将它更改为一次读取 32 个字节时,它读取 32,然后读取 26(总共 58)停止在同一字节。

这是我在使用端口 21 通过互联网连接的不同机器上运行两个程序实例时的情况。当我在同一台机器上运行这两个实例时,整个 88 字节的接收没有问题。

我将使用网络监视器查看 30 个字节丢失的位置,但我想在这里寻求建议或者是否有人遇到过类似问题。

编辑:这是代码:

这是代码。它从一个流中读取数据并将它们以两种方式写入另一个流: `

class ProxyConnection
{        
 private NetworkStream clientStream;
 private NetworkStream serverStream;
 public ProxyConnection()
 {
..            clientStream = tcpClient.GetStream();
            serverStream = tcpServer.GetStream();
..}

 private void RouteFromClientToServer()
 {
   Message message;
   while (true)
   {
     try
     {
       message = ReadMessageFromClient();
       ValidateMessage(message);
       SendMessageToServer(message);
     }
     catch(IOException e)
     {
      Logger.getInstance().log(e.Message);
      break;
     }
    }
}
        private Message ReadMessageFromClient()
        {
            Message message = new Message();
            message.bytes = new byte[MESSAGE_SIZE];
            message.bytesCount = clientStream.Read(message.bytes, 0, MESSAGE_SIZE);
            Logger.getInstance().log("Size ( " + message.bytesCount + " ) From Client");
            return message;
 }



    private void SendMessageToServer(Message message)
    {      
        serverStream.Write(message.bytes, 0, message.bytesCount);
        Logger.getInstance().log("Size ( " + message.bytesCount + " ) To Server");
        serverStream.Flush();
    }


}

最佳答案

TCP 套接字并不特别关心您希望一次发送或接收多少字节。如果数据或空间可用,它将尽可能多地接收或发送。如果没有空间或数据,发送或接收可以阻塞直到它可以做一些事情。但是,如果缓冲区有 10 个字节的空间,而您要发送 50 个字节,那么套接字将愉快地将 10 个字节填充到缓冲区中,并说“已发送 10 个字节。稍后尝试发送其余字节。”同样,如果有 10 个字节可用,而您想要 50 个,则套接字会说“这里是 10 个。凑合直到我有更多。”套接字上的后续接收或发送通常会阻塞,直到有更多数据或空间,然​​后尽可能多地读取或写入当时可用的数据。这就是为什么他们返回他们设法洗牌的数据量的原因。

很可能有一些魔法(比如发送 10 时自动刷新)使处理流上的文本变得更容易,因为这是一个很常见的用例。但是如果你再读一遍,你应该会得到更多的数据。除非读取返回 0 字节——这通常意味着连接已关闭,并且您在关闭/处置之前没有关闭套接字。

关于c# - 端口 21 (FTP) 上的 NetworkStream 在收到值为 10(换行符)的字节时停止读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8656756/

相关文章:

c - 与C网络编程中的套接字相关的问题

python - 使用 python Xpath 删除换行符和空格解析 XML

c++ - 如何在 C++ 中使用正则表达式换行后不捕获空格

python - 在 nestedExpr 中保留换行符

c# - 如何使用 WinAPI 快速逐像素处理图像?

c# - Linq & C# - 将一个类中的不同数据插入到另一个类中

c - "Network programming"示例中的这段代码如何工作?

c# - 应用程序中的 Windows Phone 磁贴

c# - 检查 Task.Run 尚未运行

sockets - 是原始套接字数据报套接字吗?