1. 程式人生 > >tcp 服務端如何判斷客戶端斷開連線

tcp 服務端如何判斷客戶端斷開連線

23.1介紹

在一個空閒的(idle)TCP連線上,沒有任何的資料流,許多TCP/IP的初學者都對此感到驚奇。也就是說,如果TCP連線兩端沒有任何一個程序在向對方傳送資料,那麼在這兩個TCP模組之間沒有任何的資料交換。你可能在其它的網路協議中發現有輪詢(polling),但在TCP中它不存在。言外之意就是我們只要啟動一個客戶端程序,同伺服器建立了TCP連線,不管你離開幾小時,幾天,幾星期或是幾個月,連線依舊存在。中間的路由器可能崩潰或者重啟,電話線可能go down或者back up,只要連線兩端的主機沒有重啟,連線依舊保持建立

這就可以認為不管是客戶端的還是伺服器端的應用程式都沒有應用程式級(application-level)的定時器來探測連線的不活動狀態(inactivity),從而引起任何一個應用程式的終止

。回憶在10.7結束,BGP每隔30秒就向對方傳送一個應用程式探測。這是一個應用程式定時器(application timer),與TCP存活定時器不同。

然而有的時候,伺服器需要知道客戶端主機是否已崩潰並且關閉,或者崩潰但重啟。許多實現提供了存活定時器來完成這個任務。

存活(keepalive)並不是TCP規範的一部分。在Host Requirements RFC羅列有不使用它的三個理由:(1)在短暫的故障期間,它們可能引起一個良好連線(good connection)被釋放(dropped),(2)它們消費了不必要的寬頻,(3)在以資料包計費的網際網路上它們(額外)花費金錢。然而,在許多的實現中提供了存活定時器。

存活定時器是一個包含爭議的特徵。許多人認為,即使需要這個特徵,這種對對方的輪詢也應該由應用程式來完成,而不是由TCP中實現。一些人對這個話題表現了極大的熱情,甚至達到宗教般的狂熱。

如果兩個終端系統之間的某個中間網路上有連線的暫時中斷,那麼存活選項(option)就能夠引起兩個程序間一個良好連線的終止。例如,如果正好在某個中間路由器崩潰、重啟的時候傳送存活探測,TCP就將會認為客戶端主機已經崩潰,但事實並非如此。

一些伺服器應用程式可能代表客戶端佔用資源,它們需要知道客戶端主機是否崩潰。存活定時器可以為這些應用程式提供探測服務。Telnet伺服器和Rlogin伺服器的許多版本都預設提供存活選項。

個人計算機使用者使用TCP/IP協議通過Telnet登入一臺主機,這是能夠說明需要使用存活定時器的一個常用例子。如果某個使用者在使用結束時只是關掉了電源,而沒有登出(log off),那麼他就留下了一個半開啟(half-open)的連線。在圖18.16,我們看到如何在一個半開啟連線上通過傳送資料,得到一個復位(reset)返回,但那是在客戶端,是由客戶端傳送的資料。如果客戶端消失,留給了伺服器端半開啟的連線,並且伺服器又在等待客戶端的資料,那麼等待將永遠持續下去。存活特徵的目的就是在伺服器端檢測這種半開啟連線。

相關推薦

Tcp服務判斷客戶是否斷開連線

     今天搞tcp連結弄了一天,前面建立socket,繫結,監聽等主要分清自己的引數,udp還是tcp的。好不容易調通了,然後就是一個需求,當客戶端主動斷開連線時,服務端也要斷開連線,這樣一下次客戶端請求連結的時候才能成功連結。       然後就開始找各種方法。其中簡單

TCP伺服器如何判斷客戶Socket斷開連線

       ARM上基於Linux編寫的 TCP 伺服器,當客戶端斷開連線時,使用 select 函式的情況下,伺服器仍然會接收到一個訊號,在 select 函式會將這個裝置描述符標記為可讀/寫,然後呼叫 recv 函式,若 recv 函式返回值為 0,則表示客戶端已經斷開

Linux網路程式設計中服務判斷客戶斷開連線

</pre> 專案使用了select模型,所以這裡只貼出此模型下的客戶端連線斷開判斷:<p></p><p>主要是select返回後,正常recv,如果recv的返回值小於0則表示客戶端連線已斷開。</p><

C#服務判斷客戶socket是否已斷開的方法

endpoint point style 返回 接收 ipaddress emp ipa ner 剛開始,用Socket類的Connected屬性來實現,卻發現行不通,connected只表示 是在上次 還是 操作時連接到遠程主機。如果在這之後[連接的另一方]斷開了,它還

使用Python的socket模塊搭建tcp服務器與客戶

有客 cep 服務器 send msg AC 鏈接 upper 可能 # __author__ = ‘ZSnail‘ # socket就是一個網絡通訊協議 # 服務器端 import socket server = socket.socket() server.b

TCP服務器和客戶_Socket編程

cli 操作 cat next() png run 等待 響應 .net TCP服務器 服務器啟動文件 1 import java.io.IOException; 2 import java.net.ServerSocket; 3 import j

