#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define SERV_PORT 46420 /* server UDP port */
#define MAX_MSG_LEN 1500 /* max size of any msg */
#define TEST_TIME 500 /* test time for average,测试次数 */
#define DIVIATION_MAX 1 /*大于1s忽略*/
//#define IP_ADDRESS "149.171.37.222" /* UNSW-Based Serv */
//#define IP_ADDRESS "54.206.16.120" /* External Serv */
//函数:实现读取字符串转换成int类型功能
double timeConvert(char *revMsg)
{
long tmp,usec,sec;
double retUsec;
memcpy(&sec,revMsg,4);
memcpy(&usec,revMsg+4,4);
retUsec = ntohl(sec)+ntohl(usec)*0.000001;//转换成usec【公式不知道对否】
return(retUsec);
}
int main()
{
int sock, e, inMsgLen,addrLen;
struct sockaddr_in servAddr, cliAddr;
char inMsg[MAX_MSG_LEN];
char sendMsg[MAX_MSG_LEN]="getmybw";
int i,j,falg,avgNum=0;
double firTimer,secTimer,timeDiff;
double avg=0,bandWidth;
struct timeval timeRecv;
/* open socket */
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0) {
printf("socket creation failed errno=%d\n", errno);
exit(0);
}
memset( &servAddr,0,sizeof(servAddr) );
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = inet_addr( "54.206.16.120");
servAddr.sin_port = htons(SERV_PORT);
/* 设置接受超时时间 */
timeRecv.tv_sec = 1;
timeRecv.tv_usec = 0;
setsockopt(sock,SOL_SOCKET,SO_RCVTIMEO,&timeRecv, sizeof(timeRecv));
for(i=0;i
/**************************/
e = sendto(sock, sendMsg, sizeof(sendMsg), 0,(struct sockaddr*)&servAddr, sizeof(servAddr));
if (e < 0) {
printf("sendto() failure errno=%d\n", errno);
}
e = sendto(sock, sendMsg, sizeof(sendMsg), 0,(struct sockaddr*)&servAddr, sizeof(servAddr));
if (e < 0) {
printf("sendto() failure errno=%d\n", errno);
}
/**********************/
inMsgLen = recvfrom(sock, inMsg, MAX_MSG_LEN, 0,(struct sockaddr *)&cliAddr, (socklen_t*)&addrLen);
//printf("receive Message:==%s==\n",inMsg);
firTimer = timeConvert(inMsg);
inMsgLen = recvfrom(sock, inMsg, MAX_MSG_LEN, 0,(struct sockaddr *)&cliAddr, (socklen_t*)&addrLen);
//printf("receive Message:==%s==\n",inMsg);
secTimer = timeConvert(inMsg);
timeDiff = secTimer-firTimer;
/*if( timeDiff > DIVIATION_MAX ){//放弃超出误差范围的结果
printf(" (%f)out of scope\n",timeDiff);
continue;
}*/
bandWidth = sizeof(inMsg)*8/timeDiff/1000000;
avg += (bandWidth-avg)/(avgNum+1);//求平均值
avgNum++;
printf("%d---%.11f--\n",avgNum,avg);//%.11f: 显示小数点后11位
}
printf("END: average=%.11f,the number of tests: %d \n",avg,avgNum);
close(sock);
return 0;
}