欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-27 21:42:07
更多资料请点击:我的目录本篇仅用于记录自己所学知识及应用,代码仍可优化,仅供参考,如果发现有错误的地方,尽管留言于我,谢谢。/*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