国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

TCP服務(wù)器監(jiān)測(cè)客戶(hù)端異常退出方法

這篇具有很好參考價(jià)值的文章主要介紹了TCP服務(wù)器監(jiān)測(cè)客戶(hù)端異常退出方法。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

????????作為服務(wù)器必須得具備監(jiān)測(cè)客戶(hù)端狀態(tài)得機(jī)制,以保證客戶(hù)端處于不同的狀態(tài),服務(wù)器進(jìn)行不同得狀態(tài)處理,依次來(lái)提高實(shí)時(shí)性,可控性,并且有利于服務(wù)器得內(nèi)存管理。其中客戶(hù)端得異常處理就屬于其中得一種。

????????客戶(hù)端得斷開(kāi)情形無(wú)非就兩種情況:

????????1.客戶(hù)端能夠發(fā)送狀態(tài)給服務(wù)器;正常斷開(kāi),強(qiáng)制關(guān)閉客戶(hù)端等,客戶(hù)端能夠做出反應(yīng)。

????????2.客戶(hù)端不能發(fā)送狀態(tài)給服務(wù)器;突然斷網(wǎng),斷電,客戶(hù)端卡死等,客戶(hù)端根本沒(méi)機(jī)會(huì)做出反應(yīng),服務(wù)器更不了解客戶(hù)端狀態(tài)。

????????客戶(hù)端異常斷開(kāi)的監(jiān)測(cè)手段及使用狀態(tài):

方法1:

????????getsockopt函數(shù)獲取套接字狀態(tài),根據(jù)狀態(tài)判斷客戶(hù)端的連接情況。

函數(shù)原型:

int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);
參數(shù):
sockfd:要監(jiān)測(cè)的客戶(hù)端的套接字
level:協(xié)議層次
    SOL_SOCKET 套接字層次
    IPPROTO_IP ip層次
    IPPROTO_TCP TCP層次
option_name:選項(xiàng)的名稱(chēng)(套接字層次)
    SO_BROADCAST 是否允許發(fā)送廣播信息
    SO_REUSEADDR 是否允許重復(fù)使用本地地址
    SO_SNDBUF 獲取發(fā)送緩沖區(qū)長(zhǎng)度
    SO_RCVBUF 獲取接收緩沖區(qū)長(zhǎng)度
    SO_RCVTIMEO 獲取接收超時(shí)時(shí)間
    SO_SNDTIMEO 獲取發(fā)送超時(shí)時(shí)間
option_value:獲取到的選項(xiàng)的值
option_len:value的長(zhǎng)度

代碼實(shí)現(xiàn):

struct tcp_info info; 
int len=sizeof(info);
getsockopt(client_fd, IPPROTO_TCP, TCP_INFO, &info, (socklen_t *)&len); 
if(info.tcpi_state == TCP_CLOSE_WAIT && info.tcpi_state != TCP_ESTABLISHED)
{
    printf("Client disconnection!\n");

}

????????TCP_CLOSE_WAIT:是服務(wù)器收到客戶(hù)端發(fā)來(lái)的FIN包以后進(jìn)入的狀態(tài),F(xiàn)IN包是客戶(hù)端斷開(kāi)連接進(jìn)行四次揮手的第一次揮手,收到 TCP_CLOSE_WAIT狀態(tài)代表客戶(hù)端已經(jīng)想要斷開(kāi)連接或者已經(jīng)斷開(kāi)連接。

????????TCP_ESTABLISHED:表示客戶(hù)端,服務(wù)器雙方處于建立連接的狀態(tài),可以進(jìn)行交互,相反則不處于連接狀態(tài)。

????????可以單獨(dú)使用TCP_CLOSE_WAIT或者TCP_ESTABLISHED狀態(tài)進(jìn)行連接狀態(tài)的監(jiān)測(cè),我喜歡一起使用。該方法適合客戶(hù)端斷開(kāi)的第一種情況。

方法2:

????????心跳包的實(shí)現(xiàn),心跳包就是服務(wù)器定時(shí)向客戶(hù)端發(fā)送查詢(xún)信息,如果客戶(hù)端有回應(yīng)就代表連接正常,類(lèi)似于linux系統(tǒng)的看門(mén)狗機(jī)制。心跳包的實(shí)現(xiàn)有兩種:TCP自帶的心跳包機(jī)制keeplive,和自定義心跳包。

????????TCP自帶的心跳包:KEEPLIVE保活機(jī)制

????????使用setsockope函數(shù)啟動(dòng)和設(shè)置心跳時(shí)間的機(jī)制:

int RTSP_SESSION::set_keeplive(void)
{


    int keep_alive = 1;//啟動(dòng)心跳保活機(jī)制
    int keep_idle = 10;
//10s內(nèi)沒(méi)收到數(shù)據(jù)開(kāi)始發(fā)送心跳包
    int keep_interval = 3;
//每次發(fā)送心跳包的時(shí)間間隔
    int keep_count = 3;
//每個(gè)3s發(fā)送一次心跳包

    if (setsockopt(client_fd, SOL_SOCKET, SO_KEEPALIVE, &keep_alive, sizeof(keep_alive)))
    {
        perror("Error setsockopt(SO_KEEPALIVE) failed");
        return -1;
    }
    if (setsockopt(client_fd, IPPROTO_TCP, TCP_KEEPIDLE, &keep_idle, sizeof(keep_idle)))
    {
        perror("Error setsockopt(TCP_KEEPIDLE) failed");
        return -1;
    }
    if (setsockopt(client_fd, SOL_TCP, TCP_KEEPINTVL, (void *)&keep_interval, sizeof(keep_interval)))
    {
        perror("Error setsockopt(TCP_KEEPINTVL) failed");
        return -1;
    }
    if (setsockopt(client_fd, SOL_TCP, TCP_KEEPCNT, (void *)&keep_count, sizeof(keep_count)))
    {
        perror("Error setsockopt(TCP_KEEPCNT) failed");
        return -1;
    }

    return 0;
}

????????上述代碼的意思就是:10s沒(méi)收到客戶(hù)端的數(shù)據(jù)就開(kāi)始發(fā)送心跳包,如果客戶(hù)端沒(méi)回應(yīng),則導(dǎo)致client_fd失效,所有調(diào)用client_fd的讀寫(xiě)函數(shù)都會(huì)立即返回(read write recv send等),并且錯(cuò)誤碼是ETIMEDOUT。

????????通過(guò)判斷讀寫(xiě)函數(shù)的狀態(tài)就可以判斷客戶(hù)端的連接狀態(tài):

int ret = recv(client_fd, buf, len, MSG_PEEK);
if(ret <= 0 && errno == ETIMEDOUT)
    printf("Client disconnection!\n");
MSG_PEEK:查看緩存內(nèi)容,但是不從緩存中讀取,不會(huì)干擾程序的正常讀寫(xiě),可以利用該方法寫(xiě)個(gè)線程進(jìn)行監(jiān)測(cè),或者直接使用自己讀寫(xiě)函數(shù)的返回值進(jìn)行判斷。

????????自己定義心跳包:

????????這個(gè)必須是服務(wù)器,客戶(hù)端都是自己寫(xiě)的才可以,在服務(wù)器中每隔一段時(shí)間向服務(wù)器發(fā)送一個(gè)心跳包,客戶(hù)端收到后進(jìn)行回復(fù),心跳包的協(xié)議可以自己定,以此監(jiān)測(cè)客戶(hù)端狀態(tài)。

????????心跳包適合客戶(hù)端斷開(kāi)的情形1,情形2,都適用。

番外:

????????如果使用的是select的話,無(wú)論是正常中斷還是異常中斷,select都會(huì)返回1:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-696153.html

ret = select(client_fd+1, &rfd, NULL, &efd, &timeout);
if(ret > 0)
{
    if (FD_ISSET(client_fd, &rfd) != 0)
    {
        //客戶(hù)端中斷會(huì)進(jìn)入這里,在這里判斷recv狀態(tài)進(jìn)行監(jiān)測(cè)
        if ((ret = recv(client_fd, buf, len, 0)) <= 0)
        {
            if(errno == ETIMEDOUT)
            {
                printf("The client is disconnected abnormally. Check the cause!\n");

            }
        }
    }
}

