LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1222|回复: 11

为什么我得网络程序,传输速率总是这么低?

[复制链接]
发表于 2005-7-14 08:49:30 | 显示全部楼层 |阅读模式
写了个SOCKET小程序,服务器端负责发送一个4MB的数据,而客户端则负责接收.测试了一下,两台电脑都是10MB网卡,都在局域网内,传送4MB文件竟然要16秒,也就是说才两百多KBs,请问为什么速率这么低啊,谢谢!
 楼主| 发表于 2005-7-14 08:52:27 | 显示全部楼层
服务器端的程序:
#define BACKLOG 10
#define SERVERFILENAME "server.dat"
int main(){                
        long int i,totalSize,temp1;       
        int sockfd;
        struct sockaddr_in myaddr,theiraddr;
        int newsockfd,addrlen;
        int j;
        int opt,optlen;
        char sockbuf[10];           
        char *ptr;
        FILE *fp;
        int totalRead;
        char bufsend[1024];
        int realRead;               
        if((fp=fopen(SERVERFILENAME,"r"))==NULL){
                fprintf(stderr,"fopen");
                exit(1);
        }
        if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){
                perror("socket");
                exit(1);
        }
        opt=1;
        optlen=sizeof(opt);
        setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,optlen);       
        memset(&myaddr,0,sizeof(struct sockaddr_in));
        memset(&theiraddr,0,sizeof(struct sockaddr_in));
        myaddr.sin_family=AF_INET;
        myaddr.sin_port=htons(MYPORT);
        myaddr.sin_addr.s_addr=htonl(INADDR_ANY);
        if(bind(sockfd,(struct sockaddr*) &myaddr,sizeof(struct sockaddr))==-1){
                perror("bind");
                exit(1);
        }
        if(listen(sockfd,BACKLOG)==-1){
                perror("listen");
                exit(1);
        }

        addrlen=sizeof(struct sockaddr);
        printf("server is listening...\n");
        if((newsockfd=accept(sockfd,(struct sockaddr*) &theiraddr, \
                &addrlen))==-1){
                        perror("accept");
                        exit(1);
        }       
        printf("now connected with %s\n",inet_ntoa(theiraddr.sin_addr));       
        while(!feof(fp)){
                realRead=fread(bufsend,1,sizeof(bufsend),fp);               
                if(send(newsockfd,bufsend,realRead,0)!=realRead){
                        perror("send");
                        exit(1);
                }               
        }  
        close(newsockfd);       
        close(sockfd);       
        return 0;
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-14 08:54:28 | 显示全部楼层
客户端:
#define PORT 9999

#define THEIRADDR "10.0.122.7"

#define BUFSIZE 1024


int main(){        
               

        int realRead;        
               

        int countTFlag=0;       


        time_t Tstart,Tstop,Tcost;
        int sockfd;

        struct sockaddr_in theiraddr;

        char recvbuf[BUFSIZE];       
       

        if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){

                perror("socket");

                exit(1);

        }

        memset(&theiraddr,0,sizeof(struct sockaddr_in));

        theiraddr.sin_port=htons(PORT);

        theiraddr.sin_family=AF_INET;

        theiraddr.sin_addr.s_addr=inet_addr(THEIRADDR);       

        if(connect(sockfd,(struct sockaddr*)&theiraddr,sizeof(struct sockaddr))==-1){

                perror("connect");

                exit(1);

        }       

        countTFlag=0;

        do{

                realRead=recv(sockfd,recvbuf,sizeof(recvbuf),0);               

                if(!countTFlag){
                        printf("now receiving data from server...\n");                       
                        Tstart=time(NULL);
                        countTFlag=1;

                }       

                               

        }while(realRead);       
        Tstop=time(NULL);
        printf("total time is %ds",Tstop-Tstart);       
        close(sockfd);       

        return 0;

}
回复 支持 反对

使用道具 举报

发表于 2005-7-14 09:14:07 | 显示全部楼层
10M网卡指的是10Mbps而非10MBps, 就是1.25MBps, 你的利用率到了20%, 不错了, 呵呵.
你那是局域网, 不是一根线直接相连,局域网里头其他人也要发送东西啊, 怎么可能就让你独占
网络一直把数据发完为止, 而且OS的socket实现本身就有延迟, 总之是不可能达到网卡的
额定功率的.

我这都是100Mbps的, 没法给你试试, 不过你那16秒好像也的确忒慢了点....
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-14 14:24:38 | 显示全部楼层
谢谢指点。
可是有一点我比较奇怪,我在10M网卡上用ftp下载软件,下载速率可以达到800KBps(不是Kbps)左右啊,请问这个是怎么做到的啊?
谢谢:)
Post by dieken_qfz
10M网卡指的是10Mbps而非10MBps, 就是1.25MBps, 你的利用率到了20%, 不错了, 呵呵.
你那是局域网, 不是一根线直接相连,局域网里头其他人也要发送东西啊, 怎么可能就让你独占
网络一直把数据发完为止, 而且OS的socket实现本身就有延迟, 总之是不可能达到网卡的
额定功率的.

我这都是100Mbps的, 没法给你试试, 不过你那16秒好像也的确忒慢了点....
回复 支持 反对

使用道具 举报

发表于 2005-7-15 20:42:12 | 显示全部楼层
ftp是用多线程下载的吗?
回复 支持 反对

使用道具 举报

发表于 2005-7-26 20:19:45 | 显示全部楼层
你的buffer值是1024太小了,调大一点,比如8096,多测试一些buffer值,选取一个最佳buffer值
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-16 15:35:58 | 显示全部楼层
ftp的下载软件就是windows下普通的leapftp或者flashfxp之类的。我不知道它们有没有多线程下载的
Post by kj501
ftp是用多线程下载的吗?
回复 支持 反对

使用道具 举报

发表于 2005-8-18 18:59:56 | 显示全部楼层
影音传送带不是也能ftp下载吗?很多
回复 支持 反对

使用道具 举报

发表于 2005-8-20 18:32:00 | 显示全部楼层
FTP软件的速度不是绝对准的,如果要排除因为多台主机共用资源造成影响,可以交叉线把两台机连起来测试
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表