美文网首页Android开发Android开发程序员
Android Native进程间通信实例—Socket本地通信

Android Native进程间通信实例—Socket本地通信

作者: 06fd4cf1f427 | 来源:发表于2019-07-15 21:30 被阅读9次

    导读:

    好难受啊,为什么服务端说挂就挂,明明只是客户端关闭而已,服务端怎么能挂呢?

    想想,如果手机上使用一个聊天程序的时候,手机端关闭了聊天程序,那么远端服务器程序总不能说挂就挂吧!所以一定要查明真相。

    1. 跟踪代码查找到进程退出的源头

    之前服务端源码:https://www.cnblogs.com/songsongman/p/11187844.html

    查阅代码发现,代码主体在while(1)里面,所以最可疑的地方在于accpet,pthread_create, pthread_join和创建的线程client_thread了

    明摆着就是client_thread中出了问题,因为accpet,pthread_create, pthread_join中都有根据函数返回值做是否出错的判断,还是认怂好好看看线程做了什么:

    void *client_thread(void *arg)
    {
        int clifd = *(int *)arg;char *s = "hello mysocketclient\n";
    
        while(1)
        {
            usleep(1000000);
            write(clifd,s,strlen(s));//send(clifd,s,strlen(s),0);
        }
    
        return (void *)0;
    }
    

    哇!居然使用write的时候没有添加返回值的判断,在ubuntu终端中输入man 2 write,可以看到write出错时候会返回-1;

    2.简单完善代码容错机制

    添加容错代码后以后看看效果如何,代码如下:

    while(1)
        {
            usleep(1000000);
            ret = write(clifd,s,strlen(s));//send(clifd,s,strlen(s),0);
            if(ret == -1)
            {
                printf("client thread write failed !\n");
           close(clifd);
                pthread_exit(NULL);
            }
        }
    

    执行结果如下:

    过程分析,

    1. 先执行服务端程序,然后运行客户端程序,客户端程序强制退出(通过快捷键ctrl+c),服务端client_thread中write返回-1,线程正常退出。

    2. 这时候服务端程序还阻塞在accpet等待下一次的客户端连接请求,运行新的客户端程序,然后强制退出客户端,发现服务端进程居然直接退出了!

    咋办啊!感觉代码没有任何问题了,为啥还会出错,虽然很明确一定是write的时候没能写进客户端导致的进程奔溃,但是却无从下手。

    (注意:为了解决这个问题,笔者绞尽脑汁修改,比如添加

    shutdown(clifd, SHUT_RDWR);

    又或者添加getsockopt来实时获取连接状态

    )效果都不佳,无法解决问题。

    3. 添加捕获异常来再次加强容错机制

    绞尽脑汁似乎没有什么效果,抓耳挠腮看看吧,好好翻翻书,看看能不能找到灵感。

    从网上找到一本和UNIX系统编程有关的书籍《UNIX环境高级编程_第二版中文》,因为android是基于linux开发的操作系统,linux又是从UNIX那边衍射出来的,

    所以linux系统编程这块参考这本书特别靠谱。

    看到一个和信号有关的章节,确定了要用signal来检测异常,可检测的信号可真多啊!

    然后不小心看到这点

    好吧,灵感来了,开始写代码,直接添加头文件

    include <signal.h>

    然后再main函数中添加signal(SIGPIPE, SIG_IGN);

    运行服务端,再运行客户端,不管客户端怎么退出重启,服务端都不受影响了。

    任务完成!

    最后

    如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。

    最后针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、移动架构师、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

    需要展开的架构学习笔记导图的加群免费获取 Android架构设计大群(185873940)

    PS:群内有许多技术大牛,高手如云,有任何问题,欢迎广大网友一起来交流,群内还不定期免费分享高阶Android学习视频资料和面试资料包~

    相关文章

      网友评论

        本文标题:Android Native进程间通信实例—Socket本地通信

        本文链接:https://www.haomeiwen.com/subject/rpnokctx.html