上篇笔记:虚拟机Ubuntu向开发板AMR传送文件
已经做好了虚拟机向开发板传送文件的笔记啦,然后有发送肯定有接收的,不然就发空气啦!接下来,写开发板如何接受虚拟机发送过来的文件的笔记。
废话不多说啦!进入主题吧!
大概描述一下此流程:
1.在开发板中,创建一个UDP的通信端点(即socket);
2.然后准备IP地址和端口号,并存放进sockaddr_in结构体中;
3.绑定好socket(即bind);
4.等待虚拟机发送文件属性过来,然后判断是否接受
5.然后给虚拟机做出应答
6.如果允许虚拟机发送文件,那么开始接受文件,否则就不接受,等待虚拟机再一次发文件属性来过,再判断是否接收。
接受文件的流程就是这样子啦,配合上篇笔记,就可以实现虚拟机向开发板传送文件这个功能了。
具体操作,请阅读代码:
/*
公众号:小浩笔记
备注:小浩除去头文件,减短篇幅,方便阅读
*/
//创建套接字函数
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;
}
//监听的函数
int Listen(int sockfd, int backlog)
{
int ret = listen(sockfd, backlog);
if(ret != 0)
{
perror("设置监听失败");
exit(0);
}
return ret;
}
//接受请求的函数
int Accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
{
int connfd = accept(sockfd, addr, addrlen);
if(connfd == -1)
{
perror("接收连接失败");
exit(0);
}
return connfd;
}
int main(int argc, char **argv)
{
if(argc != 3)
{
printf("参数错误!用法:<IP> <PORT>\n");
exit(0);
}
// 1,创建UDP通信端点
int sockfd = Socket(AF_INET, SOCK_DGRAM, 0);
// 2,准备开发板的地址(IP+PORT)并绑定好socket
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端口号
Bind(sockfd, (struct sockaddr *)&addr, len);
// 3,等待ubuntu发来文件的属性信息
struct fileinfo finfo;
struct sockaddr_in ubuntuAddr;
len = sizeof(ubuntuAddr);
while(1)
{
bzero(&finfo, sizeof(finfo));
bzero(&ubuntuAddr, len);
recvfrom(sockfd, &finfo, sizeof(finfo), 0,
(struct sockaddr *)&ubuntuAddr, &len);
printf("ubuntu发来文件:\n");
printf("名字:%s\n, 大小:%d\n", finfo.name, finfo.size);
printf("是否接收?[y/n]\n");
char response = getchar();
getchar(); // 吃掉回车符
// 给ubuntu发去确认信息:y/n
sendto(sockfd, &response, 1, 0,
(struct sockaddr *)&ubuntuAddr, len);
if(response == 'n')
continue;
// 开始接收ubuntu的文件内容
int fd = open(finfo.name, O_WRONLY|O_TRUNC|O_CREAT, 0666);
char buf[1024];
int total = 0;
while(total < finfo.size)
{
bzero(buf, 1024);
int n = recvfrom(sockfd, buf, 1024, 0, NULL, NULL);
if(n == -1)
{
perror("接收文件内容失败");
exit(0);
}
total += n;
write(fd, buf, n);
}
close(fd);
printf("接收完毕\n");
}
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)