小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

setsockopt :SO_LINGER 選項(xiàng)設(shè)置

 firefox_zyw 2013-07-11

setsockopt :SO_LINGER 選項(xiàng)設(shè)置

分類: 網(wǎng)絡(luò)編程 12127人閱讀 評(píng)論(3) 收藏 舉報(bào)

 

setsockopt 設(shè)置 SO_LINGER 選項(xiàng)

 

   此選項(xiàng)指定函數(shù)close對(duì)面向連接的協(xié)議如何操作(如TCP)。內(nèi)核缺省close操作是立即返回,如果有數(shù)據(jù)殘留在套接口緩沖區(qū)中則系統(tǒng)將試著將這些數(shù)據(jù)發(fā)送給對(duì)方。

 

SO_LINGER選項(xiàng)用來改變此缺省設(shè)置。使用如下結(jié)構(gòu):

struct linger {

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

     int l_linger; /* linger time */

};

 

有下列三種情況:

1、設(shè)置 l_onoff為0,則該選項(xiàng)關(guān)閉,l_linger的值被忽略,等于內(nèi)核缺省情況,close調(diào)用會(huì)立即返回給調(diào)用者,如果可能將會(huì)傳輸任何未發(fā)送的數(shù)據(jù);

 

2、設(shè)置 l_onoff為非0,l_linger為0,則套接口關(guān)閉時(shí)TCP夭折連接,TCP將丟棄保留在套接口發(fā)送緩沖區(qū)中的任何數(shù)據(jù)并發(fā)送一個(gè)RST給對(duì)方,而不是通常的四分組終止序列,這避免了TIME_WAIT狀態(tài);

 

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

 

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

 

下面的代碼是一個(gè)使用SO_LINGER選項(xiàng)的例子,使用30秒的超時(shí)時(shí)限:
#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)");

下面的例子顯示了如何設(shè)置SO_LINGER的值來中止套接口s上的當(dāng)前連接:
#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 */

在上面的這個(gè)例子中,當(dāng)調(diào)用close函數(shù)時(shí),套接口s會(huì)立即中止。中止的語義是通過將超時(shí)值設(shè)置為0來實(shí)現(xiàn)的。

 

 

 

 

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

 

 

/* 當(dāng)連接中斷時(shí),需要延遲關(guān)閉(linger)以保證所有數(shù)據(jù)都被傳輸,所以需要打開SO_LINGER這個(gè)選項(xiàng);  
 * //注:大致意思就是說SO_LINGER選項(xiàng)用來設(shè)置當(dāng)調(diào)用closesocket時(shí)是否馬上關(guān)閉socket;
 * linger的結(jié)構(gòu)在/usr/include/linux/socket.h中定義://注:這個(gè)結(jié)構(gòu)就是SetSocketOpt中的Data的數(shù)據(jù)結(jié)構(gòu)
 *  struct linger
 *  {
 *   int l_onoff;  /* Linger active */       //低字節(jié),0和非0,用來表示是否延時(shí)關(guān)閉socket
 *   int l_linger; /* How long to linger */   //高字節(jié),延時(shí)的時(shí)間數(shù),單位為秒
 *  };
 *  如果l_onoff為0,則延遲關(guān)閉特性就被取消。

 *   如果非零,則允許套接口延遲關(guān)閉; l_linger字段則指明延遲關(guān)閉的時(shí)間 
 */


更具體的描述如下:
1、若設(shè)置了SO_LINGER(亦即linger結(jié)構(gòu)中的l_onoff域設(shè)為非零),并設(shè)置了零超時(shí)間隔,則closesocket()不被阻塞立即執(zhí)行,不論是否有排隊(duì)數(shù)據(jù)未發(fā)送或未被確認(rèn)。這種關(guān)閉方式稱為“強(qiáng)制”或“失效”關(guān)閉,因?yàn)樘捉涌诘奶撾娐妨⒓幢粡?fù)位,且丟失了未發(fā)送的數(shù)據(jù)。在遠(yuǎn)端的recv()調(diào)用將以WSAECONNRESET出錯(cuò)。

2、若設(shè)置了SO_LINGER并確定了非零的超時(shí)間隔,則closesocket()調(diào)用阻塞進(jìn)程,直到所剩數(shù)據(jù)發(fā)送完畢或超時(shí)。這種關(guān)閉稱為“優(yōu)雅”或“從容”關(guān)閉。請(qǐng)注意如果套接口置為非阻塞且SO_LINGER設(shè)為非零超時(shí),則closesocket()調(diào)用將以WSAEWOULDBLOCK錯(cuò)誤返回。

3、若在一個(gè)流類套接口上設(shè)置了SO_DONTLINGER(也就是說將linger結(jié)構(gòu)的l_onoff域設(shè)為零),則closesocket()調(diào)用立即返回。但是,如果可能,排隊(duì)的數(shù)據(jù)將在套接口關(guān)閉前發(fā)送。請(qǐng)注意,在這種情況下WINDOWS套接口實(shí)現(xiàn)將在一段不確定的時(shí)間內(nèi)保留套接口以及其他資源,這對(duì)于想用所以套接口的應(yīng)用程序來說有一定影響。
 

SO_DONTLINGER 若為真,則SO_LINGER選項(xiàng)被禁止。
SO_LINGER延遲關(guān)閉連接 struct linger上面這兩個(gè)選項(xiàng)影響close行為;


     選項(xiàng)          間隔    關(guān)閉方式  等待關(guān)閉與否
  SO_DONTLINGER   不關(guān)心     優(yōu)雅         否
  SO_LINGER        零        強(qiáng)制         否
  SO_LINGER       非零       優(yōu)雅         是

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多