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); }
阅读全文
0 0
- Linux下UDP传输文件示例
- LINUX下实现UDP传输文件
- Linux下socket传输文件示例
- linux下网络编程3:UDP广播传输文件
- linux下传输文件
- Socket传输文件示例(下)
- linux下udp客户端源码示例
- linux下udp服务器端源码示例
- linux下udp编程简单示例
- linux 下的UDP client/server 示例
- linux 下ssh 传输文件
- linux下使用传输文件
- udp传输文件
- linux下视频采集服务器(UDP传输、多线程模式)
- linux下视频采集服务器(UDP传输、多线程模式)
- linux 下qt 写udp传输 中文输入输出
- linux下视频采集服务器(UDP传输、多线程模式)
- Linux网络编程之使用UDP传输文件
- 破解pptx只读需要密码
- springmvc-7,处理模型数据
- 2017年排名前15的数据科学python库
- Android自定义视频播放器
- 2.3 分类算法:朴素贝叶斯
- Linux下UDP传输文件示例
- JAVA中的数组
- 黑客必读:蜜罐技术的前世今生
- 电商的概念
- 利用Apache Commons Email发送邮件
- 单点登录原理与简单实现
- iOS
- 修改BUG备注
- ubuntu 16.04 上网出现一些问题解决方法