111,112
社区成员




/// <summary>
/// 重新连接服务器,并检测服务器支持命令,列出当前目录列表
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void reConnect_Click(object sender, System.EventArgs e)
{
System.Windows.Forms.Button senderButton = (System.Windows.Forms.Button)sender;
//Set up variables and String to write to the server.
Encoding ASCII = Encoding.GetEncoding("gb2312");
Byte[] recvBytes = new Byte[256];
Int32 recvLen = 0;
Socket client = connectSocket(this.r_CurPath.Text,21);
senderButton.Parent.Tag = client;
if(client == null)
{
Log(rtxtLog,1,"连接服务器失败!\n");
return;
}
Log(this.rtxtLog,1,"Socket 已连接。正在等候欢迎消息...\n");
recvLen = client.Receive(recvBytes,0,256,System.Net.Sockets.SocketFlags.None);
Log(this.rtxtLog,1,"接收到:" + ASCII.GetString(recvBytes,0,recvLen));
Log(rtxtLog,1,"连接服务器成功!正在验证 . . .\n");
//USER
string cmd = "USER anonymous\r\n";
Byte[] byteCmd = ASCII.GetBytes(cmd);
recvBytes = new Byte[256];
Log(rtxtLog,2,cmd);
client.Send(byteCmd,byteCmd.Length,System.Net.Sockets.SocketFlags.None);
recvLen = client.Receive(recvBytes,0,256,System.Net.Sockets.SocketFlags.None);
Log(rtxtLog,1,"接收到:" + ASCII.GetString(recvBytes,0,recvLen));
//验证
if(ASCII.GetString(recvBytes,0,3) == "331")
{
//服务器要求验证密码。
Log(rtxtLog,1,"服务器要求验证密码。\n");
cmd = "PASS password\r\n";
byteCmd = ASCII.GetBytes(cmd);
Log(rtxtLog,2,cmd);
client.Send(byteCmd,byteCmd.Length,System.Net.Sockets.SocketFlags.None);
recvLen = client.Receive(recvBytes,0,256,System.Net.Sockets.SocketFlags.None);
Log(rtxtLog,1,"接收到:" + ASCII.GetString(recvBytes,0,recvLen));
if(ASCII.GetString(recvBytes,0,3) != "230")
{
Log(rtxtLog,1,"登录失败!\n");
return;
}
else
Log(rtxtLog,1,"登录成功!\n");
}
//
// recvLen = client.Receive(recvBytes,0,256,System.Net.Sockets.SocketFlags.None);
// Log(rtxtLog,1,"接收到:" + ASCII.GetString(recvBytes,0,recvLen));
//PWD
cmd = "PWD\r\n";
byteCmd = ASCII.GetBytes(cmd);
Log(rtxtLog,2,cmd);
client.Send(byteCmd,byteCmd.Length,System.Net.Sockets.SocketFlags.None);
recvLen = client.Receive(recvBytes,0,256,System.Net.Sockets.SocketFlags.None);
Log(rtxtLog,1,"接收到:" + ASCII.GetString(recvBytes,0,recvLen));
//FEAT
cmd = "FEAT\r\n";
byteCmd = ASCII.GetBytes(cmd);
Log(rtxtLog,2,cmd);
client.Send(byteCmd,byteCmd.Length,System.Net.Sockets.SocketFlags.None);
recvLen = client.Receive(recvBytes,0,256,System.Net.Sockets.SocketFlags.None);
Log(rtxtLog,1,"接收到:" + ASCII.GetString(recvBytes,0,recvLen));
// //MODE Z
// cmd = "MODE Z\r\n";
// byteCmd = ASCII.GetBytes(cmd);
//
// Log(rtxtLog,2,cmd);
// client.Send(byteCmd,byteCmd.Length,System.Net.Sockets.SocketFlags.None);
// recvLen = client.Receive(recvBytes,0,256,System.Net.Sockets.SocketFlags.None);
// Log(rtxtLog,1,"接收到:" + ASCII.GetString(recvBytes,0,recvLen));
//检测该站点是否支持断点续传
Log(rtxtLog,1,"正在检测该站点是否支持断点续传 . . .\n");
if(isSupportMulti(client))
{
Log(rtxtLog,1,"该站点支持断点续传!\n");
}
else
{
Log(rtxtLog,1,"该站点不支持断点续传!\n");
}
//PASV
cmd = "PASV\r\n";
byteCmd = ASCII.GetBytes(cmd);
Log(rtxtLog,2,cmd);
client.Send(byteCmd,byteCmd.Length,System.Net.Sockets.SocketFlags.None);
recvLen = client.Receive(recvBytes,0,256,System.Net.Sockets.SocketFlags.None);
Log(rtxtLog,1,"接收到:" + ASCII.GetString(recvBytes,0,recvLen));
if(ASCII.GetString(recvBytes,0,3) != "227")
{
Log(rtxtLog,1,"该站点不支持PASV命令!\n");
return;
}
//得到数据Socket的IP和PORT
string recvstr = ASCII.GetString(recvBytes,0,recvLen);
string substr = recvstr.Substring(recvstr.IndexOf('(') + 1);
substr = substr.Substring(0,substr.Length -1);
char[] ch = {',',')'};
string[] str = substr.Split(ch,7);
string serverIp = str[0] + "." + str[1] + "." + str[2] + "." + str[3];
int serverPort = Int32.Parse(str[4]) * 256 + Int32.Parse(str[5]);
//建立数据连接
Socket dataSocket = connectSocket(serverIp,serverPort);
FTPFileList ffl = new FTPFileList(dataSocket,this.rtxtLog);
Thread fileListThread = new Thread(new ThreadStart(ffl.getFileList));
//TYPE
// cmd = "TYPE A\r\n";
// byteCmd = ASCII.GetBytes(cmd);
//
// Log(rtxtLog,2,cmd);
// client.Send(byteCmd,byteCmd.Length,System.Net.Sockets.SocketFlags.None);
// recvLen = client.Receive(recvBytes,0,256,System.Net.Sockets.SocketFlags.None);
// Log(rtxtLog,1,"接收到:" + ASCII.GetString(recvBytes,0,recvLen));
//LIST
cmd = "LIST \r\n";
byteCmd = ASCII.GetBytes(cmd);
Log(rtxtLog,2,cmd);
client.Send(byteCmd,byteCmd.Length,System.Net.Sockets.SocketFlags.None);
recvLen = client.Receive(recvBytes,0,256,System.Net.Sockets.SocketFlags.None);
Log(rtxtLog,1,"接收到:" + ASCII.GetString(recvBytes,0,recvLen));
if(ASCII.GetString(recvBytes,0,3) == "125" || ASCII.GetString(recvBytes,0,3) == "150")
{
Log(rtxtLog,1,"开始接收数据 . . .\n");
fileListThread.Start();
}
else{
Log(rtxtLog,1,"线程未启动!\n");
return;
}
recvLen = client.Receive(recvBytes,0,256,System.Net.Sockets.SocketFlags.None);
Log(rtxtLog,1,"接收到:" + ASCII.GetString(recvBytes,0,recvLen));
Log(rtxtLog,1,"正在列出文件列表,请稍候 . . .\n");
fileListThread.Join();
this.fillFTPFilesView(this.remoteFilesView,ffl.FileList);
Log(rtxtLog,1,"文件列表完毕。\n");
}