2

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

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

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

这是我在使用端口 21 通过 Internet 连接的不同机器上运行这两个程序实例时。当我在同一台机器上运行这两个实例时,接收到整个 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();
    }


}
4

2 回答 2

0

您使用的是哪个端口?有代理服务器吗?

具体来说,如果您使用端口 21 (FTP),则某些代理服务器会对被动 FTP 进行特殊处理。我相信这需要代理来扫描流量 - 所以特别是如果命令无效,那么你会看到代理关闭套接字连接。

解决方法是......使用不同的端口。

于 2011-12-29T12:03:00.653 回答
0

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

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

于 2011-12-28T14:25:28.860 回答