本帖最后由 ぉ沙皮狗的忧伤 于 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[1]); //服务器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一下对比传输文件是否一致
代码在附件中
|