通信人家园

标题: C语言写的socket通信代码, 很简单的代码, 用来测试网络带宽的  [查看完整版帖子] [打印本页]

时间:  2021-1-16 23:14
作者: youyouwzy     标题: C语言写的socket通信代码, 很简单的代码, 用来测试网络带宽的

#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;
}



时间:  2021-1-17 10:57
作者: 992213521

厉害
时间:  2021-1-17 12:09
作者: Vortex

要用win*ock linux没几个人用




通信人家园 (https://www.txrjy.com/) Powered by C114