通信人家园

 找回密码
 注册

只需一步,快速开始

短信验证,便捷登录

搜索

军衔等级:

  列兵

注册:2010-6-10
跳转到指定楼层
1#
发表于 2021-1-16 23:14:19 |只看该作者 |倒序浏览
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <errno.h>
#include <assert.h>
#include <time.h>
#include <arpa/inet.h>
#include <unistd.h>

#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<TEST_TIME;i++){//执行100次求平均值
/**************************/       
                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;
}


举报本楼

本帖有 2 个回帖,您需要登录后才能浏览 登录 | 注册
您需要登录后才可以回帖 登录 | 注册 |

版规|手机版|C114 ( 沪ICP备12002291号-1 )|联系我们 |网站地图  

GMT+8, 2025-7-21 13:22 , Processed in 0.220194 second(s), 17 queries , Gzip On.

Copyright © 1999-2025 C114 All Rights Reserved

Discuz Licensed

回顶部