1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 使用socket实现进程间通信

使用socket实现进程间通信

时间:2021-08-23 17:30:45

相关推荐

使用socket实现进程间通信

socket除了可以实现网络通信之外,还可以实现进程间通信,与网络通信一样,以一个服务端和一个客户端的方式存在

一、与网络通信上使用的不同之处

1.创建socket的过程

server_fd = socket(AF_UNIX, SOCK_STREAM, 0);// AF_UNIX, AF_LOCAL Local communication(本地,进程间通信)

2.绑定过程

struct sockaddr_un server_address;server_address.sun_family = AF_UNIX;strcpy(server_address.sun_path, "./process_communication");unlink("./process_communication");server_len = sizeof(server_address);bind(server_fd, (struct sockaddr *)&server_address, server_len);//与网络编程不一样的地方是服务器端bind的时候用的是sockaddr_un结构,客户端connect的时候用的也是sockaddr_un结构,而不是sockaddr_in或sockaddr。//sockaddr_un.sun_path的值是bind()函数生成的socket类型文件的路径,并且客户端与服务器端的这个sockaddr_un结构的sun_path是一致的

服务端:

#include<stdio.h>#include <stdlib.h>#include <string.h>#include <sys/un.h>#include <unistd.h>#include<sys/types.h>#include<sys/socket.h>int main(int argc,char *argv[]){char buf[1024];char send_msg[]="l`m server!";int msg_len;int server_fd,client_fd;int server_len,client_len;struct sockaddr_un server_address;struct sockaddr_un client_address;server_fd = socket(AF_UNIX, SOCK_STREAM, 0);server_address.sun_family = AF_UNIX;strcpy(server_address.sun_path, "./process_communication");unlink("./process_communication");server_len = sizeof(server_address);client_len = sizeof(client_address);bind(server_fd, (struct sockaddr *)&server_address, server_len);listen(server_fd,5);client_fd = accept(server_fd, (struct sockaddr *)&client_address,&client_len);while(1){if(-1 == (msg_len = read(client_fd, buf, sizeof(buf)))){perror("read");exit(-1);}printf("recv msg is : %s\n",buf);if(-1 == (msg_len = write(client_fd, send_msg, sizeof(buf)))){perror("write");exit(-1);}printf("send_msg is : %s\n",send_msg);}close(server_fd);close(client_fd);return 0;}

客户端:

#include<stdio.h>#include <stdlib.h>#include <string.h>#include <sys/un.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>int main(){char send_msg[1024];char recv_msg[1024];int sockfd;int ret;int address_len,result;struct sockaddr_un address;if(-1 == (sockfd = socket(AF_UNIX, SOCK_STREAM, 0))){perror("socket");return -1;}address.sun_family = AF_UNIX;strcpy(address.sun_path, "./process_communication");address_len = sizeof(address);result = connect(sockfd, (struct sockaddr *)&address,address_len);if(result == -1){if(0 != access("./process_communication", F_OK)){printf("[Warning]: Wait for Server socket Creating!!!\n");usleep(500 * 1000);if(-1 == connect(sockfd, (struct sockaddr *)&address,address_len)){perror("connect");return -1;}}else{perror("connect");return -1;}}while(1){memset(send_msg, 0, sizeof(send_msg));scanf("%s",send_msg);ret = write(sockfd,send_msg,sizeof(send_msg));if (ret <= 0){perror("send\n");}ret = read(sockfd,recv_msg, sizeof(recv_msg));if (ret <= 0){perror("read");exit(-1);}printf("recv msg is %s\n",recv_msg);}return 0;}

运行结果:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。