成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Socket調用Close后如何終止套接口的問題

網絡
在使用Socket調用過程中Close會出現會出現一些問題,當這些問題出現時我們應該如何去終止,本文為終止套接口問題提供了解決方案。

在使用Socket調用過程中Close會出現會出現一些問題,當這些問題出現時我們應該如何去終止,本文為終止套接口問題提供了解決方案。

setsockopt 設置 SO_LINGER 選項

此選項指定函數close對面向連接的協議如何操作(如TCP)。內核缺省close操作是立即返回,如果有數據殘留在套接口緩沖區中則系統將試著將這些數據發送給對方。

SO_LINGER選項用來改變此缺省設置。使用如下結構:

struct linger {

int l_onoff; /* 0 = off, nozero = on */

int l_linger; /* linger time */

};

有下列三種情況:

1、設置 l_onoff為0,則該選項關閉,l_linger的值被忽略,等于內核缺省情況,close調用會立即返回給調用者,如果可能將會傳輸任何未發送的數據;

2、設置 l_onoff為非0,l_linger為0,則套接口關閉時TCP夭折連接,TCP將丟棄保留在套接口發送緩沖區中的任何數據并發送一個RST給對方,而不是通常的四分組終止序列,這避免了TIME_WAIT狀態;

3、設置 l_onoff 為非0,l_linger為非0,當套接口關閉時內核將拖延一段時間(由l_linger決定)。如果套接口緩沖區中仍殘留數據,進程將處于睡眠狀態,直 到(a)所有數據發送完且被對方確認,之后進行正常的終止序列(描述字訪問計數為0)或(b)延遲時間到。此種情況下,應用程序檢查close的返回值是非常重要的,如果在數據發送完并被確認前時間到,close將返回EWOULDBLOCK錯誤且套接口發送緩沖區中的任何數據都丟失。close的成功返回僅告訴我們發送的數據(和FIN)已由對方TCP確認,它并不能告訴我們對方應用進程是否已讀了數據。如果套接口設為非阻塞的,它將不等待close完成。

注釋:l_linger的單位依賴于實現: 4.4BSD假設其單位是時鐘滴答(百分之一秒),但Posix.1g規定單位為秒。

下面的代碼是一個使用SO_LINGER選項的例子,使用30秒的超時時限:

#define TRUE 1

#define FALSE 0

int z; /* Status code

*/ int s; /* Socket s */

struct linger so_linger;

...

so_linger.l_onoff = TRUE;

so_linger.l_linger = 30;

z = setsockopt(s,

SOL_SOCKET,

SO_LINGER,

&so_linger,

sizeof so_linger);

if ( z )

perror("setsockopt(2)");

下面的例子顯示了如何設置SO_LINGER的值來中止套接口s上的當前連接:

#define TRUE 1

#define FALSE 0

int z; /* Status code */

int s; /* Socket s */

struct linger so_linger;

...

so_linger.l_onoff = TRUE;

so_linger.l_linger = 0;

z = setsockopt(s,

SOL_SOCKET,

SO_LINGER,

&so_linger,

sizeof so_linger);

if ( z )

perror("setsockopt(2)");

close(s); /* Abort connection */

#p#

在上面的這個例子中,當調用close函數時,套接口s會立即中止。中止的語義是通過將超時值設置為0來實現的。

/********** WINDOWS **********/

/* 當連接中斷時,需要延遲關閉(linger)以保證所有數據都被傳輸,所以需要打開SO_LINGER這個選項;

* //注:大致意思就是說SO_LINGER選項用來設置當調用closesocket時是否馬上關閉socket;

* linger的結構在/usr/include/linux/socket.h中定義://注:這個結構就是SetSocketOpt中的Data的數據結構

*  struct linger

*  {

*   int l_onoff;  /* Linger active */ //低字節,0和非0,用來表示是否延時關閉socket

*   int l_linger; /* How long to linger */ //高字節,延時的時間數,單位為秒

*  };

*  如果l_onoff為0,則延遲關閉特性就被取消。

* 如果非零,則允許套接口延遲關閉; l_linger字段則指明延遲關閉的時間

*/

更具體的描述如下:

1、若設置了SO_LINGER(亦即linger結構中的l_onoff域設為非零),并設置了零超時間隔,則closesocket()不被阻塞立即執行,不論是否有排隊數據未發送或未被確認。這種關閉方式稱為“強制”或“失效”關閉,因為套接口的虛電路立即被復位,且丟失了未發送的數據。在遠端的recv()調用將以WSAECONNRESET出錯。

2、若設置了SO_LINGER并確定了非零的超時間隔,則closesocket()調用阻塞進程,直到所剩數據發送完畢或超時。這種關閉稱為“優雅”或“從容”關閉。請注意如果套接口置為非阻塞且SO_LINGER設為非零超時,則closesocket()調用將以WSAEWOULDBLOCK錯誤返回。

3、若在一個流類套接口上設置了SO_DONTLINGER(也就是說將linger結構的l_onoff域設為零),則closesocket()調用立即返回。但是,如果可能,排隊的數據將在套接口關閉前發送。請注意,在這種情況下WINDOWS套接口實現將在一段不確定的時間內保留套接口以及其他資源,這對于想用所以套接口的應用程序來說有一定影響。

SO_DONTLINGER 若為真,則SO_LINGER選項被禁止。

SO_LINGER延遲關閉連接 struct linger上面這兩個選項影響close行為;

選項 間隔 關閉方式 等待關閉與否

SO_DONTLINGER 不關心 優雅 否

SO_LINGER 零 強制 否

SO_LINGER 非零 優雅 是

責任編輯:何妍 來源: CSDN博客
相關推薦

2021-07-15 14:27:47

LinuxSocketClose

2010-03-19 17:04:01

Java socket

2020-10-15 19:10:05

LinuxAPI函數

2021-10-11 11:53:07

C++接口代碼

2010-03-04 09:20:48

Android接口

2010-03-19 13:48:15

Java Socket

2020-07-31 18:33:56

C++編程語言

2019-08-28 14:21:39

C++C接口代碼

2021-08-14 22:29:42

Backstab進程安全工具

2024-08-20 08:05:14

WinformWndProc?Windows

2024-04-09 13:52:49

接口AI電商

2010-02-26 11:15:51

WCF接口方法

2023-11-01 10:58:31

系統調用高性能網絡編程Linux

2011-06-13 16:51:19

Qt Socket

2011-08-24 18:14:55

socket中文man

2016-12-05 17:08:30

tcpsocketandroid

2022-03-04 09:43:18

UDP日志TCP

2014-12-11 09:20:30

TCP

2024-06-06 08:46:37

2025-03-10 09:00:00

Ollama開源大模型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人在线观看亚洲 | 日韩午夜精品 | 精品一区二区三区在线观看国产 | 99精品欧美一区二区三区综合在线 | 99在线免费观看视频 | 99精品国自产在线 | 久久国产精品色av免费观看 | 亚洲五码久久 | 亚洲精品电影网在线观看 | 免费黄网站在线观看 | 日操夜操 | 日本超碰 | 国产精品大片在线观看 | 国产区在线 | 国产日韩精品一区二区三区 | 久久av一区 | a视频在线 | 黄视频网站免费观看 | 欧美激情亚洲激情 | 91久久国产综合久久 | 羞羞视频网站免费观看 | 成人综合久久 | 亚洲毛片在线观看 | 国产欧美一区二区三区国产幕精品 | 亚洲精品在线看 | 黄色毛片免费看 | 久久99视频这里只有精品 | 精精国产xxxx视频在线播放7 | 日韩在线视频免费观看 | 精品国产欧美 | 亚洲一区在线播放 | 伊人网伊人 | 日韩欧美视频免费在线观看 | 激情综合五月天 | 九九免费观看视频 | 亚洲福利免费 | 狠狠色狠狠色综合系列 | 国产日韩一区二区 | 午夜一级黄色片 | 久久久久久久久毛片 | 日韩第一区 |