|
![]() | 作者: 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] ![]() |
登录 |
*/server从client接收数据,并立即将接收到的数据原样回传给clinet,client向server发数据,然后立即接收从server原样返回的数据/* 这样不成了死循环? |
B1层 发表时间: 04/06 19:23 |
![]() | 回复: cimsxiyang [cimsxiyang] ![]() |
登录 |
不会啊 50次啊 |
B2层 发表时间: 04/06 19:28 |
![]() | 回复: NetDemon [netdemon] ![]() |
登录 |
呵呵~~开玩笑的,我只是说你语法的错误(这个语法当然不是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号