写一个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模式,正确的返回了文件列表,请各位大侠指教!