当 .NET Framework 1.0 发布时,没有适用于 .NET 的良好 FTP 客户端实现,所以我使用 System.Net.Socket 编写了自己的实现。最近我不得不对其进行一些更改,在调试时我注意到关闭连接时我正在针对 (WinXP SP 2) 测试的 IIS 5.1 FTP 服务器的输出出现乱码。
通信是这样的:
Send: QUIT<CRLF>
Receive: 221<CRLF><NUL>?<ETX><NUL>
(socket closed)
FTP 命令 channel 处理程序是面向行的,使用 CRLF 作为终止符,在接收到第一个 CRLF 之后的四个字节后,它会等待第二个 CRLF,从而导致超时错误。整个序列由单个套接字读取操作返回,我已验证从套接字返回的字节数是正确的。
此字节序列与此服务器一致,我想知道这是否可以预料/可以避免,或者我是否应该简单地“快速修复”它,将其添加到我的“MS FTP 服务器怪癖”列表中。
最佳答案
虽然不理想,但看起来 FTP 服务器返回了正确的响应,只是后面出现了意想不到的内容。如果我正在设计这个类,我会让它保留一个未报告文本的缓冲区(你可能已经有了,以防你在一次阅读中阅读的内容少于整行),并且当函数被调用以返回一行文本,让它去掉并返回 CRLF 之前的内容,剩下的留给下一个函数——只有在没有完整的行要返回时才让它等待更多。
那应该可以解决上面的情况。您的函数足以返回“221”,调用者会将其解释为成功,并且调用者不会要求更多,这将阻止最后的等待。
或者,或者另外:如果该函数可以检测到套接字的关闭(因为您的帖子让它看起来像是在发送响应后来自远程站点),它也可以在这种情况下阻止等待。
关于c# - 从 IIS 5.1 FTP 服务器返回意外的字节序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1900585/