利用TCP协议和socket文件实现进程间网络通信

利用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 }

程序运行结果

完成了计算机本地进程与云端服务器进程间的通信
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值