用winsock的实现多线程下载问题!!!(300分)

  • 主题发起人 主题发起人 sundayboys
  • 开始时间 开始时间
S

sundayboys

Unregistered / Unconfirmed
GUEST, unregistred user!
1.我找了一些winsock的资料,根据那些资料我现在可以连接上ftp了,我connect后接着send数据,
recive不到任何数据,结果程序就停在那儿了:(,后来我问了人,别人说要有什么标志位才可
以send数据,具体他也没有说清楚:(,希望哪位大虾给写一个用winsock登陆ftp的例子。
如果不方便贴出来,请发到下面信箱:sundayboys@sina.com
2.我用ics的httpcli控件时发现在重新定位url时有一个问题:当server返回302 found,然后给
了新的url。当location 为ftp://协议时,httcli控件缺解析出htpp://hostname/**/ftp://desthostname
这样的怪的url,然后报告get失败,不知道用过httpcli的哪位大虾给我点指点。
3.现在有的网站为了防止盗连,将自己服务器的ip16位加密,加密的结果如:ftp://3659475539/,
我用ics和indy的ftp控件均不能解析,而flashget和其他的ftp软件为什么都能正常解析,
希望哪位能给我说说!
 
第3个问题我已知道,那么谁能给我第一个问题的例子啊!!!
 
ftp 使用一个会话套接字和一个数据套接字,你是否没有建立数据套接字?
 
tianhf:
你能不能说清楚点,我还是不能领会:(
 
一个典型的会话:
==>客户连接FTP服务器 <==220 Serv-U FTP-Server v2.5a build 2 for WinSock ready...
==>USER anonymous <==331 User name okay, please send complete E-mail address as password.
==>PASS ******** <==230 User logged in, proceed.
==>TYPE I <==200 Type Set to I
==>PASV <==227 Entering Passive Mode (10,65,77,186,5,214)
^^^你要建立数据套接字连接10.65.77.186的5*256+214端口用于数据交换
 
我把我的测试代码贴出来,希望给看看:
procedure TForm1.Button1Click(Sender: TObject);
var
I, InitResult : Integer;
WsaData : TWSADATA;
Int_Addr : TSockAddr;
DestSocket : TSocket;
SendBuf : string;
GetBuf : array [0..1024] of char;
mm : string;
begin
InitResult := WSAStartup(2, WsaData);
if InitResult <> 0 then
begin
Memo1.Lines.add('Initialization erro');
exit;
end
else
begin
Memo1.Lines.Add('Initialization sucess');
DestSocket := Socket(AF_INET, SOCK_STREAM, 0);
Memo1.Lines.Add('socket return: '+inttostr(DestSocket));
Int_Addr.sin_family := AF_INET;
Int_Addr.sin_port := htons(21);
Int_Addr.sin_addr.S_addr := inet_addr('127.0.0.1');
InitResult := Connect(DestSocket,Int_Addr,SIZEOF(Int_Addr));
memo1.Lines.Add('connect :'+inttostr(InitResult));
if InitResult <> 0 then
begin
InitResult := WSAGetLastError();
memo1.Lines.Add('connect :'+inttostr(InitResult));
Exit;
end;
InitResult := recv(DestSocket,GetBuf, 1024, 0);
Memo1.Lines.Add('接受长度:'+inttostr(InitResult));
mm := '';
for I := 0 to InitResult do
mm := mm + getbuf;
Memo1.Lines.Add('接受数据:'+ mm);
SendBuf := 'USER sundowload';
InitResult := Send(DestSocket, SendBuf, length(sendbuf), 0);
Memo1.Lines.Add('发送数据:'+ SendBuf);
if InitResult<>SOCKET_ERROR then
Memo1.Lines.Add('发送长度:'+ inttostr(InitResult))
else
application.MessageBox('发送失败','注意',mb_ok);

{InitResult := recv(DestSocket,GetBuf, Length(GetBuf), 0);
Memo1.Lines.Add('接受长度:'+inttostr(InitResult));
mm := '';
for I := 0 to InitResult do
mm := mm + getbuf;
Memo1.Lines.Add('接受数据:'+ mm);}
end;
closeSocket(DestSocket);
WSACleanup;
end;

测试结果:
Initialization sucess
socket return: 1880
connect :0
接受长度:49
接受数据:220 Serv-U FTP Server v4.0 for WinSock ready...
发送数据:USER sundowload
发送长度:15
然后程序就死在那儿了:(
 
首先多去看看资料,尤其做网络协议的时候,多看看rfc吧,否则就是浪费时间...

然后我想你的问题出在你发送的数据后面要不要加回车控制符,一般而言这种协议都要加一个
回车表示是否一条命令发送完毕。不过我没时间翻ftp的协议,不过http里面是这么处理的,
你试试看吧。
 
他说的应该是createevent。。。。但这和异步有关系。

你那个应该写成线程。。。这样不对。
 
嘿嘿,发送的每个指令后面有回车换行
SendBuf := 'USER sundowload';==SendBuf := 'USER sundowload'+#13#10;

 
建议你用控件吧,这样对winsock的包装好一些。
另外对于ftp来说,必须有一个datasock来接收数据,从CtrolSock来发送控制的。
 
后退
顶部