让人头疼的ios 8——GCDAsynSoc…

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