Android Native层进程间通信

文章详细介绍了在面临CTS问题时,从使用socket通信转为采用unix域socket的原因及过程,包括两种通信方式的区别、实现细节以及在Android和Linux平台上的通用性。

之前的两个进程间的通信方式是通过socket,需要一直监听端口,导致过不了CTS,于是改成了LocalSocket,但是LocalSocket是Android系统特有的,

而我们的客户端需要在Android系统和Linux系统都能使用,因此最后决定采用unix域socket的方式进行通信,这样就可以避免CTS问题且在Android和Linux平台上可以通用。

1.域socket通信

http://www.cnblogs.com/bastard/archive/2012/10/09/2717052.html

http://www.cnblogs.com/zealotrouge/archive/2013/06/24/3152941.html

http://blog.youkuaiyun.com/goleftgoright/article/details/7406292

2.Unix域Socket

http://blog.youkuaiyun.com/wuhengwudi/article/details/6793983

3.占用端口的socket进程间通信:

   #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <string.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #include <sys/wait.h>
    #include <pthread.h>
    #include <dirent.h>  
    #include <sys/stat.h>  
    #define PORT 5000
    #define MAX_BUF_LEN 100
    int sockfd;
    int sockfd_client;
    int num_bytes;
    socklen_t addr_len;
    char buf[MAX_BUF_LEN];
    struct sockaddr_in my_addr;
    struct sockaddr_in remote_addr;
    struct packet
    {
      int cmd;
      char info[10];
    };
    void response(struct packet *pack)
    {
        char *buffer;
    	buffer = (char *)pack;
        if( ( num_bytes = sendto( sockfd_client , buffer , sizeof(packet) , 0 , (struct sockaddr*)&remote_addr , sizeof( struct sockaddr_in ) ) ) < 0 )
        {
          perror( "sendto error" );
          exit(1);
        }
    	printf("already response : %d bytes\n", num_bytes);
    }
    void cmd_dispatcher(char *buf)
    {
    	//处理命令
    	struct packet_t *recv_pack;
    	recv_pack = (struct packet *)buf;
    	//......
    	//......
    	//......
    	//给客户端回复处理结果
    	struct packet *rsp_pack;
    	response(struct rsp_pack);
    }
    int main()
    {
       int ret = 0;
       if( (sockfd_client = socket( AF_INET , SOCK_DGRAM , 0 )) < 0 )
       {
          perror( "socket client failed " );
          exit(2);
       }

      if( (sockfd = socket( AF_INET , SOCK_DGRAM , 0 )) < 0 )
      {
        perror( "socket failed" );
        exit(1);
      }
      
      memset( &my_addr , 0 , sizeof( my_addr ) );
      my_addr.sin_family = AF_INET;
      my_addr.sin_port = htons( PORT );
      my_addr.sin_addr.s_addr = INADDR_ANY;

      if( bind( sockfd , ( struct sockaddr * )&my_addr , sizeof( struct sockaddr ) ) < 0 )
      {
        perror( "bind error" );
        exit(1);
      }
      addr_len = sizeof( struct sockaddr_in );
      while(1){
      if( ( num_bytes = recvfrom( sockfd , buf , MAX_BUF_LEN , 0 , (struct sockaddr*)&remote_addr , &addr_len ) ) < 0 )
      {
        perror( "recvfrom error" );
        exit(1);
      }
      buf[num_bytes] = '\0';
      fputs( buf , stdout );
      fflush(stdout);

      cmd_process(buf);

      }
      close(sockfd);
      return 0;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值