分享进程间通信有哪几种方式( 二 )


其中 socket表示服务器端的套接字描述符 , address 表示需要绑定的本地地址 , 是一个 struct sockaddr_un 类型的变量 , address_len 表示该本地地址的字节长度 。
8.3 监听
服务器端套接字创建完毕并赋予本地地址值(名称 , 本例中为Server Socket)后 , 需要进行监听 , 等待客户端连接并处理请求 , 监听使用 listen 系统调用 , 接受客户端连接使用accept系统调用 , 它们的原形如下:
01int listen(int socket, int backlog);02int accept(int socket, struct sockaddr *address, size_t *address_len);复制代码int listen(int socket, int backlog);int accept(int socket, struct sockaddr *address, size_t *address_len);
其中 socket 表示服务器端的套接字描述符;backlog 表示排队连接队列的长度(若有多个客户端同时连接 , 则需要进行排队);address 表示当前连接客户端的本地地址 , 该参数为输出参数 , 是客户端传递过来的关于自身的信息;address_len 表示当前连接客户端本地地址的字节长度 , 这个参数既是输入参数 , 又是输出参数 。
8.4 连接服务器
客户端套接字创建完毕并赋予本地地址值后 , 需要连接到服务器端进行通信 , 让服务器端为其提供处理服务 。
对于SOCK_STREAM类型的流式套接字 , 需要客户端与服务器之间进行连接方可使用 。连接要使用 connect 系统调用 , 其原形为
01int connect(int socket, const struct sockaddr *address, size_t address_len);复制代码int connect(int socket, const struct sockaddr *address, size_t address_len);
其中socket为客户端的套接字描述符 , address表示当前客户端的本地地址 , 是一个 struct sockaddr_un 类型的变量 , address_len 表示本地地址的字节长度 。实现连接的代码如下:
01connect(client_sockfd, (struct sockaddr*)&client_address, sizeof(client_address));复制代码connect(client_sockfd, (struct sockaddr*)&client_address, sizeof(client_address));
8.5 相互发送接收数据
无论客户端还是服务器 , 都要和对方进行数据上的交互 , 这种交互也正是我们进程通信的主题 。一个进程扮演客户端的角色 , 另外一个进程扮演服务器的角色 , 两个进程之间相互发送接收数据 , 这就是基于本地套接字的进程通信 。发送和接收数据要使用 write 和 read 系统调用 , 它们的原形为:
01int read(int socket, char *buffer, size_t len);02int write(int socket, char *buffer, size_t len);复制代码int read(int socket, char *buffer, size_t len);int write(int socket, char *buffer, size_t len);
其中 socket 为套接字描述符;len 为需要发送或需要接收的数据长度;
对于 read 系统调用 , buffer 是用来存放接收数据的缓冲区 , 即接收来的数据存入其中 , 是一个输出参数;
对于 write 系统调用 , buffer 用来存放需要发送出去的数据 , 即 buffer 内的数据被发送出去 , 是一个输入参数;返回值为已经发送或接收的数据长度 。
8.6 断开连接
交互完成后 , 需要将连接断开以节省资源 , 使用close系统调用 , 其原形为:
01int close(int socket);复制代码int close(int socket);
关于进程间通信的方法就给大家讲解到这里了 , 对于进程充满好奇心的伙伴 , 可以仔细看看小编整理的以上内容哦!