如何解决ios SIGPIPE 导致的崩溃
2015-01-24 12:06
169 查看
分类:
游戏开发 2014-06-06 16:00
620人阅读 评论(0)
收藏
举报
在开发ios长连接游戏的过程中遇到一个问题:在游戏运行过程中玩家按下home键或者其他原因游戏被挂起,socket连接不会断开,服务器为了节省资源,在一段时间后会主动关闭这个连接。当玩家再次切回到游戏后,前端并不知道这个连接已经断开了,继续通过断开的socket发送消息,这时候send函数会触发SIGPIPE异常导致程序崩溃。
解决这个问题我们需要在send的时候检测到服务器已经关闭连接,进行重新连接。正常情况下send函数返回-1表示发送失败,但是在IOS上SIGPIPE在send返回之前就终止了进程,所以我们需要忽略SIGPIPE,让send正常返回-1,然后重新连接服务器。
查阅资料后找到了两个方法:
1) 使用 signal(SIGPIPE, SIG_IGN) 忽略SIGPIPE。经实验在ios7模拟器上虽然xcode还是会捕获SIGPIPE,但是程序不会崩溃,继续后可以执行。但是在真机上依然会崩溃。
2) 使用 SO_NOSIGPIPE。 经实验在多个ios版本下都不再触发SIGPIPE,完美解决问题。
[cpp]
view plaincopy
int set = 1;
setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE, (void *)&set, sizeof(int));
转至 /article/7863899.html
相关文章推荐
- 如何解决ios SIGPIPE 导致的崩溃
- 如何解决ios SIGPIPE 导致的崩溃
- 如何解决ios SIGPIPE 导致的崩溃
- 如何解决迅雷插件导致IE10崩溃的问题
- QSqlDatabase 使用小结,解决部分数据库操作导致程序崩溃的办法
- 3种不用重装的办法解决压缩Vista系统文件夹导致崩溃情况
- 如何解决BitBlt打印BMP,数据量太大导致速度效率慢的问题
- KAV6导致部分程序崩溃的解决办法(kernel32.dll相关)
- ORA-07445导致实例崩溃的解决【The solution of instance crush by ORA-07445】 推荐
- open和add file to project功能导致VC++6.0程序崩溃的解决方法
- 如何解决动态链接导致的程序启动失败
- 如何解决更改解决服务器IP,导致应用程序无法访问SQL SERVER的问题?
- 因workplace出问题导致 eclipse 崩溃 解决办法。
- LINUX C语言 SOCKET 服务器断开导致客户端SEND崩溃问题解决办法
- 如何解决chm在WIN7下崩溃生成chw文件的问题
- C#与.NET程序员面试宝典 2.2.5 面试题12:如何解决因共享组件而导致的应用程序之间的冲突
- 雷鸣解答现场提问:如何解决硬件崩溃问题
- 如何在一分钟内解决Windows系统崩溃问题
- KAV6导致部分程序崩溃的解决办法(kernel32.dll相关)
- 如何解决XML文件中特殊字符“& <”导致解析错误的问题