Linux开发_文件发送与接收

【摘要】 介绍文件发送、文件接收、线处理服务器接收、获取天气预报等知识点。
任务1:网络编程 1.1 练习题说明 1.​ 实现tcp服务器与tcp客户端之间的基本通信,收发数据 (按照上课的思路流程看函数文档)
2.​ 实现tcp服务器与tcp客户端之间的文件传输。(单个文件传输)
验证方式: (1) 同一台电脑演示   (2)同桌之间演示
考虑的问题:
(1)​ 网络的传输环境,考虑应答问题
(2)​ 数据丢包之后如何处理? 可以重发
(3)​ 超时处理
(4)​ 服务器与客户端之间连接断开处理。(客户端和服务器两边都需要重新连接)
文件传输可以在广告机中使用。
(5)​ 每个数据的单位: 分包发送
(扩展要求): 显示接收进度百分比,显示接收的文件名称,推荐: 定义结构体(使用数据结构)
3.​ (扩展)实现tcp服务器与tcp客户端之间的目录传输(一级目录)。
4.​ (扩展)实现网络聊天室(模仿qq群发送消息的效果)
(1)​ 加入进去的成员都是客户端
(2)​ 服务器负责给各个客户端转发消
​ 一般情况下,推荐最大每次传输的字节数不超过1024字节。
(1)文件发送客户端
#include #include #include #include #include #include #include #include #include #include /*tcp客户端:1. sockt创建套接字2. 连接服务器*/int socket_cfd; /*保存客户端套接字*/int main(int argc,char **argv){ if(argc!=4) { printf(./server \n); exit(-1); } file *file=fopen(argv[3],wb); if(file==null) { printf(文件创建失败!); exit(0); } int err; //存放返回值状态 /*1. 创建套接字*/ socket_cfd=socket(af_inet,sock_stream,0); if(socket_cfd0) { err=read(socket_cfd,rx_buff,100); if(err==0 && data==1) { printf(服务器已经与客户端断开连接!\n); break; } fwrite(rx_buff,1,err,file);//写入数据 printf(客户端成功接收%d个字节\n,err); write(socket_cfd,&ack,4); //发送应答信号。 } } close(socket_cfd); fclose(file); return 0;} (2)文件发送客户端
#include #include #include #include #include #include /*tcp服务器:1. sockt创建套接字2. bind绑定端口3. 设置监听的数量4. 等待客户端连接*/int socket_sfd; /*保存了服务器端的套接字*/int socket_cfd; /*已经连接成功的客户端套接字*//*服务器是发送端*/int main(int argc,char **argv){ if(argc!=4) { printf(./server \n); exit(-1); } file *file=fopen(argv[3],rb); if(file==null) { printf(文件打开失败!\n); exit(0); } int err; //存放返回值状态 /*1. 创建套接字*/ socket_sfd=socket(af_inet,sock_stream,0); if(socket_sfd  
任务2:线程编程 #include
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
compile and link with -pthread.
-lpthread
理解: 一个线程就是一个while(1)。
[root@wbyq linux-share-dir]# gcc app.c
/tmp/cccos4tk.o: in function `main':
app.c:(.text+0x69): undefined reference to `pthread_create'
app.c:(.text+0x8d): undefined reference to `pthread_create'
collect2: ld 返回 1
[root@wbyq linux-share-dir]# gcc app.c -lpthread
练习:
1.​ 学习线程的基本使用
2.​ 实现一个服务器实现多个客户端的连接,实现通信。
思路: 一个客户端就是一个独立的线程。
3.​ 扩展练习: 实现服务器同时对多个客户端进行文件发送。
(1)​ 服务器连接上一个客户端就创建一个线程。
(2)​ 线程的函数需要写几个? 1个
1个函数需要考虑的问题: 函数的可重入性能!
需要考虑到资源抢占! 使用信号量!
1.​ crc16、crc32校验、
2.​ 和校验 ”abcd ” -->和
3.​ 异或校验。 (1) 文件加密解码
(2) 不添加三个变量,将两个变量的值交换
int a=666; int b=888;
4.​ md5值校验。
客户端:
#include #include /* see notes */#include #include //使用大小端转换函数. find /#include /*服务器端口号定义*/#define p_host 8080// ./app 192.168.18.3/*tcp客户端代码*/int main(int argc,char *argv[]){ if(argc!=2) { printf(参数错误:./app \n); return -1; } int clientfd; struct sockaddr_in server_address; //存放服务器的ip地址信息 memset(&server_address,0,sizeof(struct sockaddr_in)); //初始化内存空间 server_address.sin_family=af_inet; //ipv4协议 server_address.sin_port=htons(p_host); //端口号赋值 server_address.sin_addr.s_addr=inet_addr(argv[1]); //本地ip地址 /*1 .创建套接字*/ clientfd=socket(af_inet,sock_stream,0); if(clientfd<0) { printf(客户端网络套接字创建失败!\n); return -1; } /*2. 连接服务器*/ if(connect(clientfd,(const struct sockaddr *)&server_address,sizeof(struct sockaddr))!=0) { printf(客户端连接服务器失败!\n); return -1; } char buff[1024]; while(1) { gets(buff); write(clientfd,buff,strlen(buff)); } return 0;} 服务器:
#include #include /* see notes */#include #include //使用大小端转换函数#include #include #include #include #include #include //函数声明void *start_routine_1(void *dev);void *start_routine_2(void *dev);typedef void *(*start_routine) (void *);start_routine fun[]={start_routine_1,start_routine_2};pthread_t thread_id[2]; //存放线程的标识符int clientfd[2]; //保存tcp客户端的网络套接字struct sockaddr_in client_address[2]; //存放客户端的信息socklen_t address_len[2]; //存放客户端结构体信息的长度/*服务器端口号定义*/#define p_host 8080/*tcp服务器代码*/int main(int argc,char *argv[]){ int socketfd; struct sockaddr_in server_address; //存放服务器的ip地址信息 memset(&server_address,0,sizeof(struct sockaddr_in)); //初始化内存空间 memset(client_address,0,sizeof(struct sockaddr_in)*2); //初始化内存空间 server_address.sin_family=pf_inet; //ipv4协议 server_address.sin_port=htons(p_host); //端口号赋值 server_address.sin_addr.s_addr=inaddr_any; //本地ip地址 /*1 .创建套接字*/ socketfd=socket(pf_inet,sock_stream,0); if(socketfd<0) { printf(服务器网络套接字创建失败!\n); return -1; } /*2. 绑定端口,创建服务器*/ if(bind(socketfd,(const struct sockaddr *)&server_address,sizeof(struct sockaddr))!=0) { printf(服务器绑定端口失败!\n); return -1; } /*3. 设监听的端口数量*/ if(listen(socketfd,10)!=0) { printf(服务器端口监听失败!\n); return -1; } int i; for(i=0;i<2;i++) { address_len[i]=sizeof(struct sockaddr); //计算结构体大小 20 /*4. 等待客户端连接*/ if((clientfd[i]=accept(socketfd,(struct sockaddr *)&client_address[i],&address_len[i]))123.txt
注意: &是特殊的符号,需要使用单引号或者双引号括起来。
curl: 命令行的浏览器。
2.​ 调用二维码生成的接口
curl http://api.k780.com:88/?app=qr.get'&'data=www.wanbangee.com'&'level=l'&'size=6 >123.png
​ 练习:
1.​ 天气预报查询
查询的格式: ./app
2.​ 获取北京标准时间,显示出来
3.​ 二维码生成创建 运行格式: ./app
生成之后直接显示在屏幕上。可以使用eog命令
4.​ 车牌号的识别
5.​ 调用百度地图api接口 http://lbsyun.baidu.com/index.php?title=uri/api/web

怎样用Arduino制作便携式数据记录器
小米米聊将于2021年2月19日12点00分停止服务 停服后无法导出任何信息
鸿蒙系统2.0实力具备了 鸿蒙什么时候可以全线支持
煤粉仓为什么要安装在线监测分析仪
太阳能电池工作原理 太阳能电池与锂电池的区别
Linux开发_文件发送与接收
LED发光字制作方法
便携式电源箱的制作
整流与滤波电路
GBFC全球化金融生态是互联网时代的下个风口
14位高精度模数转换器SC1252(兼容ADI的AD9251)用于电源采集模块
OFDM收发机的设计框架、调制与解调
IBM宣布将为AMD的二代霄龙推出虚拟机云服务
2020年将会有近50万专业服务机器人用于商业领域
常用的焊接方法有哪些类型
小米宣布将从7月1日开始停止分发全球版MIUI Beta版
广电已获得的4.9GHz中频段只有60MHz带宽
全国首个基于“VR+AI”技术结合应用在杭州落地试点
高通正在寻求扩大苹果禁售令的范围以覆盖最新型号的iPhone
小鹏汽车第三季度净亏损11.49亿元