读书人

echo的传输时间有关问题

发布时间: 2012-05-09 12:13:59 作者: rapoo

echo的传输时间问题
最近在做ipv6下面的数据传输测试
自己弄了个程序,但是具体传输时间一直不知道怎么解决
这个是服务器端的

C/C++ code
#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <sys/types.h>#include <stdlib.h>#include <stdio.h>#include <netdb.h>#include <string.h>#include <signal.h>static  int listen_fd  = -1;void exit_handler(int no){    close(listen_fd);    exit(0);}int main(int argc,char * argv[]){    unsigned short port = 10002;    char buffer[1024000];    int  len,i;    signal(SIGTERM,exit_handler);    signal(SIGINT,exit_handler);       /* ipv 6 地址 */    struct sockaddr_in6 server_addr;    struct sockaddr_in6 client_addr;    socklen_t sockaddr_len = sizeof(struct sockaddr_in6);    if(argc > 1)        port = (unsigned short)atoi(argv[1]);    /* 第一步:创建TCP 侦听SOCKET*/    listen_fd  = socket(PF_INET6,SOCK_STREAM,0);    if(listen_fd == -1)    {        perror("socket");    }    /* 第二步:设置侦听端口 */       memset((void *)&server_addr,0,sizeof(server_addr));            server_addr.sin6_family = AF_INET6 ; /* ipv6 */    server_addr.sin6_port = htons(port);    server_addr.sin6_addr = in6addr_any;    if(bind(listen_fd,(struct sockaddr *)&server_addr,sockaddr_len)!=0)    {        perror("bind");        exit_handler(0);    }    /* 第三步:通知内核开始侦听 ,这里是非阻塞 */    if(listen(listen_fd,20)!= 0)    {        perror("listen");        exit_handler(0);    }    fprintf(stdout,"TCP echo server ,listen on %d\n",port);    /* 第四步:开始用等待客户端的联接 */    while(1)    {        int new_fd ;                memset((void *)&client_addr,0,sizeof(client_addr));                   sockaddr_len = sizeof(client_addr);        /* 没有客户端联接,将会这里阻塞*/        new_fd = accept(listen_fd,(struct sockaddr *)&client_addr,&sockaddr_len);        if(new_fd == -1)            continue;                      fprintf(stdout,"client connect: ip %s,port %d\n",inet_ntop(AF_INET6, (void *)&(client_addr.sin6_addr),buffer, sockaddr_len),ntohs(client_addr.sin6_port));                 /* 做ECHO操作*/        len =  recv(new_fd,buffer,sizeof(buffer),0);        if(len <=0)            continue;        if(strncmp("exit",buffer,4)!=0)                 send(new_fd,buffer,len,0);                          close(new_fd);    }    fprintf(stdout,"close TCP server\n%d");      exit_handler(0);}

这个是客户端的
C/C++ code
#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <sys/types.h>#include <stdlib.h>#include <stdio.h>#include <netdb.h>#include <string.h>#include <signal.h>#include <time.h>#include <sys/time.h>static  int tcp_fd  = -1;void exit_handler(int no){   close(tcp_fd);    exit(0);}int main(int argc,char * argv[]){   unsigned short port = 10002;    unsigned char ip[512] = "fe80::230:1bff:fe3e:a3c6";    char buffer[10240000];    ssize_t  len;    int a;    int   tv44;   int Datasize; struct timeval tv; struct timeval tv1; struct timeval tv2;        signal(SIGTERM,exit_handler);    signal(SIGINT,exit_handler);       struct sockaddr_in6 server_addr;        socklen_t sockaddr_len = sizeof(struct sockaddr_in6);   if(argc > 1)      //port = (unsigned short)atoi(argv[1]);       Datasize =(unsigned short)atoi(argv[1]);   for(a=0;a<atoi(argv[1]);a++)      buffer[a]='1';    if(argc > 2)       strncpy(ip,argv[2],sizeof(ip)-1);    /* 第一步:创建TCP 侦听SOCKET*/    tcp_fd  = socket(PF_INET6,SOCK_STREAM,0);     if(tcp_fd == -1)       {          perror("socket");       }   /* 第二步:可选操作bind,如果没有bind,TCP协议栈自动选一个端口 */    /* 第三步:联接服务器 */    memset((void *)&server_addr,0,sizeof(server_addr));    server_addr.sin6_family = AF_INET6 ; /* ipv4 */      server_addr.sin6_port = htons(port);     len =inet_pton(AF_INET6, ip, (void *)&(server_addr.sin6_addr));         printf("len=%d\n",len);/* success = 1 */    #if 0     if(len != 0)        {            perror("inet_pton");              exit_handler(0);        }#endif      fprintf(stdout,"connect TCP echo server %s:%d\n",ip,(int)port);     if(connect(tcp_fd,(struct sockaddr *)&server_addr,sockaddr_len) != 0)       {          perror("connect");            exit_handler(0);       }    while(1)      {         //gettimeofday(&tv,NULL);   //接受发送时间         /* if(fgets(buffer,sizeof(buffer)-1,stdin)== NULL)             {                perror("fgets");              continue;             }                    if(strncmp(buffer,"exit",4) == 0)               {                 send(tcp_fd,"exit",5,0);                    exit_handler(0);                      break;                          }*/            len = strlen(buffer)+1;gettimeofday(&tv,NULL);   //接受发送时间            if((len  = send(tcp_fd,buffer,len,0))<= 0)               {                  perror("send");                     continue;               }//gettimeofday(&tv1,NULL);  //收受回复时间                           len =  recv(tcp_fd,buffer,len,0);              if(len <= 0)                   {                      perror("recv");                          continue;                   }        gettimeofday(&tv1,NULL);  //收受回复时间            tv44=tv1.tv_usec-tv.tv_usec;             fprintf(stdout,"server > %s\n%ums\n",buffer,tv44);                       } }  /* main */ 



有2个问题 第一 传输时间很不准。从1mb到8mb所有的传输时间居然都差不多。想请教下 如何去设置 麻烦详细解说 最好
代码添加下。万分感谢。
第二 因为是用的2台pc做的。其中一台 如果写上buff【10240000】 编译会通过,但是执行就没问题。但是
另一台电脑就没有这种问题出现。
最后想请教下 lunix下面有没有测试数据传输速度的软件。。

在线坐等。。。

[解决办法]
可能是10m栈内存太大了
ulimit -s
可以查看栈区的大小 看是否有10m

读书人网 >UNIXLINUX

热点推荐