编写一个基于 UDP 的文件收发软件,用来将文件发送给开发板。
程序员文章站
2022-07-03 09:06:26
更多资料请点击:我的目录本篇仅用于记录自己所学知识及应用,代码仍可优化,仅供参考,如果发现有错误的地方,尽管留言于我,谢谢。/*server部分:*/#include #include #include #include #include #include #include
更多资料请点击:我的目录
本篇仅用于记录自己所学知识及应用,代码仍可优化,仅供参考,如果发现有错误的地方,尽管留言于我,谢谢。
/*
server部分:
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
struct fileinfo //结构体存放文件属性
{
char name[50]; //文件名
int size; //文件大小
};
int main()
{
int sockfd = socket(AF_INET, SOCK_DGRAM, 0); //创建UDP套接字
struct sockaddr_in addr; //结构体存放接收方的IP地址、端口号
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY); //自动获取本机IP
addr.sin_port = htons(10086); //设置端口号
bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)); //绑定地址
char *buf;
while(1)
{
struct fileinfo info; //结构体存放文件属性
bzero(&info, sizeof(info));
recvfrom(sockfd, &info, sizeof(info), 0, NULL, NULL);
printf("文件名:%s,文件大小:%d\n",info.name,info.size);
int fd = open(info.name, O_CREAT|O_TRUNC|O_WRONLY, 0666);//创建对应的文件
int size = info.size>= 2*1024 ? 2*1024 : info.size; //文件大小小于2k一次接收完毕
buf = calloc(1, size);
int total = 0; //总接收量
while(total < info.size)
{
bzero(buf, size);
int m = recvfrom(sockfd, buf, size, 0, NULL, NULL);
if(m <= 0)
{
perror("recvfrom失败");
break;
}
write(fd, buf, m); //写入数据
total += m;
}
close(fd);
}
return 0;
}
/*
client部分:
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
struct fileinfo //结构体存放文件属性
{
char name[50]; //文件名
int size; //文件大小
};
int main()
{
int sockfd = socket(AF_INET, SOCK_DGRAM, 0); //创建UDP套接字
struct sockaddr_in addr; //结构体存放接收方的IP地址、端口号
socklen_t len = sizeof(addr);
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("192.168.1.158"); //接收方IP地址
addr.sin_port = htons(20000); //接收方端口地址
char *buf;
int fd;
while(1)
{
struct fileinfo info; //结构体存放文件属性
bzero(&info, sizeof(info));
printf("请输入你要发送的文件:\n");
fgets(info.name, 50, stdin); //获取文件名
if((fd=open(strtok(info.name,"\n"), O_RDONLY)) < 0)
{
perror("打开文件失败");
continue;
}
struct stat finfo; //文件属性结构体
stat(info.name, &finfo);
info.size = finfo.st_size; //获取文件大小
sendto(sockfd, &info, sizeof(info), 0, //发送文件的属性
(struct sockaddr *)&addr, len);
int size = info.size>=2*1024 ? 2*1024 : info.size; //文件大小小于2k则一次发送
buf = calloc(1, size); //最多2k
int total = 0; //总发送量
while(total < info.size)
{
int n = read(fd, buf, size); //读取文件内容
if(n <= 0)
break;
int m = sendto(sockfd, buf, n, 0, //发送文件内容
(struct sockaddr *)&addr, len);
if(m <= 0)
{
perror("sendto失败");
break;
}
total += m;
}
}
return 0;
}
本文地址:https://blog.csdn.net/weixin_43793181/article/details/108554991