Linux下UDP传输文件示例

来源:互联网 发布:中国网络运营商有几家 编辑:程序博客网 时间:2024/05/16 19:54

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 5959struct 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 5959struct 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);  }
原创粉丝点击