需求:
只用SOCKET(不用其他的包括异步套接字等),实现PORT方式建立数据通道,并用LIST命令取得文件列表。
求实现源码示例。在网上搜了好多文章,讲述CSocket、CFTPConnect、....等许多种,CSocket及异步套接字实现的书及示例我都有,现在想用winsock的SOCKET做一个PORT方式的试验,试了好多种方法都不成功,请做过的朋友帮帮忙,我实在找不到了,在网上狂了一个多星期。
先行谢过诸位!
分不够以后再加。
只用SOCKET(不用其他的包括异步套接字等),实现PORT方式建立数据通道,并用LIST命令取得文件列表。
求实现源码示例。在网上搜了好多文章,讲述CSocket、CFTPConnect、....等许多种,CSocket及异步套接字实现的书及示例我都有,现在想用winsock的SOCKET做一个PORT方式的试验,试了好多种方法都不成功,请做过的朋友帮帮忙,我实在找不到了,在网上狂了一个多星期。
先行谢过诸位!
分不够以后再加。
1.本地绑定一个端口,具体是什么端口,自己用getpeername什么的得到.
2.拿到本地IP
3.将IP和端口转换,然后用Port命令发送过去服务器
4.发送LIST命令
这些我都试过了,具体细节实现不了,Port后数据通道的套接字在什么时候accept,因为会阻塞,那么就要用新的线程,新线程中建立的套接字的数据怎么读取,是用指针吗?我在自己的电脑上试验
如果使用的是一个连接处理一个客户方式的话,是不需要再新建一个新的线程处理.我是怀疑你是不是在内网的原因,自己找个flashfxp,设置使用port模式,连上FTP服务器测试就清楚.如果flashfxp也因为你是内网不能成功列出数据,那明显是你自己的环境造成的.
???? 不需要再新建一个新的线程处理??????
当系统执行到accept时 ,应该就是停在那儿了吧,那你怎样发送PORT命令啊?
兄弟,我要求只用winsock的SOCKET........
1.你说在自己电脑上验证,但没说FTP服务器也是你自己本机装呢.
2.你bind()后,得到绑定的端口和本机IP,发送了Port命令再执行accept()呀.
那你的LIST命令又怎么下呢?
其中bind()的问题可以通过close(sock)关掉重来来解决;解决了bind()后listen也就没有问题。
但是accept确好解决,会出错的类型有几个:主要是WSAEINTR(10004L)、WSAEINVAL(10022L).
现在我按下面流程执行:
USER=>PASS=>TYPE=>ACCEPT=>PORT=>LIST=>RECV=>close(SOCK);第一次成功(肯定)
USER=>PASS=>TYPE=>ACCEPT=>PORT=>LIST=>RECV=>close(SOCK);第二次不成功(肯定)
USER=>PASS=>TYPE=>ACCEPT=>PORT=>LIST=>RECV=>close(SOCK);第三次成功
USER=>PASS=>TYPE=>ACCEPT=>PORT=>LIST=>RECV=>close(SOCK);第四次不成功一般隔一次成功一次;
若时间间隔长,可能都能成功;
中间隔一次PASV方式的话,每次都能成功。环境:客户端、服务器都在本机,Serv-U6,XP-SP3,vs2005
这个程序是我的一个试验,就是试验一个同端口(最初的想法还是同一个连接)多次使用的问题。
正如你所说的,端口好象没有释放好,我找了许多关于SOCKET释放的资料,没有找到立即释放的方法。
也许这是一个思路的错误,可能绑定同一个端口的做法是不能成功的。
下一步的试验就是绑定动态端口,设想绑定不成功就根据返回错误信息再重建SOCKET,也就是上面所说的ACCEPT包含的三个步骤。
还请多多指教!
反正用系统可用的端口,在绑定时用0端口,再调用getsockname()得到socket绑定的端口就是.至于端口不能释放,那是你自己代码的问题,已经离题了.
这个贴子只是去讨论"如何建立PORT模式的FTP数据通道".既然数据通道已经能建立了,那就是完成了,至于说资源不能有效释放,如果方法是正确的,你不能释放资源,那明显就是你的代码问题,或代码逻辑上问题.这里只是讨论方法,没人能教你如何写代码.
大名鼎鼎的 wget 或者 curl 都可以,GPL的
我的FTP都在我的电脑上,Srev-U6