http://www.wrclub.net/study/listarticle.aspx?id=2536 相信会对楼主有帮助.

解决方案 »

  1.   

    p2p 即 peer to peer,点对点
      

  2.   

    你说的方法有问题吧?
    服务器发送byteread过来的时候,你怎么知道他会发多少次?
    你客户端该怎么调用BeginReceive?
    如果服务器连续send byteread的时候,还有可能TCP协议会帮你把数据重组
    到时候你收的就是一个包……
      

  3.   

    tear_pearl的担心我感觉有些多余,tcp协议本身是面向连接的协议,底层操作对发送失败已经作了处理,而且在传输层对每个数据包做好了自己的编号不过,由于是异步操作,客户端发送就当作发送成功是不正确的,而服务端一旦收取了数据肯定会给客户端一个应答,这是tcp协议面向连接所必需的,这个应答就是你所需要的,即表示服务器已经收到
      

  4.   

    tcp协议的应答你怎么可能得的到
    仔细想了一下,也许楼主的办法能行
    服务器receive一个包后,把byteread发送给客户端,当receive全部完成后,调用socket.shutdown(send)也就是客户端在send数据后,socket.shutdown(send);跟着接受BeginReceive
    在receivecallback函数里面用一个while循环,每读取一个byteread就相应调整进度条
    直到它从EndReceive中读到长度为0的数据,这也就意味着服务器全部接受完毕
      

  5.   

    可我又觉得这样代价太大了把,是不是客户端没发送完一段数据后就要beginreceive()服务端已接收到的字节数,接收到之后在beginsend();
      

  6.   

    客户端是可以将所有数据一次发送完的,其中的数据分组由网络协议完成
    相信我,你一个10000大的数据,全部一次send,在sendcallback完成后,循环调用beginreceive
      

  7.   

    我试试。谢谢,
    不过还有个问题一直困扰着我:
    1。我现在是这么做的,在客户端传送文件的时候,每次都读1024byte,发送,前六位是协议头,如果不够就填充0,在服务端我也是每次接收1024个byte,如果接收不够1024,则循环接收,直到狗1024个为止,
    2,问题:
    我不知道如果我发送的不是固定长度的byte,每次发送不定数目的byte,载接收端我每次都接收到长度为1024byte的数组里,我每次接收后都要判断协议头,那我每次接收的是不是客户端每次发送的,
      

  8.   

    你不是用的异步吗??
    用异步的话就不需要你所说的:“在服务端我也是每次接收1024个byte,如果接收不够1024,则循环接收,直到狗1024个为止,”你去msdn查关键字“异步服务器”
    里面有个例子,仔细看看
    你应该是一直byteread = endreceive(ar)
    然后判断byteread的大小,如果为0,则表示已经全部接受完客户端发送过来的数据
    否则继续调用receivecallback当然,这要求客户端在sendcallback返回之后,调用socket.shutdown()
    如果后面该socket还有发送数据,则只shutdown send
      

  9.   

    1。做进度条时:我在客户端一次发送byte[1024]个,因为很多程序都这样写了,我不可能改了,我循环发送1024个,把文件发送完之后,在循环调用beginreceive接收字节数行不行。
    2。在服务端是不是我每次endreceive之后,都要beginsend   endreceive的返回值呀
    3。你说的不用循环接收直到1024个字节,可我每个1024个字节的头六个字节是协议,我接收到之后必须判断该协议的内容,如果我再接收端现接收到500个,不循环接收,那下一次接收的头六个字节就不是协议字节了,就会出错的