CFSocket通信,判断与服务器的断开问题

iOS 码拜 10年前 (2015-05-08) 1020次浏览 0个评论
 

– (void)readStream { 
 char buffer[64]; 
 ssize_t nRet = 0;  
 do { 
        nRet = recv(CFSocketGetNative(_socket), buffer, sizeof(buffer), 0);  //从socket中读取发送端buffer中的数据 
                if(nRet == 0 || nRet == -1){ //服务器退出或关闭 
                    //跳出提醒框 
                    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@”” message:@”Server has been turned down!” delegate:nil cancelButtonTitle:@”关闭” otherButtonTitles:nil]; 
                    [alert show]; 
                    [alert release]; 
                    close(CFSocketGetNative(_socket)); //关闭socket 
                    [self doConnect];  //重新连接 
        } 
 }while (nRet != 0 && nRet != -1); 

  
这边的问题的是,只能连两次,第一次连接成功后,服务器退出,有提示:”Server has been turned down!”,然后重新打开服务器,进行第二次连接,也能连接成功,服务器也能接收数据。第二次断开服务器,客户端就不提示了。再开服务器,却不能收到客户端给的数据。客户端再发送两次数据,就主动退出了。 这里有个Bug,应该是我的逻辑上有问题,可是我找了很久,都没找出来。

不懂会不会是我的send函数有问题?因为是自画的键盘,函数的实现如下:比如发送一个字母A
-(IBAction) sendA: (id) sender{
       //服务器上要求键盘事件的格式为k_0_65k_2_65,经过服务器解析之后,在Windows下为字母A
       NSString *stringToSend = [NSString stringWithFormat:@”k_0_65k_2_65″];
       const char *data = [stringToSend UTF8String];
       if(Socket != nil){
            send(CFSocketGetNative(Socket), data, strlen(data)+1, 0);
       }
}
请路过的来看看,帮帮忙,谢谢

确认每次都Socket每次都关闭了,释放了相关资源了.
引用 1 楼 ultrapro 的回复:

确认每次都Socket每次都关闭了,释放了相关资源了.

我之前有用
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];  //自动释放机制
[pool release];

可还是一样的bug,还有就是我这边是这样想的,只要我的服务器没有断开,那么我就不用重连,就可以做相应的revc和send操作,一断开,我就关闭socket,再重新doConnect,而socket的建立是在doConnect函数里的。所以还是觉得没错。修补bug真的太困扰了,因为我一直都按原来我的思想在上面修,所以一直补不上,应该是我的逻辑上有错。望指点一二!谢谢

引用 1 楼 ultrapro 的回复:

确认每次都Socket每次都关闭了,释放了相关资源了.

或者是不是每一次的发送和接收的轮回都要创建和关闭socket?那样的话,我是不是要把socket的创建函数和关闭函数分离出来,再适当的时候调用?

汗~  确实没有必要想那么多
40分
我来终结这个帖子,呵呵。
引用 5 楼 nicktang 的回复:

我来终结这个帖子,呵呵。

好吧~你楼上的是我自己,哈哈

学习了!

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明CFSocket通信,判断与服务器的断开问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!