[X]关闭

网络编程_1day

文档创建者:ぉ沙皮狗的忧伤
浏览次数:5421
最后更新:2021-03-11
本帖最后由 ぉ沙皮狗的忧伤 于 2021-3-3 18:37 编辑

网络应用编程:实现跨机器跨操作系统通信封装:TCP/IP协议
三要素:
       IP地址:网络主机唯一标识,IP通过路由寻找网络接受主机
       端口:指定接受网络数据的应用程序(端口)
       服务类型:可靠与不可靠传输

网络架构的模型:
截图202103031127313503..png 截图202103031112531970..png
截图202103031129029623..png

TCP协议:
      是一种面向连接的传输协议,它能提高可靠性通信(即数据无误,数据无丢失,数据无重复性),适用于传输质量较高,以及大量数据通信
UDP协议:
      用户数据报协议,是不可靠传输协议,在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输,适用发送小尺寸数据,应答较困难的网络中适用,适用于广播/组播式的通信中,流媒体的数据传输


tcp sever端代码编写
1、添加头文件
  1. //1、添加头文件
  2. #include <stdio.h>
  3. #include <strings.h>
  4. #include <stdlib.h>
  5. #include <unistd.h>
  6. #include <sys/types.h>
  7. #include <sys/socket.h>
  8. #include <netinet/ip.h>
  9. #include <netinet/in.h>
  10. #include <arpa/inet.h>
复制代码

2、创建流失套接字
  1.         //创建流失套接字
  2.         //参数1-----地址族,AF_INET网络协议族
  3.         //参数2-----套接字类型,SOCK_STREAM使用TCP
  4.         //参数3-----protocol参数通常设备0
  5.         //返回值----成功socket ID,出错返回-1
  6.         serfd = socket( AF_INET, SOCK_STREAM, 0);
  7.         if(serfd < 0){
  8.                 perror("socket failed!\n");
  9.                 exit(1);
  10.         }
复制代码

3、绑定本地IP地址和指定接收数据端口
  1.         struct sockaddr_in self;
  2.         //初始化self结构体
  3.         bzero( &self, sizeof(self));
  4.         self.sin_family = AF_INET;              //选择ipv4协议
  5.         self.sin_port = htons(6666);             //转换为网络字节序端口
  6.         self.sin_addr.s_addr = inet_addr("172.18.21.222");
  7.         //绑定本机地址和端口
  8.         //参数1----文件描述符
  9.         //参数2----sockaddr_in结构,描述本机的端口和ip地址
  10.         //参数3----sockaddr地址结构体的长度
  11.         //返回值0或-1
  12.         ret = bind( serfd, (struct sockaddr *)&self, sizeof(self));
  13.         if(ret < 0){
  14.                 perror("bind failed!\n");
  15.                 exit(1);
  16.         }
复制代码

4、设置为监听模式:被动链接
  1. //4、设置为监听模式:被动链接
  2.         //listen监听套接字
  3.         //参数1-----被监听的套接字
  4.         //参数2-----指定正在等待的最大队列长度
  5.         //返回值----0或-1
  6.         ret = listen( serfd, 5);
  7.         if(ret < 0){
  8.                 perror("listen failed!\n");
  9.                 exit(1);
  10.         }
  11.         struct sockaddr_in cli;
  12.         bzero( &cli, sizeof(cli));
  13.         printf("wait client!\n");
复制代码

5、等待客户端链接
  1.         //等待客户端链接
  2.         //accept建立连接
  3.         //参数1-----文件描述符
  4.         //参数2-----sockaddr_in结构,描述本机的端口和ip地址
  5.         //参数3-----地址长度
  6.         //返回值,成功已建立的套接字,失败返回-1
  7.         int newfd = accept( serfd, (struct sockaddr *)&cli, sizeof(cli));
  8.         if(newfd < 0){
  9.                 perror("accpet failed!\n");
  10.                 exit(1);
  11.         }
  12.         //inet_ntoa-----将32位网络字节序二进制地址转换成点分十进制的字符串
  13.         printf("new client ip = %s port = %d ok\n", inet_ntoa(cli.sin_addr),\
  14.                         ntohs(cli.sin_port));
  15.         char buf[128];
