写一个FTP客户端,在接受文件列表时,由于对方服务器要求以PORT模式传输,发送PORT命令返回正确,但是创建监听套接字后,要Accept的时候,程序不往前走了。代码:
public bool ListPort(Socket ControlSocket,string strDir)
{
Socket hListenSocket = CreateListenChannel();
if (hListenSocket == null)
return false;
Socket DataSocket = hListenSocket.Accept();//到这一步就不走了!!!!!!!!!!
if (DataSocket == null)
return false; string strCommand = "LIST " + strDir;
if (!FtpCommand(strCommand))
return false;
//以下代码省略...
return true;
} //create listen channel
protected Socket CreateListenChannel()
{
int np1, np2, np;
string sCommand, sp1, sp2;
string sHostName = "192.168.2.100";
IPAddress HostIP = IPAddress.Parse(sHostName);
IPEndPoint pt1,pt2;
Socket ListenSocket = null;
try
{
pt1 = new IPEndPoint(HostIP, 0);
ListenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ListenSocket.Bind(pt1);
ListenSocket.Listen(1);
}
catch (Exception ex)
{
m_strError = ex.Message;
return ListenSocket;
}
if (ListenSocket == null)
return ListenSocket;
pt2 = (IPEndPoint)ListenSocket.LocalEndPoint;
np = pt2.Port;
np1 = np / 256;
np2 = np % 256;
sp1 = np1.ToString();
sp2 = np2.ToString();
sHostName = sHostName.Replace('.', ',');
sCommand = "PORT " + sHostName + "," + sp1 + "," + sp2;
if (!FtpCommand(sCommand))
{
if (ListenSocket != null)
{
ListenSocket.Close();
ListenSocket = null;
}
m_strError = "PORT failed!";
}
if (m_nReplyCode >= 400 || m_nReplyCode <= 0)
{
if (ListenSocket != null)
{
ListenSocket.Close();
ListenSocket = null;
}
m_strError = "PORT failed!";
}
return ListenSocket;
}
本地IP如代码所示:192.168.2.100。
我的程序就阻塞在ACCEPT不走了,但是对于同一台服务器,用CuteFtp软件登陆的话,能够看到它用PORT模式,正确的返回了文件列表,请各位大侠指教!
public bool ListPort(Socket ControlSocket,string strDir)
{
Socket hListenSocket = CreateListenChannel();
if (hListenSocket == null)
return false;
Socket DataSocket = hListenSocket.Accept();//到这一步就不走了!!!!!!!!!!
if (DataSocket == null)
return false; string strCommand = "LIST " + strDir;
if (!FtpCommand(strCommand))
return false;
//以下代码省略...
return true;
} //create listen channel
protected Socket CreateListenChannel()
{
int np1, np2, np;
string sCommand, sp1, sp2;
string sHostName = "192.168.2.100";
IPAddress HostIP = IPAddress.Parse(sHostName);
IPEndPoint pt1,pt2;
Socket ListenSocket = null;
try
{
pt1 = new IPEndPoint(HostIP, 0);
ListenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ListenSocket.Bind(pt1);
ListenSocket.Listen(1);
}
catch (Exception ex)
{
m_strError = ex.Message;
return ListenSocket;
}
if (ListenSocket == null)
return ListenSocket;
pt2 = (IPEndPoint)ListenSocket.LocalEndPoint;
np = pt2.Port;
np1 = np / 256;
np2 = np % 256;
sp1 = np1.ToString();
sp2 = np2.ToString();
sHostName = sHostName.Replace('.', ',');
sCommand = "PORT " + sHostName + "," + sp1 + "," + sp2;
if (!FtpCommand(sCommand))
{
if (ListenSocket != null)
{
ListenSocket.Close();
ListenSocket = null;
}
m_strError = "PORT failed!";
}
if (m_nReplyCode >= 400 || m_nReplyCode <= 0)
{
if (ListenSocket != null)
{
ListenSocket.Close();
ListenSocket = null;
}
m_strError = "PORT failed!";
}
return ListenSocket;
}
本地IP如代码所示:192.168.2.100。
我的程序就阻塞在ACCEPT不走了,但是对于同一台服务器,用CuteFtp软件登陆的话,能够看到它用PORT模式,正确的返回了文件列表,请各位大侠指教!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货