socket closed by remote peer GCDAsyncsocket
发布日期:2021-06-29 11:52:33
浏览次数:2
分类:技术文章
本文共 1363 字,大约阅读时间需要 4 分钟。
在项目中用到GCDAsyncsocket,Mac端作为服务器,手机端作为客户端,在通信过程中,不定时出现以下错误:
error domain=gcdasyncsocketerrordomain code=7 socket closed by remote peer
排错
此错误一般由于服务端关闭而导致出错,出现此问题的一般排查步骤:
-
服务端要将新连接的socket强引用,否则会出现此错误。
@property (nonatomic, strong) NSMutableArray *socketsArray;- (void)viewDidLoad { _socketsArray = [[NSMutableArray alloc] init];}- (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket { [_socketsArray addObject:newSocket]; [newSocket readDataWithTimeout:-1 tag:0];}
-
没有规律发送心跳或者心跳间隔过长。中有人尝试将心跳从10分钟改为5分钟之后解决了此错误,可参考。由于我7秒发送一次心跳,因此排除此可能性。
-
是否使用相同的凭证从不同的客户端登录,并且在服务器设置中有这样的设置:如果有资源冲突,立即踢出另一个资源,在服务器>服务器设置>资源策略。
排查
经过排查,发现存在以下问题:
- socket的代理回调队列在主线程,会影响计时,超时从而导致出现此错误。
- 每个socket writeData之后应没有发送readDataWithTimeout,代理不再接收数据。
- 定时器用NSTimer或者PerformSelectAfter两种方式可能存在问题。
解决
-
socket的代理回调队列放在子线程。
//启动服务 _severPort = [OsxPortListHelper port]; _socketDelegateQueue = dispatch_queue_create("socket_delegate_queue", NULL);//注意成员变量引用,否则会释放 _serverSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:_socketDelegateQueue]; [_serverSocket acceptOnPort:_severPort error:nil];
-
每个socket writeData:之后应发送readDataWithTimeout:方法,告诉代理接收数据。
[sock writeData:data withTimeout:-1 tag:0];[sock readDataWithTimeout:-1 tag:0];
-
定时器改用
_sendHeartBeatTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, _socketDelegateQueue);
方式。
参考
转载地址:https://blog.csdn.net/zzl819954692/article/details/105664522 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月19日 01时27分52秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
「2020年大学生电子设计竞赛分享」电源题,省一等奖!
2019-04-29
又一国产开源微内核操作系统上线!源代码已开放下载
2019-04-29
10年老兵!从大学毕业生到嵌入式系统工程师的修炼之道……
2019-04-29
如何才能学好单片机?
2019-04-29
一根网线有这么多“花样”,你知道吗?
2019-04-29
雷军1994年写的诗一样的代码,我把它运行起来了!
2019-04-29
2020年大学生电子设计竞赛,B题,单相在线式不间断电源,详细技术方案!
2019-04-29
大佬终于把鸿蒙OS讲明白了,收藏了!
2019-04-29
C语言指针,这可能是史上最干最全的讲解啦(附代码)!!!
2019-04-29
国内大陆有哪些芯片公司处于世界前10?一起看看!
2019-04-29
单精度、双精度、多精度和混合精度计算的区别是什么?
2019-04-29
中国35位“大国工匠”榜单出炉!西工大、西电合计占半壁江山!清华仅1人!...
2019-04-29
知乎热议:嵌入式开发中C++好用吗?
2019-04-29
2020,Python 已死?
2019-04-29
漫画:程序员相亲?哈哈哈哈哈哈
2019-04-29
30种EMC标准电路分享,再不收藏就晚了!
2019-04-29
这100道Linux常见面试题,看看你会多少?
2019-04-29
十年硬件老司机,结合实际案例,带你探索单片机低功耗设计!
2019-04-29
“2020年嵌入式软件秋招经验和对嵌入式软件未来的一点思考”
2019-04-29
嵌入式的坑在哪方面?
2019-04-29