VB.NET自定义FTP服务器NLST命令单次仅返回单个条目问题求助
问题:VB.NET开发的FTP守护进程NLST命令仅返回单个文件/文件夹条目
我正在使用VB.NET开发FTP守护进程,当客户端发送NLST命令获取指定路径下的文件或文件夹时,程序每次仅返回单个文件/文件夹名称,需多次执行ls命令才能获取全部内容。注:CMD中执行ls会自动转换为NLST命令,此为正常情况,但单次返回单个条目的问题亟待解决。
现有实现代码
Case "NLST" Dim str As New StringBuilder() Dim di = New DirectoryInfo(work_dir) For Each file In di.EnumerateFileSystemInfos() str.Append(file.Name).Append(Environment.NewLine) Next SendResponse(writer, str.ToString().TrimEnd)
问题排查与修复方案
1. 协议格式不规范
NLST命令的响应必须严格遵循FTP协议流程:
- 先通过控制连接发送
150 Opening ASCII mode data connection for file list状态码 - 在数据连接中传输所有文件名(每个名称占一行)
- 最后发送
226 Transfer complete结束状态码
你的代码可能直接将列表内容发送到控制连接,导致客户端无法完整接收数据。
2. 换行符与发送方式问题
FTP协议要求换行符为\r\n(即VB.NET中的vbCrLf),而非系统默认的Environment.NewLine;同时列表内容必须通过数据连接传输,而非控制连接。修改代码如下:
Case "NLST" Dim str As New StringBuilder() Dim di = New DirectoryInfo(work_dir) For Each file In di.EnumerateFileSystemInfos() str.Append(file.Name).Append(vbCrLf) ' 使用标准FTP换行符 Next ' 按协议流程发送响应 SendResponse(writer, "150 Opening ASCII mode data connection for file list") ' 通过数据连接发送文件列表(需确保数据连接已正确建立) SendDataOverDataConnection(str.ToString().TrimEnd(vbCrLf.ToCharArray())) SendResponse(writer, "226 Transfer complete")
3. 检查SendResponse方法实现
确认SendResponse是否存在输出截断问题,比如限制单次发送字节数、未正确处理字符串编码转换,导致部分内容未被客户端接收。
内容的提问来源于stack exchange,提问作者Necro PC
相关产品推荐
相关产品推荐

