1. 程式人生 > >Tcp服務端判斷客戶端是否斷開連線

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

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

      然後就開始找各種方法。其中簡單的是看recv()返回為0,表明斷開了連結,但是recv函式始終返回SOCKET_ERROR,找不到原因。。。。。。。。。。。。

      現在已經調通了,就是recv()==0時,斷開連線。先主要是沒有用accept()的socket,當然接收不到東西。。。

參考的方法: 下面來羅列一下判斷遠端已經斷開的方法:

法一: 當recv()返回值小於等於0時,socket連線斷開。但是還需要判斷 errno是否等於 EINTR,如果errno == EINTR 則說明recv函式是由於程式接收到訊號後返回的,socket連線還是正常的,不應close掉socket連線。

法二:

struct tcp_info info;

int len=sizeof(info);

getsockopt(sock, IPPROTO_TCP, TCP_INFO, &info, (socklen_t *)&len); if((info.tcpi_state==TCP_ESTABLISHED)) 則說明未斷開 else 斷開

法三: 若使用了select等系統函式,若遠端斷開,則select返回1,recv返回0則斷開。其他注意事項同法一。

法四:

int keepAlive = 1; // 開啟keepalive屬性

int keepIdle = 60; // 如該連線在60秒內沒有任何資料往來,則進行探測

int keepInterval = 5; // 探測時發包的時間間隔為5 秒

int keepCount = 3; // 探測嘗試的次數.如果第1次探測包就收到響應了,則後2次的不再發.

setsockopt(rs, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive));

setsockopt(rs, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle));

setsockopt(rs, SOL_TCP, TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval));

setsockopt(rs, SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount));

設定後,若斷開,則在使用該socket讀寫時立即失敗,並返回ETIMEDOUT錯誤

法五: 自己實現一個心跳檢測,一定時間內未收到自定義的心跳包則標記為已斷開。 參考:http://www.cppblog.com/luketowne/articles/77780.html http://www.blogjava.net/thisliy/archive/2010/02/17/313271.html http://blog.csdn.net/henry000/article/details/7250866

相關推薦

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

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

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

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

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

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

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

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

使用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中它不存在。言外之意就

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:/

TCP阻塞模型下服務器和客戶的建立步驟

linuxTCP阻塞模型下服務器和客戶端的建立步驟:服務器的建立步驟:1.調用socket建立TCP套接字2.調用bind將套接字跟本地地址綁定3.調用listen建立監聽4.建立accept接受來自客戶端的連接,返回新的連接套接字5.在新的套接字上面,調用send/recv實現跟客戶端的通信客戶端的建立步驟

tcp文件下載客戶+服務

des 讀取文件 個人 讀取 循環 用戶輸入 file listen 消息 客戶端: import socket if __name__ == ‘__main__‘: # 創建tcp客戶端socket tcp_client_socket = socket

Socket TCP 協議實現服務客戶的簡單通訊-結合線程池的使用

文章目錄 前言 當前模式的弊端 服務端程式碼 客戶端程式碼 執行結果 客戶端 服務端

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

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