论坛: 编程破解 标题: RoundTrip Time  复制本贴地址    
作者: cimsxiyang [cimsxiyang]    版主   登录
测试:RTT
动作描述:server从client接收数据,并立即将接收到的数据原样回传给clinet,client向server发数据,然后立即接收从server原样返回的数据
---------------public.h----------------------
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <netdb.h>
#include <strings.h>
#include <signal.h>
#include <sys/time.h>
#include <poll.h>

#define SERVER_PORT     2090  /* 服务器端口号 */
#define MAXBUFSIZE (1024 * 100)  /* 发送和接收缓存的最大长度 */
-----------------client.c----------------------------------
#include "public.h"
char buff[MAXBUFSIZE]; /* 发送和接收缓存 */
       int send_size[5]={10, 100, 1000, 10000, 100000}; /* 发送数据大小 */
     
       main(argc, argv)
        int argc;
        char *argv[];
       {
       int                     sockfd=0;   /* 插口描述符 */
       struct sockaddr_in      serveraddr; /* 服务器地址 */
       int mode=0; /* 阻塞模式 */
       int rcount=0; /* 接收次数 */
       int slen, rlen, len; /* 发送和接收长度变量 */
       int rdt; /* 记录RoundTrip时间 */
       int i,j; /* 循环变量 */
       struct timeval tv1,tv2;  /* 时间结构变量 */
    
       if (argc <2)
        {
         printf("使用方法:tcp_client <server_IP_address>\n");
         exit(0);
        }
    
        for(;;) /* 循环等待连接成功 */
         {
          /* 产生TCP 插口 */
          if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
           {
             printf("产生插口失败,退出\n");
             exit(1);
           }
    
          /* 填写服务器地址结构 */
          bzero((char *) &serveraddr, sizeof(struct sockaddr_in));
          serveraddr.sin_family      = AF_INET;
          serveraddr.sin_port        = htons(SERVER_PORT);
          inet_aton(argv[1], &serveraddr.sin_addr);
    
          /* 发起连接请求 */
          if (connect(sockfd, &serveraddr, sizeof(serveraddr)) < 0)
           {
            printf("连接请求失败: errno=%d\n",errno);
            close(sockfd); /* 重新建连,必须重新产生新插口,关闭原插口 */
           }
          else break;
         }
    
        ioctl(sockfd,FIONBIO,&mode); /* 将插口置成阻塞模式 */
    
        for(i=0; i<5; i++) /* 测试不同大小的报文的RoundTrip时间 */
         {
          slen = send_size[i]; /* 本次测试数据大小 */
          rcount = 0;
    
          gettimeofday(&tv1,(struct timezone *)0);
    
          for(j=0; j<50; j++) /* 每一种大小测试 50 次 */
           {
            if (send(sockfd, buff, slen, 0) <= 0)
             {
              printf("接收失败,程序退出, errno=%d\n",errno);
              close(sockfd);
              exit(1);
             }
            len = slen;
            for(;;) /* 接收数据 */
             {
              rlen = recv(sockfd, buff, len, 0);
              if (rlen <=0)
               {
                printf("接收失败,程序退出, errno=%d\n",errno);
                close(sockfd);
                exit(2);
               }
              len = len - rlen;
              rcount ++; /* 接收次数加 1 */
              if (len == 0) break; /* 本次接收完毕,进行下一次发送 */
             }
           }
          gettimeofday(&tv2,(struct timezone *)0);
          rdt = ((tv2.tv_sec - tv1.tv_sec) * 1000000 + tv2.tv_usec - tv1.tv_usec)/50;
     printf("报文大小 = %d, RoundTripTime = %d 微秒, 发送次数 = 50,
     接收次数 = %d\n", slen, rdt, rcount);
     sleep(3);
         }
       close(sockfd);
      }
------------------server.c----------------------------
 #include "public.h"
     
       char buff[MAXBUFSIZE];
     
       main(argc, argv)
        int argc;
        char *argv[];
       {
        int                     sockfd;     /* 监听插口描述符 */
        int                     newsockfd;  /* 连接插口描述符 */
        struct sockaddr_in      serveraddr; /* 服务器地址     */
        struct sockaddr_in      clientaddr; /* 客户方地址     */
        int                     clientaddrlen = sizeof(clientaddr);
        struct hostent          *he;
        int len;
        int mode=0; /* 阻塞模式 */
    
        /* 产生TCP 插口 */
        if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
         {
           printf("产生插口失败,退出\n");
           exit(1);
         }
    
         /* 设置服务器地址结构 */
         bzero((char *) &serveraddr, sizeof(struct sockaddr_in));
         serveraddr.sin_family      = AF_INET;
    
         /* 由系统自动绑定一个IP地址 */
         serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
         serveraddr.sin_port        = htons(SERVER_PORT);
    
         /* 绑定插口到本地的指定地址 */
         if ( bind(sockfd, (struct sockaddr *)&serveraddr,
                        sizeof(struct sockaddr_in)) < 0)
          {
            printf("绑定插口失败, 退出\n");
            exit(2);
          }
    
         /*
           通知协议层作好接收连接请求的准备
         */
         listen(sockfd, 8);
    
    
         /* 接收连接请求并服务客户 */
         while(1)
          {
           if ((newsockfd = accept(sockfd, (struct sockaddr *) &clientaddr,
                                   &clientaddrlen)) < 0)
             {
              printf("接收连接请求失败, errno=%d\n",errno);
              continue; /* 继续等待下一个连接请求 */
             }
           if (clientaddr.sin_family == AF_INET)
            {
              printf("收到连接请求: IP地址[%s], 端口号[%d]\n",
                      inet_ntoa(clientaddr.sin_addr),
                      ntohs(clientaddr.sin_port));
            }
           else
            {
              printf("不知道的协议类型, 关闭\n");
              close(newsockfd);
              continue;
            }
           ioctl(newsockfd,FIONBIO,&mode); /*将连接插口置为阻塞模式 */
           for(;;)
            {
             /* 接收数据 */
             if ((len = recv(newsockfd, buff, MAXBUFSIZE,0)) <= 0)
              {
               if (len == 0) printf("连接已被对方关闭\n");
               else printf("读连接插口失败:errno=%d\n",errno);
               close(newsockfd);
               break;
              }
    
             /* 将数据原封不动地返回给客户方 */
             if ((len = send(newsockfd, buff, len,0)) <0)
              {
               printf("发送数据失败:errno=%d\n",errno);
               close(newsockfd);
               break;
              }
            }
          }
      }



地主 发表时间: 04/06 19:07

回复: NetDemon [netdemon]   ADMIN   登录
*/server从client接收数据,并立即将接收到的数据原样回传给clinet,client向server发数据,然后立即接收从server原样返回的数据/*

这样不成了死循环?

B1层 发表时间: 04/06 19:23

回复: cimsxiyang [cimsxiyang]   版主   登录
不会啊
50次啊

B2层 发表时间: 04/06 19:28

回复: NetDemon [netdemon]   ADMIN   登录
呵呵~~开玩笑的,我只是说你语法的错误(这个语法当然不是C的语法,而是我们伟大的中文的语法)哈哈哈~~~~~~~~~~~`

B3层 发表时间: 04/07 02:21

回复: cimsxiyang [cimsxiyang]   版主   登录
我的汉语可是过了TOFEL的哦!
^_^

B4层 发表时间: 04/07 10:58

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号