利用TCP协议与socket文件完成两个进程之间的网络通信,这里分为服务端与客户端,服务端则是在云端运行的服务器进程,客户端则为计算机本地运行的进程。
服务器
头文件
首先是服务器里面各种头文件:
1 #include <stdio.h>
2 #include <string.h>
3 #include <unistd.h>
4 #include <sys/socket.h>
5 #include <netinet/in.h>
6 #include <arpa/inet.h>
创建服务器的socket文件
首先是创建服务器的socket文件,其中AF_INET为基本32IP地址通信,IPv4版本,若创建失败则返回失败原因
8 int main()
9 {
10 printf("服务器创建socket...\n");
11 int sockfd = socket(AF_INET,SOCK_STREAM,0);
12 if(0 > sockfd)
13 {
14 perror("socket");
15 return -1;
16 }
准备地址
然后是准备地址,注意端口号要与客户端的端口号一值,IP地址则是服务器的私网IP地址。
18 printf("准备地址...\n");
19 struct sockaddr_in addr = {};
20 addr.sin_family = AF_INET;
21 addr.sin_port = htons(7777);//端口号要一致
22 addr.sin_addr.s_addr = inet_addr("172.16.27.135");//172.16.27.135为服务器的私网地址
23 socklen_t len = sizeof(addr);
绑定socket与地址
利用bind函数绑定socket文件与函数,失败则打印失败原因
25 printf("绑定socket与地址...\n");
26 if(bind(sockfd,(struct sockaddr*)&addr,len))
27 {
28 perror("bind");
29 return -1;
30 }
设置监听
利用listen函数设置监听,失败则打印失败原因
32 printf("设置监听...\n");
33 if(listen(sockfd,5))
34 {
35 perror("listen");
36 return -1;
37 }
等待客户端连接
使用一个死循环,因为服务器基本上都是一直在运行的,如果连接失败则返回失败原因然后继续等待连接
39 printf("等待客户端连接...\n");
40 for(;;)
41 {
42 struct sockaddr_in addrcli = {};
43 int clifd = accept(sockfd,(struct sockaddr*)&addrcli,&len);
44 if(0 > clifd)
45 {
46 perror("accept");
47 continue;
48 }
运行子程序收发消息
然后创建一个子程序,不断收发消息,当收到quit时断开与客户端的连接,服务器还是继续在运行。
50 if(0 == fork())
51 {
52 //运行子程序,收发消息
53 char buf[1024] = {};
54 for(;;)
55 {
56 printf("read:");
57 read(clifd,buf,sizeof(buf));
58 printf("%s\n",buf);
59 if(0 == strcmp("quit",buf))
60 {
61 close(clifd);
62 return 0;
63 }
64 printf(">");
65 gets(buf);
66 write(clifd,buf,strlen(buf)+1);
67 }
68 }
69 }
70
71 }
然后以下则是客户端
客户端
头文件、与socket创建、准备地址
头文件、与socket文件创建和准备地址与服务器的程序代码差不多,除了ip地址需要填写的是服务器的公网ip地址。
1 #include <stdio.h>
2 #include <string.h>
3 #include <unistd.h>
4 #include <sys/socket.h>
5 #include <netinet/in.h>
6 #include <arpa/inet.h>
7
8 int main()
9 {
10 printf("与服务器创建socket...\n");
11 int sockfd = socket(AF_INET,SOCK_STREAM,0);
12 if(0 > sockfd)
13 {
14 perror("socket");
15 return -1;
16 }
17
18 printf("准备地址...\n");
19 struct sockaddr_in addr = {};
20 addr.sin_family = AF_INET;
21 addr.sin_port = htons(7777);//端口号要一致
22 addr.sin_addr.s_addr = inet_addr("47.96.239.112");//服务器的公网ip 地址
连接服务器
运用connect函数将客户端连接到服务器上去
24 printf("连接服务器...\n");
25 socklen_t len = sizeof(addr);
26 if(connect(sockfd,(struct sockaddr*)&addr,len))
27 {
28 perror("connect");
29 return -1;
30 }
客户端连接并且读写操作
客户端连接上服务器进行读写操作进行通信,当输入quit则通信结束,客户端断开与服务器的连接
33 printf("客户端连接...\n");
34 for(;;)
35 {
36 char buf[1024] = {};
37 printf(">");
38 gets(buf);
39 write(sockfd,buf,strlen(buf)+1);
40 if(0 == strcmp("quit",buf))
41 {
42 printf("通信结束!\n");
43 break;
44 }
45 printf("read:");
46 read(sockfd,buf,sizeof(buf));
47 printf("%s\n",buf);
48 }
49 close(sockfd);//断开连接
50
51 }
程序运行结果
完成了计算机本地进程与云端服务器进程间的通信