进程间通信的例子: socket unix

 

       #include 
       #include 
       #include 
       #include 
       #include 

服务端启动
    int wiCallCtrlServerInit(const char *server_socket_file)   // #define SERVER_SOCKET_FILE   "/tmp/cfg_server.sock"
    1. 建立进程通信的服务端套接字
	fd = socket(PF_UNIX, SOCK_DGRAM, 0)  // 域PF_UNIX用于管道和文件,类型,协议0为自动
    2. 将套接字和服务端文件进行绑定
	// struct sockaddr_un addr;  把地址初始化后,赋值,地址类型,地址为server_socket_file
	bind(fd, &addr, sizeof(addr))  // 先 unlink(server_socket_file);再绑定
    3. 启动一个线程处理通信,返回服务端的套接字
	pthread_create(&id, NULL, (void *)*domain_socket_thread, (void *)fd);  // 启动服务器线程 
	return fd;
	
服务端的处理:	
    void *domain_socket_thread(void *arg)	
	while  // 服务器无限循环,每隔1秒,用select去查读 文件描述符 里,是否 这个服务器fd 准备就绪
	iRet = select(FD_SETSIZE, reads_fd, (fd_set *)NULL, (fd_set *)NULL, &timeout)
	if(FD_ISSET(server_fd, reads_fd))
	        // 先接受 消息头
		serverRecvFrom(server_fd, &msg_head, sizeof(msg_head), MSG_PEEK, &from, sizeof(from))
		// 根据消息类型 进行分流处理
		switch(msg_head.id)
		case XXX:  
			// 处理接收的 消息体 call recvfrom
			serverRecvFrom(server_fd, &msg_1, sizeof(msg_1), MSG_PEEK, &from, sizeof(from))
			// 发送回应消息  call sendto
			serverSendTo(server_fd,&msg_res,sizeof(msg_res),0,&from, from_len);
				
服务器端关闭:	
    int wiCallCtrlServerUninit(int *server_fd_ptr)
	close(*server_fd_ptr);
	remove(SERVER_SOCKET_FILE);	
	
	
		
-----------------------------------------------------------------------------------------------------------------			
client客户端启动
int wiCallCtrlClientInit()
    1. 建立客户端通信套接字
     2. 将1中的套接字 同 客户端文件 绑定  
        // rand随机找一个文件, access测试文件存在
    	sprintf(socket_info->client_socket_file, "/tmp/cfg_client_%d.sock", rand_num); 
    3. 循环连接服务器,用 客户端fd + 服务端的地址  usleep
	connect(client_fd, &ServAddr, sizeof(ServAddr))   
	
client发送请求		
int wiCallCtrlKeyEvent(int handle, unsigned short key_id, unsigned short key_help_id)
    1. 填写msg后发送  call send 
    	rc = wiCallCtrlClientSend(client_fd, &msg, sizeof(msg), 0);
    2. 处理服务器响应消息   call recv
    	用select等待响应消息  ret = 0 超时, -1 错误,  大于0 ok   // no need while
    	wiCallCtrlClientRecv(client_fd,(key_event_t*)msg_res, sizeof(key_event_t), 0);		
			
client关闭
	删文件,close fd	
 
 
------------------------------------------------------------------------------------------------------------
A,B两个模块进行通信,A作为服务端
    A模块 == (主处理进程 + 服务端代码 + 客户端代码)
	1. A模块在启动时,初始化服务端,并启动一个线程,循环处理客户端的请求
	   call wiCallCtrlServerInit
	2. A模块的客户端代码,编译成.so。 并提供.h .so 给B模块。
    B模块 == (主处理 + A的客户端动态库)
        1. B模块在启动时,同时启动A的客户端
        	call wiCallCtrlClientInit
   (A进程 + A_server线程) <-----socket----> (A_client + B进程)


 

你可能感兴趣的:(coding)