复制代码

6、读写数据
  1. //读写数据
  2.         while(1){
  3.                 //初始化buf数组
  4.                 bzero( buf, 128);
  5.                 ret = read( newfd, buf, 127);
  6.                 if(ret < 0){
  7.                         perror("read newfd failed!\n");
  8.                         exit(1);
  9.                 }
  10.                 if(ret == 0){                                        //客户端关闭
  11.                         printf("server close\n");
  12.                         break;
  13.                 }
  14.                 printf("ret = %d buf:%s\n", ret, buf);
  15.                
  16.         }
复制代码



tcp 客户端代码编写
1、添加头文件
  1. #include <stdio.h>
  2. #include <strings.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <string.h>
  6. #include <sys/types.h>
  7. #include <sys/socket.h>
  8. #include <netinet/in.h>
  9. #include <netinet/ip.h>
  10. #include <arpa/inet.h>
复制代码

2、建立流失套接字
  1.         //建立流失套接字
  2.         //创建流失套接字
  3.         //参数1-----地址族,AF_INET网络协议族
  4.         //参数2-----套接字类型,SOCK_STREAM使用TCP
  5.         //参数3-----protocol参数通常设备0
  6.         //返回值----成功socket ID,出错返回-1
  7.         clifd = socket( AF_INET, SOCK_STREAM, 0);
  8.         if(clifd < 0){
  9.                 perror("socket failed!\n");
  10.                 exit(1);
  11.         }
复制代码
3、主动连接服务器:指定服务器IP和接收端口
  1.        //主动连接服务器:指定服务器IP和接收端口
  2.         struct sockaddr_in ser;
  3.         //初始化ser结构体
  4.         bzero( &ser, sizeof(ser));                        
  5.                
  6.         ser.sin_family = AF_INET;                        //选择IPV4协议
  7.         ser.sin_port = htons(6666);                        //要连接的服务器端口
  8.         ser.sin_addr.s_addr = inet_addr("172.18.21.222");        //服务器的ip
复制代码

4、连接服务器
  1.         //参数1----文件描述符
  2.         //参数2----sockaddr_in结构,描述本机的端口和ip地址
  3.         //参数3----sockaddr地址结构体的长度
  4.         //返回值0或-1
  5.         ret = connect( clifd, (struct sockaddr *)&ser, sizeof(ser));
  6.         if(ret < 0){
  7.                 perror("connetc failed!\n");
  8.                 exit(1);
  9.         }
  10.         printf("connect server ok\n");
  11.         char buf[128];
  12.         
复制代码
5、发送数据到服务器
  1.         //发送数据到服务器
  2.         while(1){
  3.                 fprintf( stderr, "input:");
  4.                 //初始化buf
  5.                 bzero( buf, 128);
  6.                 //从键盘获取数值
  7.                 fgets( buf, 127, stdin);
  8.                 //将buf里面的值通过clifd套接字发送到服务器中
  9.                 ret = write( clifd, buf, strlen(buf));
  10.                 if(ret < 0){
  11.                         perror("write failed!\n");
  12.                         exit(1);
  13.                 }
  14.                 //判断是否输入quit,如果输入了,则退出
  15.                 if(!strncmp( buf, "quit", 4)){
  16.                         break;
  17.                 }
  18.                
  19.         }
复制代码

编译并运行使用交叉编译器编译sever代码,在开发板上运行,使用gcc编译器编译client代码,在Ubuntu上运行
截图202103031827376386..png

先在板卡运行sever端,等待连接
截图202103031835018999..png

在ubuntu运行client端建立连接发送数据,


截图202103031836069226..png

代码在附件中

core.zip

9.33 KB, 下载次数: 227

发表评论已发布 2

猪猪

发表于 2021-3-11 10:13:47 | 显示全部楼层

不错,感谢
回复

使用道具 举报

ぉ沙皮狗的忧伤

发表于 2021-3-11 15:06:01 | 显示全部楼层


感兴趣我可以发点资料给你
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则