发了一遍石沉大海,无人正解,只好重发一遍!!
写一个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#编程,但搞不定也不好交代,所以谁帮忙解决了还可以加分!!!!!!!!

解决方案 »

  1.   

     http://code.ittoolbox.com/jaimonmathew/code/FTPClient.zip LightFTPClient:   a   basic   FTP   client:   
      http://www.codeproject.com/csharp/LightFTPClient.asp   
        
      FTP   Client   library   in   C#:   
      http://www.csharphelp.com/archives/archive9.html  
      

  2.   

    你是在DUBUG 还是 RELEASE,
    估计是客户端没有连接你的服务器,
    所以你的程序一直处于监听状态。
      

  3.   

    我是客户端 只不过PORT模式是我通知服务器来连接我
      

  4.   

    hListenSocket.Accept(); 之前提交的命令返回值如果已经取得过了,这个当然会诸塞到这的。
      

  5.   


                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数据就可以了。
      

  6.   

    你Receive之前一定要有命令或连接到FTP服务器,这样才能收到信息,要不然只能阻塞了