socket编程:FTP协议客户端 CAsynSocket类的问题
老师要求用CAsynSocket类写一个ftp的客户端。我直接调用CAsynSocket类的connect函数建立控制连接。然后在onconnect函数中,使用send(...
老师要求用CAsynSocket类写一个ftp的客户端。我直接调用CAsynSocket类的connect函数建立控制连接。然后在onconnect函数中,使用send()函数,发送用户名,密码,模式等状态信息,根据FTP协议,以上都会返回响应信息。发送完以上认证信息后,当客户端再发送命令PASV建立数据连接时,服务器,会返回:227 Entering Passive Mode (127,0,0,1,246,144).,这是有用的响应需要用246,144来建立数据连接。
问题是我用onreceive函数,由于send()的执行速度比onreceive函数要快的多,send()4次最后只响应了一次onreceive,结果用receive把全部响应数据都接收回来了:
220 Microsoft FTP Service //连接建立
331 Anonymous access allowed, send identity (e-mail name) as password. //用户名
230 User logged in. //密码
227 Entering Passive Mode (127,0,0,1,246,144). //PASV
这样我无法从里面提取数据连接的端口号信息呀。。。。
我知道CAsynSocket类是非阻塞。但能不能通过方法,使得每发送一次,onreceive就响应一次,或者用什么方法可以获取到最后一次响应数据里面的端口信息。或者其他建立数据连接的方法也可以。 展开
问题是我用onreceive函数,由于send()的执行速度比onreceive函数要快的多,send()4次最后只响应了一次onreceive,结果用receive把全部响应数据都接收回来了:
220 Microsoft FTP Service //连接建立
331 Anonymous access allowed, send identity (e-mail name) as password. //用户名
230 User logged in. //密码
227 Entering Passive Mode (127,0,0,1,246,144). //PASV
这样我无法从里面提取数据连接的端口号信息呀。。。。
我知道CAsynSocket类是非阻塞。但能不能通过方法,使得每发送一次,onreceive就响应一次,或者用什么方法可以获取到最后一次响应数据里面的端口信息。或者其他建立数据连接的方法也可以。 展开
展开全部
我之前写过一个示例的FTP服务器。FTP协议和HTTP协议一样,都是属于一问一答的,当你的命令连接与FTP服务器连接后,就要等待响应服务器的欢迎信息 220, 然后再发送请求进行登陆,发送完后不要再发送其他命令了,一定要等刚刚的请求响应完成。所以你不要一次性把4个命令全部发送过去。一定要保证一问一答。
追问
有点明白了,不过怎么能实现一问一答,用的是CAsynSocket这个类,非阻塞的。
追答
你需要自己控制状态,做各种状态转换图。比如登录过程的状态会像这样:
0状态为初始状态
0状态下与服务器建立连接,进入1状态
1状态收到220后变成2状态(2状态可以设置为就绪状态,可以发送其他的命令,也是其他命令的初始状态),在实现上可以参考设计模式的状态模式。
当然,也不一定要做得这么复杂,自己用点技巧就可以了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |