日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

Qt QTcpSocket 对连接服务器中断的不同情况进行判定

發布時間:2024/1/17 c/c++ 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt QTcpSocket 对连接服务器中断的不同情况进行判定 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡述

對于一個C/S結構的程序,客戶端有些時候需要實時得知與服務器的連接狀態。而對于客戶端與服務器斷開連接的因素很多,現在就目前遇到的情況進行一下總結。

分為下面六種不同情況

  • 客戶端網線斷開
  • 客戶端網絡斷開
  • 客戶端通過HTTP代理連接服務器,代理機器斷開代理
  • 客戶端通過HTTP代理連接服務器,代理機器的網絡斷開
  • 客戶端通過HTTP代理連接服務器,代理機器的網線斷開
  • 服務器斷開
  • 同時對于以上六種情況又分為連接服務器之前和連接上服務器之后,下面就分別對不同的情況進行分析。

    開始連接服務器之前

    1、 客戶端網線斷開?
    此時用socket調用connectToHost方法連接服務器會立即觸發QTcpSocket的error信號,我們可以綁定相應的槽去處理連接失敗的結果。


    2、 客戶端網絡斷開?
    3、 客戶端通過HTTP代理連接服務器,代理機器斷開代理?
    4、 客戶端通過HTTP代理連接服務器,代理機器的網絡斷開?
    5.、客戶端通過HTTP代理連接服務器,代理機器的網線斷開?
    6、?服務器斷開?
    此時用socket調用connectToHost方法連接服務器并不會立即觸發QTcpSocket的error信號,而是經過40s+的連接等待超時發出error信號,見下圖。


    已經連接上服務器

    1、 客戶端網線斷開?
    此時socket不會發送error信號,也不會發送disconnect信號,查詢資料是因為網線斷開是屬于物理鏈路層,tcp無法察覺到,socket仍處于連接狀態。


    2、 客戶端網絡斷開?
    3、 客戶端通過HTTP代理連接服務器,代理機器斷開代理?
    4、 客戶端通過HTTP代理連接服務器,代理機器的網絡斷開?
    5.、客戶端通過HTTP代理連接服務器,代理機器的網線斷開

    第二和第三種情況下會立即觸發error信號,而第四和第五種情況下會等待30s左右會發送error信號。


    6、?服務器斷開?
    此時socket會發送disconnect信號,可以綁定相應的槽去處理服務器斷開的情況。

    檢測與服務器斷開的另外方法

    對于有些程序(客戶端)需要立即知道與服務端連接狀態,而不是等待幾十秒之后才有信號通知到或者根本就檢測不出與服務器斷開,除了利用QTcpSocket提供的信號(有幾種情況不會發出信號或發出信號延遲),這里列出另外幾種處理方法。

    1、發送心跳包,即客戶端每隔一段時間發送一條報文,報文不需附帶具體內容,只需要讓服務端知道這是一條心跳報文,并回發一條消息,客戶端收到這條消息后就得知與服務器保持連接的狀態。

    檢測本地網絡,定義一個時鐘,每次timeout去檢測本地的網絡,關于怎么判斷本地網絡是否通暢呢?

    2、可以用windows提供的IsNetworkAlive方法,返回為false為網絡異常。加上頭文件為#include “Sensapi.h”。同時需要包含Sensapi.lib。?
    (通過IsNetworkAlive方法判斷本地網絡,在客戶端已經連接上服務器,并且禁用網絡時會立即發送error信號,在error信號綁定的槽中去調用這個方法發現返回值為true,因為這種情況下禁用網絡后會立即發送error信號,調用IsNetworkAlive方法時可能立即檢測不到網絡異常。如果通過斷點的方式,在調用IsNetworkAlive時就會返回false)

    DWORD dwFlag;if (FALSE == IsNetworkAlive(&dwFlag)){qDebug() << "NetWorkError";}

    注意:

    但是這種方法,在本地存在虛擬機并且虛擬機開啟時會失效,因為IsNetworkAlive會檢測本地所有的網絡,在網線斷開后,可能檢測到虛擬機網絡正常,導致返回ture。

    3、如果有自己的服務器就ping服務器(前提服務器不會掛),否則就ping一個相對可靠的IP (比如百度),通過看他ping的結果怎么樣.?
    同時在C++ 實現 ping 功能&& 域名(URL)解析實際 IP地址?這篇博客中用C++實現了 ping的 功能,有興趣的小伙伴可以看一看,了解一下。

    QProcess *cmd = new QProcess; cmd->start("ping www.baidu.com"); // 等待ping 的結果 while (cmd->waitForFinished()) { QString result = QString::fromLocal8Bit(cmd->readAll()); qDebug() << result; }

    QHostInfo::lookupHost("www.baidu.com", this, SLOT(lookedUp(QHostInfo)));void lookedUp(QHostInfo &host) {qDebug() << host.addresses().first().toString(); } //得到IP 地址 就是在互聯網上 如果不能得到 就不行

    4、QNetworkConfigurationManager::isOnline()。?
    當然這個只能檢查你是否有網絡鏈接,而不能檢測你是否連接到互聯網。


    對于需要自動重連的客戶端可以通過以上方法,在判斷出與服務器斷開后可以重新連接,或者通過超時定時器進行重連,方法很多,在于嘗試。

    ?

    轉自:http://blog.csdn.net/GoForwardToStep/article/details/52300335?locationNum=4

    轉載于:https://www.cnblogs.com/liushui-sky/p/6473539.html

    總結

    以上是生活随笔為你收集整理的Qt QTcpSocket 对连接服务器中断的不同情况进行判定的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。