端口21 (FTP)上的NetworkStream在接收到值为10(新行字符)的字节时停止读取
本文关键字:字符 新行 字节 读取 上的 FTP NetworkStream 端口 | 更新日期: 2023-09-27 18:19:00
我有一个程序,使用NetworkStream发送88字节的原始数据(不是字符串)。读和网络流写。
字节号58的值恰好是10(新行)。接收程序实例流一旦接收到这个字节,就像ReadLine而不是原始数据的Read一样停止读取。
这种情况是一致的,当我将它更改为一次读取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时自动刷新),使处理流上的文本更容易,因为这是一个常见的用例。但如果你再读一遍,你应该会得到更多的数据。除非read返回0字节——这通常意味着连接已经关闭,并且在关闭/处置套接字之前没有关闭套接字。
您正在使用哪个端口?是否有代理服务器?
具体来说,如果您使用端口21 (FTP),一些代理服务器对被动FTP有特殊情况处理。我认为这需要代理扫描流量-所以,特别是如果命令无效,那么您将看到代理关闭套接字连接。
解决方法是…使用其他端口