
让技术·支撑梦想
点击上方蓝字可以关注我们哦

首先把Ubuntu向开发板发送文件的流程做一下笔记,下一篇笔记就记录开发板如何接受文件....
上一篇笔记:Makefile文件的编写规则及实例
有很多小伙伴看不懂术语,所以这次小浩用口语方式表达这次笔记,可能表达能力欠佳,多多包涵。

1.说一下环境,虚拟机和开发板要在同一个局域网同一网段,而小浩这次用的是UDP协议来收发消息的,虽然说UDP不可靠,不稳定,在数据传递时,如果网络质量不好,就会很容易丢包,但UDP就是比TCP传输速度快,天下武功唯快不破.

2. 接下来,进入主题吧
a.创建一个UDP通信端点, 即socket();
b.准备好开发板的IP地址和端口号c. 然后把IPV4、端口号、IP地址放进sockaddr_in结构体,该结构体是系统封装的一个结构体
d.然后选择要发给开发板的文件
e.获取文件属性并发给开发板,则等待开发板回应
f.获得开发板允许后,把文件发给开发板
g.最后传输完毕,提示虚拟机发送成功
这个发送文件流程就是这么简单啦!!!

3.接下来我们看看代码,来看看我们实现的现场
/*
公众号:小浩笔记
备注:小浩除去头文件,减短篇幅,方便阅读
*/
//创建套接字函数
int Socket(int domain, int type, int protocol){
int sockfd = socket(domain, type, protocol);
if(sockfd == -1)
{
perror("创建UDP套接字失败");
exit(0);
}
return sockfd;
}
//绑定地址的函数
int Bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen){
if(bind(sockfd, addr, addrlen) == -1)
{
perror("绑定地址失败");
exit(0);
}
return 0;
}
//udp连接的函数
int Connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen){
int ret = connect(sockfd, addr, addrlen);
if(ret != 0)
{
perror("连接失败");
exit(0);
}
return ret;
}
//读文件函数
void readfile(char *content, const char *filename, int size){
int fd = open(filename, O_RDONLY);
if(fd == -1)
{
perror("文件无法打开");
exit(0);
}
int total = 0;
while(total < size)
{
int n = read(fd, content+total, size);
if(n == -1)
{
perror("读取文件失败");
exit(0);
}
total += n;
}
close(fd);
}
int main(int argc, char **argv){
if(argc != 3)
{
printf("参数错误!用法:\n");
exit(0);
}
// 1,创建UDP通信端点
int sockfd = Socket(AF_INET, SOCK_DGRAM, 0);
// 2,准备开发板的地址(IP+PORT)
struct sockaddr_in addr;
socklen_t len = sizeof(addr);
bzero(&addr, len);
addr.sin_family = AF_INET; // 指定协议族,这里是IPv4地址
addr.sin_addr.s_addr = inet_addr(argv[1]); // IP地址
addr.sin_port = htons(atoi(argv[2])); // PORT端口号
// 3,选择要发送给开发板的文件
char filename[50];
bzero(filename, 50);
gets (filename);
// 4,获取文件属性信息并发送给开发板
struct stat info;
bzero(&info, sizeof(info));
stat(filename, &info);
struct fileinfo finfo;
bzero(&finfo, sizeof(finfo));
strncpy(finfo.name, filename, 50);
finfo.size = info.st_size;
printf("名字:%s\n大小:%d\n", finfo.name, finfo.size);
int n = sendto(sockfd, &finfo, sizeof(finfo), 0,
(struct sockaddr *)&addr, len);
if(n > 0)
printf("发送文件属性信息成功,发了%d个字节\n", n);
else
{
perror("发送文件属性信息失败");
exit(0);
}
// 5,等待开发板的确认
char response;
recvfrom(sockfd, &response, 1, 0, NULL, NULL);
if(response == 'n')
return 0;
// 6,将文件内容放入content中
char *content = calloc(1, finfo.size);
readfile(content, finfo.name, finfo.size);
// 7,开始给开发板发送文件的内容
int total = 0;
while(total < finfo.size)
{
int remain = finfo.size-total;
int m = remain>1024 ? 1024 : remain;
// 每次最多发1k数据量
total += sendto(sockfd, content+total, m, 0,
(struct sockaddr *)&addr, len);
}
printf("发送完毕\n");
close(sockfd);
return 0;
}
小浩笔记

