让人头疼的ios 8——GCDAsynSoc…

        众所周知,socket通信有一个缓冲区,正常情况下,异步的socket是不会有socket的阻塞问题发生的,可是这个ios8 却会。因为异步的socket过来的时候,他会先挂起,等到这个缓冲区满了再唤醒,这样就会出现,三四秒recv不到消息,然后三四秒后一股脑的recv好几条消息,这个实在让人有些受不了啊。我们是做股票软件的,服务器推过来的报价,报价快的时候差不多一秒两口,在ios7上的时候,就是很匀速的recv,一口接一口的,而在ios8上的时候就是,是个好几秒一下子过来好几口,就好像攒够一盆水,一下子倒出来一样,这可是个很麻烦的事情啊。这对这个,我试了朋友提供的两个解决办法:①让socket不停的发消息,然后就能让socket就能一直在recv处理消息。②将缓冲区的大小设置小一些,然后就能让它减小阻塞的可能性。我经过验证,这俩方法都不行。
        首先第一点,socket发消息跟收消息阻塞有必然联系么?我喜欢用实际代码验证,结果有。但是,这个不可行。你总不能莫名其妙的一直发包,不合逻辑。然后第二点,缓冲区设小一点,我依旧是用demo验证,而且确实有效,在8上,缓冲区的大小对于socket的阻塞影响极大,如果我将缓冲区设为100M,他大概1分钟才才收到报价,并且是一堆报价,然后试了各种size,然后发现真的是这个原因,虽然原因定位好了,但是解决办法却并不可行。首先,这个报价的数据包是小的,可是其他的数据的数据包有大包啊,一个完整包放不下的缓冲区必然面临崩溃啊,事实上改了项目中的缓冲区为8M 然后确实闪退了,原因就是缓冲区溢出了。然后我只能选择一个既能接受socket阻塞,又能容纳最大的完整包的size,然后差强人意的解决了问题,但这个问题的研究还在继续,我相信我一定能找到更好的办法,来处理这个的。
        这里只提供一个解决思路,具体代码实现,需要了解的可以给我留言喔。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值