用WINSOCKET写了一个FTP被动模式的客户端,传文件很正常,也可以传过来,但是当客户端新开的一个SOCKET向服务端指定的端口发送文件结束后,怎么知道被动模式下这个文件已经发送完毕呢?按照书上的说法,当发送完毕后(服务端接受到指定长度的数据),服务端会从21端口回传一个226确认信息。但是我每次运行之后用RECV进行接收,一直等不到这个226信息(文件已经传输完毕了,服务端这边已经可以看到并且打开),是不是应该用其他的API来接受这个226信息?或者要客户端发一条信息过去查询?
服务端用的是SERV-U,从服务端的日志里看服务端的状态一直处于文件接受中的状态。
[20] Sat 28May11 23:17:25 - (000054) STOR 123.pptx
[11] Sat 28May11 23:17:25 - (000054) 正在接收文件 "D:\Test\X992083\123.pptx"
[21] Sat 28May11 23:17:25 - (000054) 150 Opening BINARY mode data connection for 123.pptx.
[11] Sat 28May11 23:17:35 - (000054) 接收文件 "D:\Test\X992083\123.pptx" 时发生错误,中断操作 (638,497 字节)//人手关闭客户端进程
[02] Sat 28May11 23:17:35 - (000054) 会话已关闭
[02] Sat 28May11 23:17:35 - (000054) 用户 "EE3650" 已注销
谢谢了 !

解决方案 »

  1.   

    FTP有两条通道,一个是命令状态通道(就是发送FTP指令,接收状态的),另外一个是数据通道(被动模式指定的IP与端口,用于上传和下载数据),数据传输完毕后,会在命令状态通道接收到对应的状态码和详细信息。
      

  2.   

    奇怪,但是我确实是在对命令状态通道执行RECV,可是一直监听不到,服务端也没有显示有发送那一条状态号。。
      

  3.   

    STOR是客户端发给服务端,对上传来说,客户端是知道将要上传的文件大小的,上传完数据后客户端先断开数据通道,再接收服务端返回的状态就可以了。
      

  4.   

    send不是有一个返回值的吗?定义一个len每次发送时把发送的长度加一下在来个判断不就得了!!!!!