自己写了个TCP的传送类.
使用的是 Socket的异步传送接收方式在网络上传送大文件时.接收到的信息总有一些要不对.....
但在一台机子上开两个端口相互传送就没有问题....是不是用Socket类在传送过程中数据会出错..有什么方法来检验发送和接收到的数据的一致性.....

解决方案 »

  1.   

    try
    {
    TcpListener tcpl = new TcpListener(_iPort);
    tcpl.Start();
    //MessageBox.Show("正在等待客户端连接");//调试用
    log.LogStartServer(true);
    //建立文件流,读取文件列表
    FileStream fs = new FileStream("List.txt", FileMode.Open,FileAccess.Read,FileShare.Read);
    byte[] bSend = new byte[fs.Length];
    fs.Read(bSend, 0, bSend.Length);
    byte[] bEOF = System.Text.Encoding.ASCII.GetBytes("<EOF>");
    while (true) 
    {
    TcpClient tc = tcpl.AcceptTcpClient();//接受将阻塞,直到有人连接
    NetworkStream ns = tc.GetStream();//得到网络传输流  ns.Write(bSend, 0, bSend.Length);//写入流
    ns.Flush();
    ns.Write(bEOF, 0, bEOF.Length);//写入结束标志
    //接受返回的流

    byte[] bRec = new byte[1024];
    ns.Read(bRec, 0, bRec.Length);
    String strRec = Encoding.Default.GetString(bRec);
    MessageBox.Show(strRec); tc.Close();
    //MessageBox.Show("以发送");//调试用

    }
    }
    catch (SocketException socketError)
    {
    if (socketError.ErrorCode == 10048)
    {
    //MessageBox.Show("连接到此端口失败。有另一台服务器正在此端口上侦听。");//调试用
    log.LogStartServer(false);
    }
    }
    客户端这样写:
    int block; 
    // 每次从流中读取缓存大小的数据,直到读取到结束标志<EOF>为止 
    while (true)

    block = ns.Read(bRec, 0, bRec.Length); string ss=System.Text.Encoding.ASCII.GetString(bRec);
    int x=ss.IndexOf("<EOF>");
    if( -1!=x )//找到<EOF>
    {
    fs.Write(bRec, 0, x);
    fs.Flush();
    break;
    }
    else
    {
    fs.Write(bRec, 0, block);
    fs.Flush();
    }
    } fs.Close();
    MessageBox.Show("完成读取");
      

  2.   

    发送和接收的类我都有...
    就是不明白TCP传输过程中怎么会出错...(两台不同的机子传大文件一般都要出错)要如何才能控制传输错误??
      

  3.   

    不要递归用异步,用一次异步就可以了。
    http://community.csdn.net/Expert/TopicView.asp?id=5032172
      

  4.   

    完整的代码见我的博客.........
    http://blog.csdn.net/yeerh/archive/2006/09/25/1280111.aspx
      

  5.   

    发送的时候每一包的开始都是以 0(发文本),1(序列化的对象),2(文件),而在传文件时些外接收到的包开头不是0\1\2  .....如果服务器端和各客户端是同一台机子则没有这样的错误..
     /// <summary>
            /// 接收数据回调函数
            /// </summary>
            /// <param name="ar"></param>
            private void ReceivceData(IAsyncResult ar)
            {
                try
                {
                    //接收到的数据长度.
                    SocketError sErr;
                    int receLen = this.socket.EndReceive(ar, out sErr);
                    if (receLen > 0)
                    {
                        byte[] receBytes = (byte[])ar.AsyncState;
                        switch (receBytes[0])
                        {
                            case 0:     //接收到文本
                                ReceivceText(receLen, receBytes);
                                break;
                            case 1:     //接收到对象
                                ReceivceObje(receLen, receBytes);
                                break;
                            case 2:     //接收到文件
                                ReceivceFile(receLen, receBytes);
                                break;
                            default:    //接收错误
                                WriteLine("错误的数据包: 包头为" + receBytes[0].ToString());
                                WriteLine(sErr.ToString());
                                break;                    }
                        //继续接收数据
                        byte[] bytes = new byte[bufferLen];
                        this.socket.BeginReceive(bytes, 0, bytes.Length, SocketFlags.None,
                           new AsyncCallback(ReceivceData), bytes);
                        return;
                    }
                }
                catch (SocketException socketErr)
                {
                    WriteLine(socketErr.Message);
                }
                catch (ObjectDisposedException socketClose)
                {
                    WriteLine(socketClose.Message);
                }
                catch (Exception err)
                {
                    WriteLine(err.Message);
                }
                //断开连接事件
                if (DisConnect != null) DisConnect(socket, this);
                this.recObjeLen = -1;
                this.recFileLen = -1;
            }
      

  6.   

    TO lihang2006() :
    用异步发..应该和循环发差不多吧??
    我是用异步每次发8092个字节..你用循环发..是不是在接收到每一包都要回应呢?
      

  7.   

    最近重写了这个类....传大文件还是会有问题..
    估计得加上验证.在接收端接收完一包时发出响应..
    发送端接收到响应以再发第二包...
    还没写完..写好了会更新到我的blog上..谢谢大家