我在用CAsyncSocket发送语音。我开了个线程来获取声音数据,调用Send函数来一直发送。在网络比较差的时候发送语音,连接会经常被断开,错误代码是10053。注意,只有在网络比较差,而且打开语音功能的时候才会碰到这个问题。
   会不会是send buffer没有可用空间,而我又调用Send()导致这个问题?如果是,怎么获取send缓冲区剩余大小?获取缓冲区被填满时是否有事件触发?
   还是因为发送数据超时引起Socket被关闭?如果是,如何让socket不会因为发送数据超时被关闭?
   哪位大侠救我!

解决方案 »

  1.   

    10053表示网络连接断开缓冲区填满的时候不是这个错误,而是WSAWOULDBLOCK发生这样的错误说明网络质量非常差,连接彻底中断,你需要重新连接
      

  2.   

    谢谢楼上各位
    更改缓冲区大小可能没效果吧?因为我一收到声音数据就发送,如果发送速度不够的话,再大的缓冲区也会用完啊
    fantiyu,一开始的错误就是WSAWOULDBLOCK...刚才没写清楚。
      

  3.   

    缓冲区满了并不会造成连接断开~~~只是send返回失败罢了~~
      

  4.   

    sorry,我一开始检查到的是WSAECONNABORTED ,然后才是WSAWOULDBLOCK
        我想应该不是因为网络质量非常差才断开的,如果我不发送声音数据,就不会出现这种情况,一发送声音数据,几乎每次都出现,网络越差,出现得越快。
        我想这种情况程序是可以控制的,只要控制数据的发送频率和数量应该就可以了。所以想知道什么时候必须丢弃一些数据。
      

  5.   

    嗯,我刚才也看了,如果缓冲区满了,Send返回的值会小于想发送的buf大小。
    但是有没有可能如果receive缓冲区满了,连接会被关掉哪?
      

  6.   

    谢谢fantiyu,danfeng
    也只能这样了。因为公司人手一个雅虎msn,我们的程序老重新连接,雅虎倒不会,因此认定我们程序有问题。晕啊,我们程序的server装在台湾啊。
    各位有没有碰到雅虎msn或其他即时语音程序在网络很差的情况下连接被断开的情况?让俺心理平衡平衡。
    这是我在csdn提的第一个问题,等下班前就结帖。
      

  7.   

    如果一定要保证语音不丢失(至少不丢失在程序处理过程中)~~你可以考虑用缓冲区来处理~~
    凡是没有send成功的用协议保证数据重发~~不过这样语音的及时性就不好了~~~你自己取舍吧