網絡延時測量程序


項目簡介

網絡延時測量程序
項目需求:
1.客戶端與服務端能夠通信,並能測量網絡延時(客戶端發送信息給服務端,服務端收到后立刻回復,客戶端收到后計算網絡延時)
2.多次測量(10次)
3.在不同場景下進行測試(CPU占用率極高、下載進程占據帶寬、內網外網環境)
4.能夠讀寫日志文件,並處理數據
5.圖形化界面

關於項目

首先放出項目的代碼:Github
這個項目總體來說並不難,思路也是非常簡單的。老師建議我們用C語言來寫,可以方便我們理解底層通信技術。但是如果我們想完整的實現所有的功能的話,圖形化界面肯定就需要使用MFC來做了。同時我們隊伍中沒有人會MFC,而這個項目又只有一個星期的時間去做完,所以我們隊伍決定其他兩個人用C語言來寫這個項目,利用命令窗口實現功能;我則利用Qt來寫一個圖形化界面並實現所有的功能。
之所以利用Qt來寫,是因為Qt非常簡潔、網絡的庫QTcpsocket也非常好用,而且也比較適合目前的開發環境,MFC這東西我感覺很繁雜、已經很落伍了(只是個人意見....)。所以我果斷使用Qt進行開發。而最后實現的功能有以下:

  • [X] 圖形界面設計
  • [X] TCP服務器
  • [X] TCP客戶端
  • [X] 計時程序
  • [X] 數據導出到日志文件中(還是想用可視化的概念,作成動態圖)
  • [X] 間隔一定時長,進行多次測量
  • [X] Qt動態曲線顯示網絡狀態(功能代碼是有的,但是qcustomplot的庫可能使用有些問題)
  • [X] 導出日志文件(xlsx)
  • [X] 增加可視化組件
  • [X] Excel VBA程序,對數據進行分析處理

項目環境QtXlsxWriter搭建

安裝步驟

Qt的安裝直接略過。這里稍微提及一下利用Qt操作Excel的方法:我利用的是QtXlsxWriter。配置方法如下:
首先下載QtXlsxWriter
然后下載activeperl
1.將下載的文件以文件夾的形式都放在Qt的安裝目錄下
2.然后安裝activeperl,安裝目錄要和Qt在一個磁盤里,否則會不成功;同時在安裝時注意將activeperl的安裝目錄配置到系統環境變量中,如果安裝過成勾選了就不用管了。
3.進入Qt 5.9.2 for Desktop
04.png
4.輸入命令:

cd  [QtXlsxWriter所在的目錄]
qmake
mingw32-make
mingw32-make install

錯誤處理

若編譯過程中未出現錯誤提示,表明編譯成功;但是如果出現

xlsxzipreader.cpp: In member function ‘void QXlsx::ZipReader::init()’:
xlsxzipreader.cpp:51:66: error: conversion from ‘QVector<QZipReader::FileInfo>’ to non-scalar type ‘QList<QZipReader::FileInfo>’ requested
     QList<QZipReader::FileInfo> allFiles = m_reader->fileInfoList();

這樣的錯誤,則是需要進入相應的程序QZipReader::init()中, 添加頭文件#include <QVector>然后把出錯的地方的"QList" 用"QVector" 替換掉重新構建就可以了。

測試一下

新建Qt項目,在.pro文件中添加 QT +=xlsx,然后輸入

#include <QtXlsx>

    QXlsx::Document xlsx("book1.xlsx");//創建表格

    /* 設置單元格樣式 */
    QXlsx::Format format1;
    format1.setHorizontalAlignment(QXlsx::Format::AlignHCenter);//橫向居中
    format1.setVerticalAlignment(QXlsx::Format::AlignVCenter);//豎直居中
    format1.setFontBold(true);//設置加粗
    format1.setFontSize(15);  //設置字體大小
    format1.setFontColor(Qt::red);//字體顏色
    xlsx.mergeCells("B1:C1"); //合並單元格
    xlsx.write(1, 2, "檢測項目", format1);//在第一行第二列寫入內容
    xlsx.saveAs("book1.xlsx");//保存

在build文件中查看生成的book1.xlsx,如果有"檢測項目"四個大字就說明QtXlsxWriter已經安裝成功了。安裝教程參照了這篇博客

項目原理

通信模塊

