用udp协议传输文件

头文件/宏定义

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <time.h>
#include <pthread.h>
#include <netinet/tcp.h>
#include <unistd.h>
#include <strings.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>

// 缓存区大小
#define BUFFER 512

客户端

/********************************************************************
 *
 * name  :  main    客户端
 * function :  使用udp网络协议从服务器发送音频文件到客户端
 * argument :
 *    @n  :arg
 *
 * retval  :  none
 * author  :  17647576169@163.com
 * date  :  2024年6月4日
 *  note  :
 *
 * *****************************************************************/

int main(int argc, char const *argv[])
{

    // 1.创建UDP套接字
    int udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
    if (udp_socket == -1)
    {
        fprintf(stderr, "udp socket error,errno:%d,%s\n", errno, strerror(errno));
        exit(1);
    }

    // 2.需要先绑定主机的端口和地址
    struct sockaddr_in host_addr;
    host_addr.sin_family = AF_INET;                                     // 协议族,是固定的
    host_addr.sin_port = htons(atoi(argv[1]));                          // 目标端口,必须转换为网络字节序
    host_addr.sin_addr.s_addr = inet_addr(argv[2]);                     // 目标地址 "192.168.64.xxx"  已经转换为网络字节序
    bind(udp_socket, (struct sockaddr *)&host_addr, sizeof(host_addr)); // 绑定

    // 3.创建接收文件
    int fd_mp3 = open("./my.mp3", "wb");
    if (fd_mp3 == -1)
    {
        fprintf(stderr, "open my.mp3 error,errno:%d,%s\n", errno, strerror(errno));
        exit(1);
    }

    // 设置缓存区
    char buf[BUFFER] = {0};

    // 3.循环发送数据
    while (1)
    {
        recvfrom(udp_socket, buf, sizeof(buf), 0, NULL, NULL);
        int write_fb= write(fd_mp3, &buf, BUFFER);
         if (write_fb == -1)
            {
                fprintf(stderr, "read demo.mp3 error,errno:%d,%s\n", errno, strerror(errno));
                exit(1);
            }
        bzero(buf, sizeof(buf));
    }

    return 0;
}

服务器

/********************************************************************
 *
 * name  :  main    服务器
 * function :  使用udp网络协议从服务器发送音频文件到客户端
 * argument :
 *    @n  :argc
 *              @n  :argv
 * retval  :  none
 * author  :  17647576169@163.com
 * date  :  2024年6月4日
 *  note  :
 *
 * *****************************************************************/

int main(int argc, char const *argv[])
{

    // 1.创建UDP套接字
    int udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
    if (udp_socket == -1)
    {
        fprintf(stderr, "udp socket error,errno:%d,%s\n", errno, strerror(errno));
        exit(1);
    }

    // 2.需要先绑定主机的端口和地址
    struct sockaddr_in host_addr;
    host_addr.sin_family = AF_INET;                                     // 协议族,是固定的
    host_addr.sin_port = htons(atoi(argv[1]));                          // 目标端口,必须转换为网络字节序
    host_addr.sin_addr.s_addr = inet_addr(argv[2]);                     // 目标地址 "192.168.64.xxx"  已经转换为网络字节序
    bind(udp_socket, (struct sockaddr *)&host_addr, sizeof(host_addr)); // 绑定

    // 3.发送打开音频文件
    int fd_mp3 = open("./demo.mp3", "rb");
    if (fd_mp3 == -1)
    {
        fprintf(stderr, "open demo.mp3 error,errno:%d,%s\n", errno, strerror(errno));
        exit(1);
    }

    // 计算发送次数
    char buf[BUFFER] = {0};

    struct stat stat_buf;
    statstat("./demo.mp3", &stat_buf);
    int cnt = stat_buf.st_size / BUFFER;
    if (stat_buf.st_size % BUFFER)
    {
        cnt++;
    }

    // 3.循环发送数据
    while (1)
    {
        for (int i = 0; i < cnt; i++)
        {
            int read_fb = read(fd_mp3, &buf, BUFFER);
            if (read_fb == -1)
            {
                fprintf(stderr, "read demo.mp3 error,errno:%d,%s\n", errno, strerror(errno));
                exit(1);
            }
            sendto(udp_socket, buf, strlen(buf), 0, (struct sockaddr *)&host_addr, sizeof(host_addr));
            bzero(buf, sizeof(buf));
        }
    }

    return 0;
}