ぉ沙皮狗的忧伤 发表于 2021-3-10 17:22:32

网络编程_3day_tcp传输文件

本帖最后由 ぉ沙皮狗的忧伤 于 2021-3-10 18:22 编辑

一、sever端代码编写代码编写流程
      ①、添加头文件
      ②、宏定义端口及ip
      ③、建立套接字
      ④、绑定本地IP和端口
      ⑤、设置监听模式,套接字变为被动等待连接
      ⑥、等待客户端连接
      ⑦、打开文件
      ⑧、接收数据保存到文件中
1、添加头文件

//添加头文件#
#include <string.h>
#include <strings.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <arpa/inet.h>

#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/in.h>

#include <arpa/inet.h>


2、宏定义端口及IP
#define SER_PORT         9999
#define SER_IP            "172.18.21.163"实现sever端代码
3、建立流失套接字
      //建立流失套接字
      //参数1----地址族,AF_INET网络地址族
      //参数2----套接字类型,SOCK_STREAM使用TCP
      //参数3----protocol通常设置为0
      //返回值---成功返回socket id 失败返回-1
      serfd = socket( AF_INET, SOCK_STREAM, 0);
      if(serfd < 0){
                perror("socket failed!\n");
                exit(1);
      }4、绑定本地IP和端口
      //绑定本地IP和端口
      struct sockaddr_in ser;
      bzero( &ser, sizeof(ser));

      ser.sin_family = AF_INET;            //使用网络地址族
      ser.sin_port = htons(SER_PORT);          //端口号9999
      inet_aton(SER_IP, &ser.sin_addr);         //转IP地址

      ret = bind( serfd, (struct sockaddr *)&ser, sizeof(ser));
      if(ret < 0){
                perror("bind failed!\n");
                exit(1);
      }5、设置为监听模式:套接字变为被动等待连接
       //设置监听模式:套接字变为被动等待连接
      ret = listen( serfd, 5);
      if(ret < 0){
                perror("listen failed!\n");
                exit(1);
      }6、等待客户端连接
       //等待客户端连接
      struct sockaddr_in cli;
      bzero( &cli, sizeof(cli));

      int len = sizeof(cli);

      int newfd = -1;

      newfd = accept( serfd, (struct sockaddr *)&cli, &len);
      if( newfd < 0){
                perror("accept failed!\n");
                exit(1);
      }

      printf("newfd = %d ip = %s port = %d\n", newfd,\
                        inet_ntoa(cli.sin_addr), ntohs(cli.sin_port));7、打开文件
      //打开一个文件
      int fd = -1;
      fd = open("./1.txt", O_CREAT|O_WRONLY, 0666);
      if(fd < 0){
                perror("open failed!\n");
                exit(1);
      }8、接收数据保存到文件中,从发过来文件中一直读数据,每读127字节,文件指针在文件的指向会往后偏移,直至读完该文件结束while循环
      //接收数据保存到文件中
      while(1){
                bzero( buf, sizeof(buf));
                ret = read( newfd, buf, 127);
                if(ret < 0){
                        perror("read failed!\n");
                        exit(1);
                }

                if(ret == 0){
                        printf("read over!\n");
                        break;
                }

                printf( "%s\n", buf);
                write( fd, buf, ret);
      }二、client端代码编写client端代码编写流程
      ①、添加头文件
      ②、建立流失套接字
      ③、主动连接服务器
      ④、打开一个文件
      ⑤、发送数据到服务器

1、添加头文件

#include <string.h>
#include <strings.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <fcntl.h>

#include <netinet/in.h>
#include <netinet/ip.h>

#include <arpa/inet.h>2、建立流失套接字
      //建立流失套接字
      //参数1-----地址协议族,AF_INET网络协议族
      //参数2-----套接字类型,SOCK_STREAM使用TCP协议
      //参数3-----protocol参数通常设置0
      //返回值----成功返回socket id,失败返回-1
      clifd = socket( AF_INET, SOCK_STREAM, 0);
      if(clifd < 0){
                perror("socket id failed!\n");
                exit(1);
      }3、连接服务器
      //主动连接服务器
      struct sockaddr_in ser;
      bzero( &ser, sizeof(ser));

      ser.sin_family = AF_INET;
      ser.sin_port = htons(9999);                //要连接的服务器端口
      ser.sin_addr.s_addr = inet_addr(argv);      //服务器IP地址

      ret = connect( clifd, (struct sockaddr *)&ser, sizeof(ser));
      if(ret < 0){
                perror("connect failed!\n");
                exit(1);
      }

      printf("connect server ok!\n");4、打开一个文件
      //打开一个文件
      int fd = open("./1.txt", O_RDONLY);
      if(fd < 0){
                perror("open failed!\n");
                exit(1);
      }
5、发送数据到服务器,每次从文件中读128个数据出来写入套接字clifd中
      //发送数据到服务器
      while(1){
                bzero( buf, 128);
                //先从文件读数据到buf中
                ret = read( fd, buf, 127);
                if(ret < 0){
                        perror("read 1.txt failed!\n");
                        exit(1);
                }

                if(ret == 0){      //读到文件末尾
                        printf("send ok!\n");
                        break;
                }
               
                ret = write( clifd, buf, sizeof(buf));
                if(ret < 0){
                        perror("write file failed!\n");
                        exit(1);
                }
      }
三、编译并允许代码使用gcc编译sever代码,使用交叉编译工具编译client代码

先执行sever端代码。然后在板卡上执行client代码,传输1.txt文件,cat一下对比传输文件是否一致


代码在附件中
页: [1]
查看完整版本: 网络编程_3day_tcp传输文件