socket通信 的一些坑

因为项目中用用到socket通信 实现夸平台的局域网实时通信。下面罗列一些我在使用过程中遇见错误和我的处理方式:一般socket通信的错误都会传到- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)error 这个代理方法中

1.Error Domain=GCDAsyncSocketErrorDomain Code=4 "Read operation timed out" UserInfo=0xa8db6a0 {NSLocalizedDescription=Read operation timed out}
scoket读取数据超时,当网络不怎么稳定通信方给发送消息的时候时不时的会冒一个这个错误,而且Socket也会自动断开连接。一直跟踪GCDAsyncSocket.m的代码5068行<可能代码有更新的会有点差异>有一个方法

  • (void)setupReadTimerWithTimeout:(NSTimeInterval)timeout
    这个方法是就是专门监听socket读取数据是否有超时的现象的方法,源代码设置成if(timeout >= 0.0)即检测到超时就抛异常 这样很容易导致socket连接异常。
    处理方式:你可以打印一下这个timeout值,就会大概知道你的socket读取数据超时的范围,在项目允许的范围内设置这个值的大小,因为我的项目总是在10以内,所以我设置成if(timeout > 10.0)之后,基本运行的时候就很少抛这个异常了。你也可以再接收到这个异常的时候重新连接一次。

2.Error Domain=GCDAsyncSocketErrorDomain Code=3 "Attempt to connect to host timed out" UserInfo=0x7bd14f40 {NSLocalizedDescription=Attempt to connect to host timed out}
socket连接的时候超时,一般发生在你向服务端发送一条连接消息的时候,服务端无响应,一般是由于服务端没有开启服务,也有可能是设置响应时间的timeout值过小,在GCDAsyncSocket.m的代码1938行的位置有一个设置timeout的地方 你可以设置一个稍微比较长的响应时间

  • (BOOL)connectToHost:(NSString*)host onPort:(uint16_t)port error:(NSError **)errPtr
    {
    return [self connectToHost:host onPort:port withTimeout:5 error:errPtr];
    }

3.Error Domain=GCDAsyncSocketErrorDomain Code=51,网络断开,可以检查一下网络连接状态

4.Error Domain=NSPOSIXErrorDomain Code=61 "Connection refused" UserInfo=0x7b288750 {NSLocalizedFailureReason=Error in connect() function, NSLocalizedDescription=Connection refused}
服务器没启动,或者端口没开启。

你可能感兴趣的:(socket通信 的一些坑)