python3-TCP服務器和客戶(socketserver類)

env amr rip address ctrl+c utf-8 request ctrl reat #!/usr/bin/env python3 import socket import sys HOST="localhost" PORT=21200 ADDR=(H

tcp 服務如何判斷客戶斷開連線

23.1介紹 在一個空閒的(idle)TCP連線上,沒有任何的資料流,許多TCP/IP的初學者都對此感到驚奇。也就是說,如果TCP連線兩端沒有任何一個程序在向對方傳送資料,那麼在這兩個TCP模組之間沒有任何的資料交換。你可能在其它的網路協議中發現有輪詢(polling),但在TCP中它不存在。言外之意就

QT TCP服務如何判斷客戶斷開連線

在用QT寫服務端時想要知道客戶端是否斷開連線,百度一下沒有找到方法,看了下幫助文件,得到以下方法,實測可用,如有更好的還請告知 enum SocketError {           ConnectionRefusedError,           RemoteH

【VS開發】TCP服務如何判斷客戶斷開連線

23.1介紹 在一個空閒的(idle)TCP連線上,沒有任何的資料流,許多TCP/IP的初學者都對此感到驚奇。也就是說,如果TCP連線兩端沒有任何一個程序在向對方傳送資料,那麼在這兩個TCP模組之間沒有任何的資料交換。你可能在其它的網路協議中發現有輪詢(polling),但在TCP中它不存在。言外之意就

伺服器中判斷客戶socket斷開連線的方法

1, 如果服務端的Socket比客戶端的Socket先關閉,會導致客戶端出現TIME_WAIT狀態,佔用系統資源。 所以,必須等客戶端先關閉Socket後,伺服器端再關閉Socket才能避免TIME_WAIT狀態的出現。 2, 在linux下寫socket的程式的時候,如果嘗

tcp連線處理服務客戶處理方式

長連線的處理方式是: Server端收到Client端發來的資訊之後,開始心跳計時,在設定時間內如果收到Client發來的訊息,則重置計時器,否則計時結束斷開連線。 Client端,處理方式是:用time.NewTicker建立一個定時器,每間隔一秒傳送下當前時間到伺服器。 服務端程式碼如下:

WCF心跳判斷服務客戶是否掉線並實現重連線

本篇文章將通過一個例項實現對WCF中針對服務端以及客戶端是否掉線進行判斷;若掉線時伺服器或客戶端又線上時將實現自動重連;將通過WCF的雙工知識以及相應的心跳包來實現此功能; 首先了解一下本例項的一個分層架構圖;相信瞭解WCF對這個分層法肯定都很瞭解;其中Client為客

基於Socket的TCP連線服務Java+客戶Android),Service配合AIDL實現

最近公司的專案要求加入訊息推送功能,由於專案使用者量不是很大,推送需求不是很嚴格,而且是基於內網的推送,所以我捨棄了使用三方的推送服務,自己使用Socket寫了推送功能,剪出一個小Demo來跟大家分享一下,有不足之處希望讀者能夠多多給出建議。 關於Socket的

Linux c實現一個tcp文件服務器和客戶

repr snippets 功能 stderr strcpy fprintf inet_addr 編寫 create 總體需求:編寫tcp文件服務器和客戶端。客戶端可以上傳和下載文件。 ===========================================

python3實現TCP協議的簡單服務器和客戶

由於 轉載 while encoding ont ans 令行 cti 數據 利用python3來實現TCP協議,和UDP類似。UDP應用於及時通信,而TCP協議用來傳送文件、命令等操作,因為這些數據不允許丟失,否則會造成文件錯誤或命令混亂。下面代碼就是模擬客戶端通過命令行

tcp 服務客戶程序設計

cti ida ons uint8_t 文件 數據 開頭 ews 信息 一、實驗目的 學習和掌握Linux下的TCP服務器基本原理和基本編程方法,體會TCP與UDP編程的不同,UDP編程:http://blog.csdn.net/yueguanghaidao/articl

編寫一個簡單的TCP服務客戶

不同的 大連 終端 服務器端 com 讀寫 所有 字數 資料 下面的實驗環境是linux系統。 效果如下: 1.啟動服務端程序,監聽在6666端口上 2.啟動客戶端,與服務端建立TCP連接 3.建立完TCP連接,在客戶端上向服務端發送消息 4.斷開

TCP網絡程序實例——服務客戶交互

href tcpclient 端口號 信息 try 本機ip 發送數據 定義 .cn ◆ 服務器端 創建服務器端項目Server,在Main方法中創建TCP連接對象;然後監聽客戶端接入,並讀取接入的客戶端IP地址和傳入的消息;最後向接入的客戶端發送一條信息。代碼如下:

QTcpSocket-Qt使用Tcp通訊實現服務客戶

超過 amp 方式 all trac tro article ada 內部 版權聲明:若無來源註明,Techie亮博客文章均為原創。 轉載請以鏈接形式標明本文標題和地址: 本文標題:QTcpSocket-Qt使用Tcp通訊實現服務端和客戶端 本文地址:http:/