tcp02.png
首先是網絡通信,由於Qt和正常的C語言編程思路不太通,Qt是事件觸發型的,即如果檢測到buffer里有數據,會發送相應的信號,再由之前程序里寫的connect執行槽函數。

延時測量模塊

測量延時,我是利用客戶端首先獲取本地時間,再發送數據(任何都行,但實際上字符串越長對延時也會稍微的有些影響),服務端接收后立刻原封不動的返回這個數據,客戶端接收到后再獲取本地時間2,利用本地時間2-本地時間就獲得了網絡延時。

多次發送模塊

單次發送非常好理解,就是點擊發送這個事件觸發了發送數據事件,而發送數據事件同時在服務端接收到數據后觸發了回復事件,客戶端收到服務端發送數據事件后觸發了其他客戶端相應的事件(這里沒有說相應的事件是因為這里寫的事件有些多,包括讀取數據、生成execel等等)。多次發送我們或許以為會很簡單,直接寫個循環多次執行單次發送這個事件不就行了?我也是這樣想的,但是事實告訴我們這樣是不行的!!。為什么呢?是因為Qt這個socket很奇怪,如果執行循環反復發送這個事件的話,它是會等待后面的數據一起進來然后一起發送、或者是沒有規律的時不時發送成功時不時等待后面的,意思就是不能單次發送我們想要的單次數據。剛開始我認為是服務端的buffer沒有清理干凈的原因,后來查閱相關資料發現是qt中必須增加socket->waitForBytesWritten();這一行才能表示單次數據直接發送,不必等待后面的數據;加了后就可以多次發送了!!小注意點是在由時間稍微處理一下,具體請看代碼吧:

qDebug()<<"循環了10次測試!";
    for(int i=0;i<10;i++)
    {

        QTime startTime = QTime::currentTime();
        qDebug()<<startTime;
        QTime Nowtime = startTime.addMSecs(3000);
        QString str = Nowtime.toString("h:m:s.z");
        qDebug()<<str;
        socket->write(str.toUtf8());
        //socket->flush();
        socket->waitForBytesWritten();
        socket_Read_Data();
        Sleep(3000);

}

圖像模塊

程序里確實有圖像模塊的代碼,加了qcustomplot的頭文件和源文件;本來想實現的功能是點擊"圖像"這個按鈕,會彈出一個包含圖表的對話框;然后可以實時的更新測量數據,繪制趨勢圖。但是經過多次測量,qcustomplot的圖像只能顯示在mainwindow窗口上,在qdialog的窗口內無法顯示;由於時間不夠了,這個功能也就啟用了;但是這些代碼仍然保存着,日后有時間可以找找原因。

生成excel文件

上面已經詳細介紹了。這里我只說我的用法,我定義了一個全局變量i,每次執行延時測量程序之后都會自動+1,然后再寫入excel中(i,1)單元格;這樣就能非常方便的記錄所有的數據。

數據分析

由於生成的數據都到excel里了,我們就直接利用excel進行數據處理。在這里我寫了excel vba程序,對A列所有的數據進行方差、平均值的計算、並能繪制響應的折線圖。實際上也可以用直方圖來分析,只是覺得折線圖的趨勢比較明顯,反正都是可以修改的。

最終效果圖

02.png

03.png

vba.png

測試結果圖

CPU占用率到74%的時候的延時
CPU占用率到74%的時候的延時.png
下載文件占用帶寬測試
下載文件占用帶寬測試.png
虛擬機測試1
虛擬機測試1.png
虛擬機測試2
虛擬機測試2.png

結論

1.外網能直接訪問外網
內網不能直接訪問另一個內網
同一個內網之間可以互相訪問
內網可以訪問外網,但外網不能直接訪問內網
2.CPU占用率較高的條件下、下載進程占據帶寬的時候,網絡延時會顯著變長
3.不同計算機在同一內網下(校園網)測試的時候會有較長延時,隨着距離的增大而變長;可能和轉發的路由器數目變多了有關
4.一台計算機自己訪問自己,網絡延時比較低。

一些思考

由於回應壁程序可以測量帶寬,首先抓了個包發現:
抓訪問網絡的數據包.png
是get了4個很大的數據包,根據網絡延時和數據包的大小進行帶寬測試的。所以如果我們的程序發送指定大小的數據包,並得到平均網絡延時就可以測量網絡帶寬!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM