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);
}