到了這里,關(guān)于TCP服務(wù)器監(jiān)測(cè)客戶(hù)端異常退出方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 簡(jiǎn)易TCP客戶(hù)端和服務(wù)器端通信

    #includeiostream #include winsock2.h ? #include ws2tcpip.h ? #includestdlib.h using namespace std; #define ?BUF_SIZE ?1024 int main() { ? ? cout \\\"客戶(hù)端\\\" endl; ? ? //設(shè)置Winsock版本, ? ? WSADATA ? wsaData; ? ? if (WSAStartup(MAKEWORD(2, 2), wsaData) != 0) ? ? { ? ? ? ? cout \\\"error\\\" endl; ? ? ? ? exit(1); ? ? } ? ? //創(chuàng)建通

    2024年04月29日
    瀏覽(23)
  • 【Micropython基礎(chǔ)】TCP客戶(hù)端與服務(wù)器

    【Micropython基礎(chǔ)】TCP客戶(hù)端與服務(wù)器

    MicroPython 是 Python 的一種精簡(jiǎn)實(shí)現(xiàn),旨在運(yùn)行于微控制器和嵌入式系統(tǒng)等資源受限的環(huán)境中。它提供了一種簡(jiǎn)單而強(qiáng)大的方式來(lái)編寫(xiě)和運(yùn)行 Python 代碼,使開(kāi)發(fā)人員能夠快速地創(chuàng)建各種嵌入式應(yīng)用程序。 在嵌入式系統(tǒng)中,網(wǎng)絡(luò)通信是一個(gè)常見(jiàn)的需求,而 TCP(傳輸控制協(xié)議)是

    2024年04月28日
    瀏覽(30)
  • TCP客戶(hù)端及服務(wù)器端開(kāi)發(fā)實(shí)踐

    TCP客戶(hù)端及服務(wù)器端開(kāi)發(fā)實(shí)踐

    ① TCP客戶(hù)端應(yīng)用程序開(kāi)發(fā) ② TCP服務(wù)器端應(yīng)用程序開(kāi)發(fā) 客戶(hù)端程序是指運(yùn)行在用戶(hù)設(shè)備上的程序,服務(wù)端程序是指運(yùn)行在服務(wù)器設(shè)備上的程序,專(zhuān)門(mén)為客戶(hù)端提供數(shù)據(jù)服務(wù)。那如何記憶呢? 主動(dòng)發(fā)起建立連接請(qǐng)求的是客戶(hù)端程序,等待接受連接請(qǐng)求的是服務(wù)端程序。 開(kāi)發(fā)流

    2024年04月09日
    瀏覽(27)
  • 用C語(yǔ)言搭建TCP服務(wù)器/客戶(hù)端

    用C語(yǔ)言搭建TCP服務(wù)器/客戶(hù)端

    1.TCP流程圖 2.TCP編程 服務(wù)器 客戶(hù)端 ????????以上就是用c語(yǔ)言搭建的tcp服務(wù)器和客戶(hù)端,IP地址的地方可以根據(jù)自己本機(jī)的IP地址去修改(在命令提示符中可以使用ifconfig命令查看本機(jī)IP地址),端口號(hào)用的是6666,也可自己修改,但是IP地址和端口號(hào)服務(wù)器和客戶(hù)端必須一至。

    2024年02月09日
    瀏覽(25)
  • tcp服務(wù)器端與多個(gè)客戶(hù)端連接

    tcp服務(wù)器端與多個(gè)客戶(hù)端連接

    如果希望Tcp服務(wù)器端可以與多個(gè)客戶(hù)端連接,可以這樣寫(xiě): 相關(guān)的槽函數(shù)中: 使用sender()來(lái)獲取對(duì)應(yīng)的QTcpSocket對(duì)象。 其實(shí),主要就是QTcpServer進(jìn)行監(jiān)聽(tīng): 客戶(hù)端的QTcpSocket與服務(wù)器端的QTcpSocket進(jìn)行通信。

    2024年04月28日
    瀏覽(48)
  • TCP通信實(shí)現(xiàn)客戶(hù)端向服務(wù)器發(fā)送圖片

    TCP通信實(shí)現(xiàn)客戶(hù)端向服務(wù)器發(fā)送圖片

    TCP通信: 1. TCP 協(xié)議通信交互流程: 具體的流程如下: (1)服務(wù)器根據(jù)地址類(lèi)型(ipv4、ipv6)、socket 類(lèi)型、協(xié)議創(chuàng)建 socket. (2)服務(wù)器為 socket 綁定 ip 地址和端口號(hào)。 (3)服務(wù)器 socket 監(jiān)聽(tīng)端口號(hào)的請(qǐng)求,隨時(shí)準(zhǔn)備接受來(lái)自客戶(hù)端的連接,此時(shí)服務(wù)器的 socket 處于關(guān)閉狀態(tài)

    2024年02月13日
    瀏覽(31)
  • TCP服務(wù)器最多支持多少客戶(hù)端連接

    TCP服務(wù)器最多支持多少客戶(hù)端連接

    目錄 一、理論數(shù)值 二、實(shí)際部署 ?參考 ????????首先知道一個(gè)基礎(chǔ)概念,對(duì)于一個(gè) TCP 連接可以使用四元組(src_ip, src_port, dst_ip, dst_port)進(jìn)行唯一標(biāo)識(shí)。因?yàn)榉?wù)端 IP 和 Port 是固定的(如下圖中的bind階段),那么一個(gè)TCP服務(wù)器支持最多的連接數(shù)就是由客戶(hù)端 IP 和 端口

    2024年01月21日
    瀏覽(31)
  • day-03 基于TCP的服務(wù)器端/客戶(hù)端

    day-03 基于TCP的服務(wù)器端/客戶(hù)端

    TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是兩種常見(jiàn)的傳輸層協(xié)議,用于在計(jì)算機(jī)網(wǎng)絡(luò)中提供可靠的數(shù)據(jù)傳輸。 1.TCP: 連接導(dǎo)向 :TCP是一種面向連接的協(xié)議,通信雙方在數(shù)據(jù)傳輸前需要先建立可靠的連接。 可靠性 :TCP提供可靠的數(shù)據(jù)傳輸,通過(guò)使用序列號(hào)、確

    2024年02月10日
    瀏覽(28)
  • QT實(shí)現(xiàn)TCP通信(服務(wù)器與客戶(hù)端搭建)

    QT實(shí)現(xiàn)TCP通信(服務(wù)器與客戶(hù)端搭建)

    創(chuàng)建一個(gè)QTcpServer類(lèi)對(duì)象,該類(lèi)對(duì)象就是一個(gè)服務(wù)器 調(diào)用listen函數(shù)將該對(duì)象設(shè)置為被動(dòng)監(jiān)聽(tīng)狀態(tài),監(jiān)聽(tīng)時(shí),可以監(jiān)聽(tīng)指定的ip地址,也可以監(jiān)聽(tīng)所有主機(jī)地址,可以通過(guò)指定端口號(hào),也可以讓服務(wù)器自動(dòng)選擇 當(dāng)有客戶(hù)端發(fā)來(lái)連接請(qǐng)求時(shí),該服務(wù)器會(huì)自動(dòng)發(fā)射一個(gè)newConnection信號(hào)

    2024年02月09日
    瀏覽(26)
  • 【網(wǎng)絡(luò)編程】實(shí)現(xiàn)UDP/TCP客戶(hù)端、服務(wù)器

    【網(wǎng)絡(luò)編程】實(shí)現(xiàn)UDP/TCP客戶(hù)端、服務(wù)器

    需要云服務(wù)器等云產(chǎn)品來(lái)學(xué)習(xí)Linux的同學(xué)可以移步/--騰訊云--/--阿里云--/--華為云--/官網(wǎng),輕量型云服務(wù)器低至112元/年,新用戶(hù)首次下單享超低折扣。 ? 目錄 一、UDP 1、Linux客戶(hù)端、服務(wù)器 1.1udpServer.hpp 1.2udpServer.cc 1.3udpClient.hpp 1.4udpClient.cc 1.5onlineUser.hpp 2、Windows客戶(hù)端 二、T

    2024年02月06日
    瀏覽(18)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包