IM软件业务知识—iOS 客户端创建网络连接,常见错误汇总

袁骏祥
2023-12-01

----------------------------------------------------欢迎查看IM软件业务知识《专栏》-------------------------------------------------------------------
使用状态机来保持在线状态 【点击】                      拼图算法,将零碎小图,整理到一张大图上【点击
登录导航 【点击】                                                   会话session的概念【点击】       
“假在线’ 【点击】                                                    非对称加密,RSA算法【点击
如何建立安全socket连接、登录 【点击】               浅谈断线重连、心跳和长在线 【点击
iOS 客户端创建网络连接,常见错误汇总 【点击】 protocolBuf 在iOS上的使用入门、讲解、指南 【点击
实现富文本解析【点击】                                          UITableview Deceleration 加速滑动(惯性滑动)、弹性回归原理【点击
--------------------------------------------------------------------------------------------------------------------------------------------------------------------

在做iOS 客户端 Server-Client项目的时候,需要Client登录和长连接。所以,网络和socket的问题,变得重要起来。

在网上查阅找一些资料,供网友参考,下面是遇到的一些错误码:

     * Domain=NSPOSIXErrorDomain Code = 51 "Network is unreachable"
     * Domain=NSPOSIXErrorDomain Code = 54 "Connection reset by peer" 连接复位 "在连接断开后的读和写操作引起的"
     * Domain=NSPOSIXErrorDomain Code = 57 "Socket is not connected"
     * Domain=NSPOSIXErrorDomain Code = 60 "Operation timed out"
     * Domain=NSPOSIXErrorDomain Code = 61 "Connection refused"
     * Domain=NSPOSIXErrorDomain Code = 65 "No route to host"

     * 更多的错误码在 #include <sys/errno.h>里


Domain=NSPOSIXErrorDomain Code = 65 "No route to host"

网上

以上摘自:http://stackoverflow.com/questions/3635412/intermittent-no-route-to-host-on-ios-flight-mode-off-then-on-fixes

Domain=NSPOSIXErrorDomain Code = 57 "Socket is not connected"

通常是网络立即断开,比如切换为“飞行模式”,立即得到一个Socket is not connected。

Domain=NSPOSIXErrorDomain Code = 60 "Operation timed out"

【问题】更新Cydia的时候出错,提示POSIX:Operation timed out?!!!怎么解决 啊??
【解决】:
● 连接超时,用vpn或者换个时间再更新就可以了
● 返回一次,重新进入就行,不必象LS说的那么麻烦!我就是这么搞定的
● 有道理!我就是把这个源删掉,其他就全部正常了的!是cydia.sellize.com。楼主可以试试。
● 如果你的威锋源还是旧地址你换成新地址,我的是这么解决的。
● 这两天人多,服务器受不了。连接超时,多等等就好了
● 网络问题!我的联通3g也是这样,不过用wifi就好了

Domain=NSPOSIXErrorDomain Code = 61 "Connection refused"

看到书上的代码中一般建立一个socket连接,进行一次send、recv,然后close(socket)。现在在一次连接中进行了两次send、recv,然后就发现在进行大概二三十次的重复过程后,就会出现connect failed,connection refused的提示,网上查资料时说出现connection refused一般是因为服务器的端口没有打开,可是端口是开着呀,不知道怎么回事了!是不是因为在一次连接中进行了两次收发数据的原因呢?因为在之前进行一次收发数据的时候是很稳定的,盼cu的高手来指点一下。

如果是客户端去连接对应服务端的端口,肯定需要服务端的端口开着的。我估计你的服务端也是自己写的。
1、可能是客户端连接后没有close,次数一多,服务端没资源提供服务而连接不上,你的情况close了,而且20~30次不会是这种问题。
2、服务端没开,你所说的端口是开着的我不是很相信,我觉得更多的可能是你的服务端不健壮,你用客户端send了几次后把服务端的程序给搞死了。
3、第三种可能就是网络问题,我觉得可能性不大。


综上,我认为是2情况导致,你下次模拟重现的时候,如果再发生你说的情况,请到你开服务端的程序看看,看是不是被搞死了。

Domain=NSPOSIXErrorDomain Code = 51 "Network is unreachable"

当前设备没有网络,然后执行连接操作,就会有报51的错误。

Domain=NSPOSIXErrorDomain Code = 54 "Connection reset by peer"

找遍了中英文的一些网站,搜遍了能找的每个角落,发现了出现这种状况的原理,该异常在客户端和服务器端都有可能发生,引起该异常的原因有两个: 
1,如果一端的Socket被关闭(或主动关闭,或因为异常退出而 引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer)。 
2,一端退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常(Connection reset)。 
简单的说就是在连接断开后的读和写操作引起的。
上面一段摘自: http://phl.iteye.com/blog/1883742


TCP机制中,socket连接的双方都可以调用close()之类的函数退出当前连接,TCP根据改进了的三次握手机制通知另一方也退出当前连接。这个过程可以看做是正常socket连接的一部分。同时,TCP提供一种复位机制,在一方的程序遇到异常情况断开此次连接后,会向对方发送重置报文。复位是即时的退出,并清理此次连接相关的所有资源。
所以出现Connection reset by peer的原因是对端服务器异常退出了此次连接。
客户端遇到这种情况,只有重新和服务器端建立连接。我遇到的这种情况下,有时要重试5次左右才能够正常连接上。
上面一段摘自:http://blog.csdn.net/shaovey/article/details/4678717


 类似资料: