導航:首頁 > 編程系統 > linuxtcp斷開觸發

linuxtcp斷開觸發

發布時間:2022-09-27 14:42:53

linux C 進行TCP網路連接,怎樣設置連接超時時間

如果你確定,真的不需要等這么久,或者用戶希望可以隨時中上連接過程,那麼一般是用 非阻塞模式來做的. 看看我的這段連接代碼(節選),可以作為TCP連接的典範:

bool CRemoteLink::Connect()
{
OnDisconnected(); // 如果已經連接,則斷開

if(!m_bUseProxy)
{

m_iConnStatus = SS_CONNECTING; // 正在連接狀態
GNTRACE ("開始連接到遠程伺服器[%s][%ld]...\n", m_strip.c_str(), m_port);

// 建立套接字, 准備連接到伺服器
m_socket = ::socket(AF_INET, SOCK_STREAM, 0);
if (socket < 0) {
if(m_pCallBack)
m_pCallBack->OnSocketError(SE_CREATE, MSG_SE_CREATE);
return false;
}

// 設為非同步操作方式
unsigned long on = 1;
if (::ioctlsocket(m_socket, FIONBIO, &on) < 0) {
::closesocket(m_socket);
if(m_pCallBack)
m_pCallBack->OnSocketError(SE_CREATE, MSG_SE_CREATE);
return false;
}

sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(m_strip.c_str());
addr.sin_port = htons(m_port);

int rt;
rt = ::connect(m_socket, (sockaddr *) &addr, sizeof(addr));
if (rt == 0) {
OnConnected();
return true;
}

// ==================================================================
timeval to;

// 首先建立連接
fd_set wfds;
fd_set efds;
FD_ZERO(&wfds);
FD_ZERO(&efds);

// test shutdown event each 100ms.
to.tv_sec = 0;
// CONNECT_TIMEOUT;
to.tv_usec = 100000;

int it = 0;
while(!m_meShutdown.Wait(0) && !m_meConnStop.Wait(0))
{
FD_SET(m_socket, &wfds);
FD_SET(m_socket, &efds);
int n = select(m_socket + 1, NULL, &wfds, &efds, &to);

if (n > 0) {
if(FD_ISSET(m_socket, &wfds))
{
OnConnected();
return true;
}
else
{
//int err = ::WSAGetLastError();
//const char* msg = GetLastErrorMessage(err);
GNTRACE ("CRemoteLink::Connect : connection attempt failed!\n");
if(m_pCallBack)
m_pCallBack->OnSocketError(SE_CONN, MSG_SE_CONN);
break;
}
} else if (n < 0) { // Select Error
int err = ::WSAGetLastError();
const char* msg = GetLastErrorMessage(err);
GNTRACE ("CRemoteLink::Connect : Select Error.[%d] - %s\n", err, msg);
if(m_pCallBack)
m_pCallBack->OnSocketError(err, msg);
break;
}
else
{
it += 100;
if(it > 30000) // 連接超時 -- (30S)
{
GNTRACE ("CRemoteLink::Connect : Time out.\n");
if(m_pCallBack)
m_pCallBack->OnSocketError(SE_TIMEOUT, MSG_SE_TIMEOUT);
break;
}
}
}
if(m_meConnStop.Wait(0))
{
GNTRACE("連接過程進行時被取消。\n");
}
}
else
{
// 通過代理伺服器連接

⑵ 檢查tcp 有沒有斷開 linux

client/server端recv:
①對端close(fd)檢測(超時檢測):recv 返回0,說明緩存區數據被讀完,實測兩種情況,對端沒有再發數據,對端fd被關閉了。
通過select超時來檢測,當超時如2s,我們認為對端連接斷開,應關閉本地的fd。
②網線斷開/斷電關機檢測(超時檢測):recv 返回-1,errno == EAGAIN,意為「沒有可讀寫數據,緩沖區無數據」。
所以此時需要select超時檢測,若超時,要麼對端沒有再發數據,要麼對端的網線斷了或者直接斷電了。
超過我們判定為對端不在線,關閉本地的fd。

⑶ linux中tcp連接斷開重蓮時伺服器應該怎麼處理

斷開重連,還是需要重新建立tcp三次握手,建立連接。

⑷ Linux裡面tcp和tcp6區別是什麼

指代不同
TCP:是一種面向連接的、可靠的、基於位元組流的傳輸層通信協議。
TCP6:是互聯網工程任務組設計的用於替代ipv4的下一代ip協議。
功能不同
TCP:適應支持多網路應用的分層協議層次結構,連接到不同但互連的計算機通信網路的主計算機中的成對進程之間依靠TCP提供可靠的通信服務。
TCP6:ipv6具有更大的地址空間,ipv4中規定ip長度為32,最大地址個數為2^32,IPv6中ip地址的長度為128,即最大地址個數為2^128。與32位地址空間對比,其地址空間增加了2^128-2^32個。
特點不同
TCP:TCP應該能夠在從硬線連接到分組交換或電路交換網路的各種通信系統之上操作。
TCP6:不僅能解決網路地址資源數量的問題,而且也解決了多種接入設備連入互聯網的障礙。

⑸ Linux 下怎麼釋放 TCP 連接

先用ps命令找到哪些服務正在調用該阻塞的埠; 再用kill -s 19 #進程編號#暫停掉該項服務,也可以直接kill掉; 這樣資源就釋放出來了

⑹ linux tcp連接狀態有哪些

TCP連接狀態詳解
LISTEN: 偵聽來自遠方的TCP埠的連接請求
SYN-SENT: 再發送連接請求後等待回匹配的連接請求
SYN-RECEIVED:再答收到和發送一個連接請求後等待對方對連接請求的確認
ESTABLISHED: 代表一個打開的連接
FIN-WAIT-1: 等待遠程TCP連接中斷請求,或先前的連接中斷請求的確認
FIN-WAIT-2: 從遠程TCP等待連接中斷請求
CLOSE-WAIT: 等待從本地用戶發來的連接中斷請求
CLOSING: 等待遠程TCP對連接中斷的確認
LAST-ACK: 等待原來的發向遠程TCP的連接中斷請求的確認
TIME-WAIT: 等待足夠的時間以確保遠程TCP接收到連接中斷請求的確認
CLOSED: 沒有任何連接狀態

⑺ 關於linux系統下TCP通信 伺服器read函數一直讀取數據卻什麼都讀不到的問題

採用多線程編程,主進程負責等待連接到來,收到連接請求後父進程派生一個線程去處理該版通信過程,權通信處理交給該線程,父進程繼續循環等待連接請求。通信結束,該線程結束。
當然也可以採用信號觸發方式,當連接請求到來時,觸發父進程派生一個線程去處理該請求。

⑻ 如何使用linux命令關閉一個socket

在linux的網路編程抄,特別是TCP的編程中,SIGPIPE信號錯誤是一個比較常見的問題,我猜測你是在使用TCP的socket吧,如果是這樣的話,很有可能是你在向一個已經處於關閉狀態的socket寫數據,因為TCP是面向連接的協議。如果對方將socket給close掉了,而你還繼續往這個socket寫數據,就會觸發這個信號。因此,建議你在write之前檢查一下對方是否已經close掉了這個socket。如果回答得不對,可以繼續追問哈

⑼ Linux中TCP通信中 send函數 如何判斷 何時斷開連接了

1 確認鏈路是否連通狀態,最好加心跳機制, 如果一定時間沒有收到心跳包,或者沒有回復心跳
就應認為此鏈路已經壞掉了,需要關閉,重新連接!

2 至於發送數據,應該檢查對應的api的返回值,是否已經成功發送或者接受定長數據!
沒有完成應該重新發送或者接受

3 網路數據問題,可以用抓包工具直接抓包看數據,可以看的比較透徹
工具 Linux下用tcpmp,windows用wirekshark

⑽ c# TCP/IP 自動斷開

TCP/IP建立與斷開連接詳細過程

TCP協議連接建立時3次握手的過程。

簡述TCP協議連接建立時3次握手的過程。

根據TCP頭部,說明下列3個包在連接建立過程中的次序.

...P..FI>.3.7...

................

004062b700564a2a01030302b..VJ*....(1)

.....P3.7.......

...............V

00404a2a0000000001030300J*........(2)

.....P3.7.FI>...

...K.......VJ6..

004062b7b.(3)

解:

在TCP/IP協議中,TCP協議提供可靠的連接服務,採用三次握手建立一個連接。

1)是第二次握手,flags位上為12,二進制是00010010,即表示有syn和ack.

2)是第一次握手,flags位上為02,二進制是00000010,即表示有syn沒有ack。

3)是第三次握手,flags位上為10,二進制是00010000,即表示有ack沒有syn。

該連接訪問的是80埠,是為HTTP(HyperTextTransportProtocol,超文本傳輸協議)開放的,

第一次握手:建立連接時,客戶端發送syn包(syn=j)到伺服器,並進入SYN_SEND狀態,等待伺服器確認;

第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;

第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手。

完成三次握手,客戶端與伺服器開始傳送數據。

tcp-斷開連接:

主要部分,四次握手:

斷開連接其實從我的角度看不區分客戶端和伺服器端,任何一方都可以調用close(orclosesocket)之類

的函數開始主動終止一個連接。這里先暫時說正常情況。當調用close函數斷開一個連接時,主動斷開的

一方發送FIN(finish報文給對方。有了之前的經驗,我想你應該明白我說的FIN報文時什麼東西。也就是

一個設置了FIN標志位的報文段。FIN報文也可能附加用戶數據,如果這一方還有數據要發送時,將數據附

加到這個FIN報文時完全正常的。之後你會看到,這種附加報文還會有很多,例如ACK報文。我們所要把握

的原則是,TCP肯定會力所能及地達到最大效率,所以你能夠想到的優化方法,我想TCP都會想到。

當被動關閉的一方收到FIN報文時,它會發送ACK確認報文(對於ACK這個東西你應該很熟悉了)。這里有個

東西要注意,因為TCP是雙工的,也就是說,你可以想像一對TCP連接上有兩條數據通路。當發送FIN報文

時,意思是說,發送FIN的一端就不能發送數據,也就是關閉了其中一條數據通路。被動關閉的一端發送

了ACK後,應用層通常就會檢測到這個連接即將斷開,然後被動斷開的應用層調用close關閉連接。

我可以告訴你,一旦當你調用close(orclosesocket),這一端就會發送FIN報文。也就是說,現在被動

關閉的一端也發送FIN給主動關閉端。有時候,被動關閉端會將ACK和FIN兩個報文合在一起發送。主動

關閉端收到FIN後也發送ACK,然後整個連接關閉(事實上還沒完全關閉,只是關閉需要交換的報文發送

完畢),四次握手完成。如你所見,因為被動關閉端可能會將ACK和FIN合到一起發送,所以這也算不上

嚴格的四次握手---四個報文段。

在前面的文章中,我一直沒提TCP的狀態轉換。在這里我還是在猶豫是不是該將那張四處通用的圖拿出來,

不過,這里我只給出斷開連接時的狀態轉換圖,摘自<TheTCP/IPGuide>:

給出一個正常關閉時的winmp信息:

14:00:38.819856IPcd-zhangmin.1748>220.181.37.55.80:F1:1(0)ack1win65535

14:00:38.863989IP220.181.37.55.80>cd-zhangmin.1748:F1:1(0)ack2win2920

14:00:38.864412IPcd-zhangmin.1748>220.181.37.55.80:.ack2win65535

補充細節:

關於以上的四次握手,我補充下細節:

1.默認情況下(不改變socket選項),當你調用close(orclosesocket,以下說close不再重復)時,如果

發送緩沖中還有數據,TCP會繼續把數據發送完。

2.發送了FIN只是表示這端不能繼續發送數據(應用層不能再調用send發送),但是還可以接收數據。

3.應用層如何知道對端關閉?通常,在最簡單的阻塞模型中,當你調用recv時,如果返回0,則表示對端

關閉。在這個時候通常的做法就是也調用close,那麼TCP層就發送FIN,繼續完成四次握手。如果你不調用

close,那麼對端就會處於FIN_WAIT_2狀態,而本端則會處於CLOSE_WAIT狀態。這個可以寫代碼試試。

4.在很多時候,TCP連接的斷開都會由TCP層自動進行,例如你CTRL+C終止你的程序,TCP連接依然會正常關

閉,你可以寫代碼試試。

特別的TIME_WAIT狀態:

從以上TCP連接關閉的狀態轉換圖可以看出,主動關閉的一方在發送完對對方FIN報文的確認(ACK)報文後,

會進入TIME_WAIT狀態。TIME_WAIT狀態也稱為2MSL狀態。

什麼是2MSL?MSL即MaximumSegmentLifetime,也就是報文最大生存時間,引用<TCP/IP詳解>中的話:「

它(MSL)是任何報文段被丟棄前在網路內的最長時間。」那麼,2MSL也就是這個時間的2倍。其實我覺得沒

必要把這個MSL的確切含義搞明白,你所需要明白的是,當TCP連接完成四個報文段的交換時,主動關閉的

一方將繼續等待一定時間(2-4分鍾),即使兩端的應用程序結束。你可以寫代碼試試,然後用netstat查看下。

為什麼需要2MSL?根據<TCP/IP詳解>和<TheTCP/IPGuide>中的說法,有兩個原因:

其一,保證發送的ACK會成功發送到對方,如何保證?我覺得可能是通過超時計時器發送。這個就很難用

代碼演示了。

其二,報文可能會被混淆,意思是說,其他時候的連接可能會被當作本次的連接。直接引用<TheTCP/IPGuide>

的說法:Thesecondistoprovidea「bufferingperiod」betweentheendofthisconnection

andanysubsequentones.Ifnotforthisperiod,

connectionscouldbemixed,creatingconfusion.

TIME_WAIT狀態所帶來的影響:

當某個連接的一端處於TIME_WAIT狀態時,該連接將不能再被使用。事實上,對於我們比較有現實意義的

是,這個埠將不能再被使用。某個埠處於TIME_WAIT狀態(其實應該是這個連接)時,這意味著這個TCP

連接並沒有斷開(完全斷開),那麼,如果你bind這個埠,就會失敗。

對於伺服器而言,如果伺服器突然crash掉了,那麼它將無法再2MSL內重新啟動,因為bind會失敗。解決這

個問題的一個方法就是設置socket的SO_REUSEADDR選項。這個選項意味著你可以重用一個地址。

對於TIME_WAIT的插曲:

當建立一個TCP連接時,伺服器端會繼續用原有埠監聽,同時用這個埠與客戶端通信。而客戶端默認情況

下會使用一個隨機埠與伺服器端的監聽埠通信。有時候,為了伺服器端的安全性,我們需要對客戶端進行

驗證,即限定某個IP某個特定埠的客戶端。客戶端可以使用bind來使用特定的埠。

對於伺服器端,當設置了SO_REUSEADDR選項時,它可以在2MSL內啟動並listen成功。但是對於客戶端,當使

用bind並設置SO_REUSEADDR時,如果在2MSL內啟動,雖然bind會成功,但是在windows平台上connect會失敗。

而在linux上則不存在這個問題。(我的實驗平台:winxp,ubuntu7.10)

要解決windows平台的這個問題,可以設置SO_LINGER選項。SO_LINGER選項決定調用close時,TCP的行為。

SO_LINGER涉及到linger結構體,如果設置結構體中l_onoff為非0,l_linger為0,那麼調用close時TCP連接

會立刻斷開,TCP不會將發送緩沖中未發送的數據發送,而是立即發送一個RST報文給對方,這個時候TCP連

接就不會進入TIME_WAIT狀態。

如你所見,這樣做雖然解決了問題,但是並不安全。通過以上方式設置SO_LINGER狀態,等同於設置SO_DONTLINGER

狀態。

斷開連接時的意外:

這個算不上斷開連接時的意外,當TCP連接發生一些物理上的意外情況時,例如網線斷開,linux上的TCP實現

會依然認為該連接有效,而windows則會在一定時間後返回錯誤信息。

這似乎可以通過設置SO_KEEPALIVE選項來解決,不過不知道這個選項是否對於所有平台都有效。

閱讀全文

與linuxtcp斷開觸發相關的資料

熱點內容
測名網站哪個比較好 瀏覽:912
手機克隆後的數據存在哪裡 瀏覽:201
linux下lib文件使用 瀏覽:578
有希望的男人女主是誰 瀏覽:956
金十數據在哪裡看eia公布時間 瀏覽:687
ppt堆積柱形圖怎麼編輯數據進去 瀏覽:546
食物鏈韓劇女主角是誰 瀏覽:245
木材義大利電影 瀏覽:609
崔字打一個生肖 瀏覽:289
電腦桌面文件名突然改變 瀏覽:559
台灣大尺度電視劇男男 瀏覽:988
ios延遲配置文件 瀏覽:100
全國最大的電影網站 瀏覽:384
日本胸大電影推薦 瀏覽:980
色色言情小說 瀏覽:301
用什麼app看ar電影最好 瀏覽:104
都市之福艷後宮相同的小說 瀏覽:509
iphone6splus上不wifi 瀏覽:94
泰國一部女人想出農村的電影 瀏覽:538
《月亮河》印度電影 瀏覽:871

友情鏈接