免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1289 | 回复: 0
打印 上一主题 下一主题

linux下udp大文件传输 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-02-01 09:54 |只看该作者 |倒序浏览
linux下用户数据报协议大文件传输
代码在 redhat下编译通过。
最大测试无差错传输文件:288M
最大测试传输速度:6.5M/S
包含了可以解决丢包问题的代码级实现方法。
服务器端:
CODE:
#include;
#include;
#include;
#include;
#include;
#include;
#include;
#include;
#include;
#include;
#include;
#include;
#include;
#define SERV_PORT 2500
#define MAX_SIZE 1024*40
void recvUDP(char name[20],int sockfd)
{
        int ret,fd;
        mode_t fdmode = (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
        char mesg[MAX_SIZE];
        fd_set rdset;
        struct timeval tv;
        int rlen,wlen;
        int i;
        fd = open(name,O_RDWR|O_CREAT|O_APPEND,fdmode);
        if(fd == -1)
        {
                printf("open file %s error:%n",name,strerror(errno));
                exit(-1);
        }
        for(i=0;;i++)
        {
                tv.tv_sec = 1;
                tv.tv_usec = 0;
                FD_ZERO(&rdset);
                FD_SET(sockfd,&rdset);
               
                ret = select(sockfd+1,&rdset,NULL,NULL,&tv);
                if(ret == -1)
                {
                        printf("select error %s\n",strerror(errno));
                        exit(-1);
                }
                else if(ret==0)
                {
                        printf("select timeout,continue circle\n");
                        continue;
                }
               
                if(FD_ISSET(sockfd,&rdset))
                {
                        memset(mesg,0,MAX_SIZE);
                        rlen = read(sockfd,mesg,MAX_SIZE);
                        if(rlen
客户端:
CODE:
#include;
#include;
#include;
#include;
#include;
#include;
#include;
#include;
#include;
#include;
#include;
#include;
#include;
#include;
#define MAX_SIZE 1024*40
#define SERV_PORT 2500
void connectUDP(char name[20],int sockfd,struct sockaddr *pservaddr,socklen_t servlen)
{
                char buf[MAX_SIZE];
                fd_set wrset;
                struct timeval tv;
                int rlen,wlen;
                int fd;
                int ret;
                int i;
                if(connect(sockfd,(struct sockaddr *)pservaddr,servlen) == -1)
                {
                        perror("connet error");
                        exit(1);
                }
                else
                        printf("connect server ok!\n");
                fd = open(name,O_RDONLY);
                if(fd==-1)
                {
                        printf("fopen error %s\n",strerror(errno));
                        exit(-1);
                }
               
                i=0;
               
                while(1)
                {        
                        tv.tv_sec = 1;
                        tv.tv_usec = 0;
                        
                        FD_ZERO(&wrset);
                        FD_SET(sockfd,&wrset);
                        
                        ret = select(sockfd+1,NULL,&wrset,NULL,&tv);
                        if(ret == -1)
                        {
                                printf("select error %s\n",strerror(errno));
                                exit(-1);
                        }
                        else if(ret==0)
                        {
                                printf("select timeout,continue circle\n");
                                continue;
                        }
                        
                        memset(buf,0,MAX_SIZE);
                        if(FD_ISSET(sockfd,&wrset))
                        {                                       
                                rlen = read(fd,buf,MAX_SIZE);
                                if(rlen ;\n");
                exit(1);
        }
        bzero(&servaddr,sizeof(servaddr));
        servaddr.sin_family= AF_INET;
        servaddr.sin_port = htons(SERV_PORT);
        
        if(inet_pton(AF_INET,argv[1],&servaddr.sin_addr)
Makefile
CODE:
all:send recv
send:send.c
        gcc -Wall send.c -o send
recv:recv.c
        gcc -Wall recv.c -o recv
        
clean:
        rm -rf send recv


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/26185/showart_474463.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP