//创建单独的SOCKET通道来进行文件传输 
Socket socket = this.Createnewsocket(conn, _hostName, 5656);
this.Excutecmd(_CmdSocket, "stor " + files[i].Name + "\r\n");
string str2 = this.getmessagenumber(this.Recvmessage(_CmdSocket, conn));       #region 创建新的套接字连接
        private Socket Createnewsocket(string conn, string ip, int port)
        {
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            socket.Connect(ip, port);  
            return socket;
        } private string Recvmessage(Socket _CmdSocket, string conn)
        {
            string str = "";
            while (true)
            {
                byte[] buffer = new byte[0x200];
                _CmdSocket.ReceiveTimeout = 0x1d4c0;
                int count = 0;
                try
                {
                    count = _CmdSocket.Receive(buffer, buffer.Length, SocketFlags.None);
                }
                catch
                {
                    this.writelog(DateTime.Now.ToString() + "|服务器未响应|超时退出!|失败", conn);
                }
                str = str + Encoding.Default.GetString(buffer, 0, count);
                if (count < buffer.Length)
                {
                    try
                    {
                        char[] separator = new char[] { '\n' };
                        string[] strArray = str.Split(separator);
                        if (str.Length > 2)
                        {
                            str = strArray[strArray.Length - 2];
                        }
                        else
                        {
                            str = strArray[0];
                        }
                        if (!str.Substring(3, 1).Equals(" "))
                        {
                            return this.Recvmessage(_CmdSocket, conn);
                        }
                    }
                    catch
                    {
                    }
                    return str;
                }
            }
        }
       private string getmessagenumber(string meg)
        {
            string str = "";
            if (meg != "")
            {
                str = meg.Substring(0, 3);
            }
            return str;
        }当执行string str2 = this.getmessagenumber(this.Recvmessage(_CmdSocket, conn)); 
掉用 Recvmessage
执行count = _CmdSocket.Receive(buffer, buffer.Length, SocketFlags.None);
到这就没反映了服务器以做了断口监听程序

解决方案 »

  1.   

    执行count = _CmdSocket.Receive(buffer, buffer.Length, SocketFlags.None);这个是SOCKET同步接收数据的方法,它会阻塞当前的线程,直到有数据发过来。
      

  2.   

    count = _CmdSocket.Receive(buffer, buffer.Length, SocketFlags.None);
    如果我没猜错你用的是阻塞式接收,也就是说一直监听到有socket数据才继续下一步。你说该步没反应应该是仍然在监听中。要注意的是,你的另一端发送的数据是否用了这个socket。我估计你socket弄混了。
    正确步骤应该是:
    B端保持监听  参考代码:m_TcpClient=m_TcpListener.Accept();
    A端创建socket后,用connet函数连接后并对该socket保持监听
    B端监听到了socket创建请求,同意请求建立socket并记录下该socket (m_TcpClient)
    B端利用记录下的socket(m_TcpClient)发送数据
    A端接收到了B端利用刚才建立的socket发来的数据。
    你现在写的是A端,B端你检查下是不是哪里错了。
    另外阻塞式接收的坏处是,你在接收到数据之前干不了别的。所以个人建议你用线程来操作这一步。
      

  3.   

    我刚接触这
    执行到count = _CmdSocket.Receive(buffer, buffer.Length, SocketFlags.None);
    FTP上文件建上了。是0字节。
    得怎么处理呀
      

  4.   

    服务器是FTP服务器?那客户端需要实现FTP协议了。或者直接使用FtpWebRequest这个类去做。到www.codeproject.com/搜索这个类,有很多现成的例子用。
      

  5.   

    引用 1 楼 wodegege10 的回复:
    执行count = _CmdSocket.Receive(buffer, buffer.Length, SocketFlags.None);这个是SOCKET同步接收数据的方法,它会阻塞当前的线程,直到有数据发过来。线程阻塞了,阻塞咋解决啊。我不会的
      

  6.   


     private string Recvmessage(Socket _CmdSocket, string conn)
            {
                string str = "";
                _CmdSocket.Blocking = false;
                while (true)
                {
      

  7.   

    private string Recvmessage(Socket _CmdSocket, string conn)
      {
      string str = "";
      _CmdSocket.Blocking = false;
      while (true)
      {不行count = _CmdSocket.Receive(buffer, buffer.Length, SocketFlags.None);
    就是0了
      

  8.   

                   try
                    {
                        count = _CmdSocket.Receive(buffer, buffer.Length, SocketFlags.None);
                        
                        if(0!=count)
                           {
                             //DoSomething
                        }
                        

                    }