编写一个基于 UDP 的文件收发软件,用来将文件发送给开发板。

更多资料请点击:我的目录
本篇仅用于记录自己所学知识及应用,代码仍可优化,仅供参考,如果发现有错误的地方,尽管留言于我,谢谢。

/*
	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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43793181/article/details/108554991