Linux下UDP传输文件示例

本文介绍了一个使用UDP协议进行文件传输的实例,包括发送端和接收端的代码实现,并记录了传输过程中的时间消耗。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux在嵌入式操作系统中所占的比例是非常大的,现将自己在学习中的UDP的部分代码分享给大家,本文主要运用UDP来传输文件,代码如下:
send.c

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <fcntl.h>

//#define IP "192.168.0.99"
#define IP "127.0.0.1"
#define PORT 5959

struct data_t {
    int len;
    unsigned char buf[1024];
    unsigned short sum;
};


int sock_fd;
int addr_len;
struct sockaddr_in addra1, addra2;

int main(void)
{
    int ret = 0;
    int i;
    int fd;
    struct data_t data;
    unsigned short sum = 0;
    struct timeval startTime,endTime;  
    float Timeuse;  

    fd = open("./1.rmvb", O_RDWR );
    if ( 0 > fd ) {
        perror("open file error");
        return -1;
    }

    addra1.sin_family = AF_INET;
    addra1.sin_port = htons(PORT);
    addra1.sin_addr.s_addr = inet_addr(IP);
    sock_fd = socket(AF_INET, SOCK_DGRAM, 0 );
    if(0 > sock_fd)
    {
        perror("b socket");
    }
    addr_len = sizeof(addra2);
    gettimeofday(&startTime,NULL);  
    while ( 1 ) {
        bzero(&data, sizeof(struct data_t));
        data.len = read(fd, data.buf, 1024-1);
        for ( sum=0, i=0; i<data.len; i++ ) {
            sum += data.buf[i];
        }
        data.sum = sum;
        do {
            if(0 > sendto(sock_fd, &data, sizeof(struct data_t), 0, 
            (struct sockaddr *)&addra1, sizeof(addra1)))
            {
                perror("b sendto");
            }

            if(0 > recvfrom(sock_fd, &ret, sizeof(int), 0, 
            (struct sockaddr *)&addra2, &addr_len))
            {
                perror("b recvfrom");
            }
            //printf("ret:%d len:%d sum:%d\n", ret, data.len, data.sum);
        }while ( ret ); 
        if ( data.len < 1024-1 ) {
            printf("send over!\n");
            close(fd);
            break;
        }
    }
    gettimeofday(&endTime,NULL);  
    Timeuse = 1000000*(endTime.tv_sec - startTime.tv_sec) + (endTime.tv_usec - startTime.tv_usec);  
    Timeuse /= 1000000;  
    printf("Timeuse = %f\n",Timeuse);  
}

recv.c

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <fcntl.h>

#define PORT 5959

struct data_t {
    int len;
    unsigned char buf[1024];
    unsigned short sum;
};


int sock_fd;
int addr_len;
struct sockaddr_in addra, addrb;

int main(void)
{
    int ret = 0;
    int i;
    int fd;
    struct data_t data;
    unsigned short sum = 0;
    struct timeval startTime,endTime;  
    float Timeuse;  
    fd = open("1.rmvb", O_WRONLY | O_CREAT, 0666);
    if ( 0 > fd ) {
        perror("open file error");
        return -1;
    }
    sock_fd = socket(AF_INET, SOCK_DGRAM, 0 );
    if(0 > sock_fd)
    {
        perror("a socket");
    }

    addra.sin_family = AF_INET;
    addra.sin_port = htons(PORT);
    addra.sin_addr.s_addr = INADDR_ANY;

    if(0 > bind(sock_fd, (struct sockaddr *)&addra, sizeof(addra)))
    {
        perror("a bind");
        pthread_exit(NULL);
    }

    addr_len = sizeof(addrb);
    gettimeofday(&startTime,NULL);  
    while ( 1 ) {
        do {
            bzero(&data, sizeof(struct data_t));
            if(0 > recvfrom(sock_fd, &data, sizeof(struct data_t), 0, 
            (struct sockaddr *)&addrb, &addr_len))
            {
                perror("a recvfrom");
                //pthread_exit(NULL);
            }

            for ( sum=0, i=0; i<data.len; i++ ) {
                sum += data.buf[i];
            }
            if ( sum == data.sum ) {
                ret = 0;
            } else {
                ret = 1;
                printf("check sum error! len:%d sum:%d %d\n", data.len, sum, data.sum);
            }
            if(0 > sendto(sock_fd, &ret, sizeof(int), 0, 
            (struct sockaddr *)&addrb, addr_len))
            {
                perror("a sendto");
                pthread_exit(NULL);
            }
        //printf("ret:%d len:%d\n", ret, data.len); 
        }while ( ret );

        write(fd, data.buf, data.len);
        if ( data.len < 1024-1 ) {
            printf("recv over!\n");
            close(fd);
            break;
        } 
    }
    gettimeofday(&endTime,NULL);  
    Timeuse = 1000000*(endTime.tv_sec - startTime.tv_sec) + (endTime.tv_usec - startTime.tv_usec);  
    Timeuse /= 1000000;  
    printf("Timeuse = %f\n",Timeuse);  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值