利用套接字创建socket文件完成本地两个进程之间的通信,这里分为进程A和进程B
进程A
头文件
进程A里面首先是各种头文件:
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <unistd.h>
5 #include <sys/types.h>
6 #include <sys/socket.h>
7 #include <sys/un.h>
宏
另外还另外定义了一个宏:
9 #define SOCK_FILE "/tmp/sock"
在Linux中tmp目录是一个临时文件目录,所以这边将socket文件存放在这个临时文件目录下。
创建socket文件
进入主函数后,首先需要创建socket文件,若失败则打印失败原因。
11 int main()
12 {
13 //创建socket
14 int sockfd = socket(AF_LOCAL,SOCK_DGRAM,0);
15 if(0 > sockfd)
16 {
17 perror("socket");
18 return -1;
19 }
准备地址
创建完socket文件则需要准备地址,确保能与另一个进程连通,其中AF_LOCAL为通信类型,这里用的是本地通信。
21 //准备地址
22 struct sockaddr_un addr = {};
23 addr.sun_family = AF_LOCAL;
24 strcpy(addr.sun_path,SOCK_FILE);
绑定
然后使用bind函数来进行绑定,注意由于结构体类型不一样,这里需要用到一个强制类型转换(struct sockaddr*)&addr。
26 //绑定
27 if(bind(sockfd,(struct sockaddr*)&addr,sizeof(addr)))
28 {
29 perror("bind");
30 return -1;
31 }
接收数据
由于本进程是接收另一个进程的消息,所以这边先创建一个字符类型的数组,然后不断读出socket文件内容并且打印出来,当读出quit时则通信结束。
33 //接收数据
34 char buf[1024] = {};
35 for(;;)
36 {
37 int ret = read(sockfd,buf,sizeof(buf));
38 if(0 > ret)
39 {
40 perror("read");
41 return -1;
42 }
43 printf("read:%s\n",buf);
44 if(0 == strcmp("quit",buf))
45 {
46 printf("通信完成!\n");
47 break;
48 }
49 }
关闭socket文件
最后是关闭socket文件,并且删除socket这个文件
51 //关闭socket
52 close(sockfd);
53 unlink(SOCK_FILE);
54 }
进程B
进程B中的头文件、宏、创建函数和准备地址都与进程A一样
1 #include <stdio.h>
2 #include <string.h>
3 #include <unistd.h>
4 #include <sys/types.h>
5 #include <sys/socket.h>
6 #include <sys/un.h>
7
8 #define SOCK_FILE "/tmp/sock"
9
10 int main()
11 {
12 //创建socket
13 int sockfd = socket(AF_LOCAL,SOCK_DGRAM,0);
14 if(0 > sockfd)
15 {
16 perror("socket");
17 return -1;
18 }
19
20 //准备地址
21 struct sockaddr_un addr = {};
22 addr.sun_family = AF_LOCAL;
23 strcpy(addr.sun_path,SOCK_FILE);
连接
然后是连接进程B到进程A的通信,失败则打印失败原因
25 //连接
26 if(connect(sockfd,(struct sockaddr*)&addr,sizeof(addr)))
27 {
28 perror("connect");
29 return -1;
30 }
发送数据
由于本进程是发送数据的,所以进行发送数据操作,不断写入socket文件,当输入quit时则通信结束
32 //发送数据
33 char buf[1024] = {};
34 for(;;)
35 {
36 printf(">");
37 gets(buf);
38 int ret = write(sockfd,buf,strlen(buf)+1);
39 if(0 > ret)
40 {
41 perror("write");
42 return -1;
43 }
44 printf("read:%s\n",buf);
45 if(0 == strcmp("quit",buf))
46 {
47 printf("通信完成!\n");
48 break;
49 }
50 }
关闭socket文件
然后最后关闭socket文件
52 //关闭socket
53 close(sockfd);
54 }
程序运行效果
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)