我发送一个几百K的数据,分成8K 8K的发。
接收方接收,接过发现某些包收错了。
功能代码很简单的,就是循环用CAsyncSocket的send发送。
客户端OnReceive时Receive接收。
本来想当然一定不会出错的(在局域网中)。
发现经常Send的时候就有SOCKET_ERROR。
有碰到过同样问题的朋友,请帮帮忙,谢谢了

解决方案 »

  1.   

    异步socket的正常现象,此时的数据应该在OnSend时发送出去
      

  2.   

    用WASGETLASTERROR()看看错误原因是什么,几百K的东西是不会溢出的吧
      

  3.   

    我想应该是连续发送的问题,TCP发送客户端还可以发回消息,我们就可以有OnSend了,那UDP怎么办呢?除了Sleep以外有没有什么好方法?
      

  4.   

    socket的缓冲区默认值为8192BYTES,因此如果你没有在发送数据后检测是否发送成功,可能使的数据在缓冲区满的时候出错,你可以按前面几位的方面去做,或者使用waitforsingleobject进行同步。或使用多线程用阻塞方式做
      

  5.   

    我每次发送刚好是8192大小(参考别人的,原来是因为缓冲区是这么大啊)。我现在每次发送后都Sleep(5000)发送、接收都不会返回SOCKET_ERROR了,但是数据有变,为什么呢?
      

  6.   

    包的大小应该问题不大,反正都是在ip层协议栈自己分片,组合的。
    tcp window的问题。+
      

  7.   

    seeQe对啊,我发送的包都是8180,可接收方却分成两个包收了(一小部分),因为我把每个包作为一个结构处理,他对应的数据项就错了。那么怎么处理呢?
      

  8.   

    可以这样:
       定义包大小为4096 ,缓冲区大小为8192,同时在定义数据结构体设立dwDataLen 传输总长度,当在客户端接收时将dwDataLen -包的长度,直到为零,当为零后其余数据的头部就有一个结构体,读出该dwDataLen,以上面的方法循环下去.OK
      

  9.   

    可能是发送过快的问题,建议在循环发送体中加Sleep(200)试一试
      

  10.   

    谢谢大家的帮助,根据大家提供的线索我查到不少资料,修正了我以前的认识,我是这么做的:连续发送,当返回SOCKET_ERROR的时候,waitforsingleobj event,event set in OnSend。接受的时候就是象seeQe说的收集了。发送的时候不Sleep这样一来就不会有延迟了。到这里截止把。