网络编程_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]