发了一遍石沉大海,无人正解,只好重发一遍!!
写一个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模式,正确的返回了文件列表,请各位大侠指教!老板交的任务,说是练练c#编程,但搞不定也不好交代,所以谁帮忙解决了还可以加分!!!!!!!!
写一个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模式,正确的返回了文件列表,请各位大侠指教!老板交的任务,说是练练c#编程,但搞不定也不好交代,所以谁帮忙解决了还可以加分!!!!!!!!
解决方案 »
- 初学者问题.
- 为什么在WPF中无法使用ConfigurationManager?
- Microsoft.Office.Tool.Excel
- 关于report viewer的使用(经验总结和代码实例)
- 关于VS2005C#和数据库```
- [转贴]微软 Visual Studio Team System 2008 正式版下载
- 页面图片抓取小程序.net winform
- .net\c#学习交流QQ群: 7246375
- 我一直遵守CSDN的各项制度, 为什么扣我的信誉分啊?
- 怎样在WIN98的PC机上发布C#开发的应用程序,急!!!
- 我有两个窗体A和B注意两个窗口都是打开的,我想把B窗体的combox的值赋值给A窗体中的combox,要怎么实现??
- 关于读取XML的问题
http://www.codeproject.com/csharp/LightFTPClient.asp
FTP Client library in C#:
http://www.csharphelp.com/archives/archive9.html
估计是客户端没有连接你的服务器,
所以你的程序一直处于监听状态。
socketControl = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ep = new IPEndPoint(IPAddress.Parse(yourHostIP), yourPort);
try
{
socketControl.Connect(ep);
}
catch
{
return false;
}连接上就OK了,由于FTP是被动接收的,你就不用Accept,直接Receive数据就可以了。