青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

如何優雅地關閉一個socket

轉載自: http://tb.blog.csdn.net/TrackBack.aspx?PostId=698032

最近在windows編程時需要考慮到“如何優雅地關閉一個socket”,查閱了一些資料,現將查到的相關資料做個匯編,希望能對后來者有所幫助(比較懶,所以英文資料沒有翻譯:-))

1. 關閉Socket時究竟做了什么

    關閉socket分為主動關閉(Active closure)和被動關閉(Passive closure)兩種情況。前者是指有本地主機主動發起的關閉;而后者則是指本地主機檢測到遠程主機發起關閉之后,作出回應,從而關閉整個連接。
    其狀態圖如下圖所示:

      起初每個socket都是CLOSED狀態,當客戶端初使化一個連接,他發送一個SYN包到服務器,客戶端進入SYN_SENT狀態。
服務器接收到SYN包,反饋一個SYN-ACK包,客戶端接收后返饋一個ACK包客戶端變成ESTABLISHED狀態,如果長時間沒收到SYN-ACK包,客戶端超時進入CLOSED狀態。
  當服務器綁定并監聽某一端口時,socket的狀態是LISTEN,當客戶企圖建立連接時,服務器收到一個SYN包,并反饋SYN-ACK包。服務器狀態變成SYN_RCVD,當客戶端發送一個ACK包時,服務器socket變成ESTABLISHED狀態。

  當一個程序在ESTABLISHED狀態時有兩種圖徑關閉它, 第一是主動關閉,第二是被動關閉。如果你要主動關閉的話,發送一個FIN包。當你的程序closesocket或者shutdown(標記),你的程序發送一個FIN包到peer,你的socket變成FIN_WAIT_1狀態。peer反饋一個ACK包,你的socket進入FIN_WAIT_2狀態。如果peer也在關閉連接,那么它將發送一個FIN包到你的電腦,你反饋一個ACK包,并轉成TIME_WAIT狀態。
  TIME_WAIT狀態又號2MSL等待狀態。MSL意思是最大段生命周期(Maximum Segment Lifetime)表明一個包存在于網絡上到被丟棄之間的時間。每個IP包有一個TTL(time_to_live),當它減到0時則包被丟棄。每個路由器使TTL減一并且傳送該包。當一個程序進入TIME_WAIT狀態時,他有2個MSL的時間,這個充許TCP重發最后的ACK,萬一最后的ACK丟失了,使得FIN被重新傳輸。在2MSL等待狀態完成后,socket進入CLOSED狀態。
  被動關閉:當程序收到一個FIN包從peer,并反饋一個ACK包,于是程序的socket轉入CLOSE_WAIT狀態。因為peer已經關閉了,所以不能發任何消息了。但程序還可以。要關閉連接,程序自已發送給自已FIN,使程序的TCP socket狀態變成LAST_ACK狀態,當程序從peer收到ACK包時,程序進入CLOSED狀態。

2. Winsock2 API中的相關函數

    先當然是查MSDN,看到winsocks2 API中的相關函數有:closesocket,shutdown,WSASendDisconnect. 我大致說一下,具體詳細的資料還請自行查MSDN.

    int closesocket(SOCKETs)的作用是關閉指定的socket,并且回收其所有的資源。
    int shutdown(SOCKETs,  inthow)則是禁止在指定的socket s上禁止進行由how指定的操作,但并不對資源進行回收,shutdown之后而closesocket之前s還不能再次connect或者WSAConnect.
    int WSASendDisconnect(SOCKETs,  LPWSABUFlpOutboundDisconnectData)則和shutdown基本類似,稍有不同的就是WSASendDisconnect函數多了一個lpOutboundDisconnectData參數,可以允許發送“斷開數據”(disconnect data).但MSDN上寫了“The native implementation of TCP/IP on Windows does not support disconnect data.”,所以一般我們就用shutdown函數就行了。


3. Socket的優雅關閉

在MSDN中對shutdown函數中的Remarks部分有下面一段話,指出了如何進行一次優雅的slcket關閉:

To assure that all data is sent and received on a connected socket before it is closed, an application should use shutdown to close connection before calling closesocket. For example, to initiate a graceful disconnect:

 

  1. Call WSAAsyncSelect to register for FD_CLOSE notification.
  2. Call shutdown with how=SD_SEND.
  3. When FD_CLOSE received, call recv until zero returned, or SOCKET_ERROR.
  4. Call closesocket.

closesocket的行為也是隨setsockopt()中參數的不同而有不同的表現,這里影響它的行為的主要就是那個linger結構。


SO_DONTLINGER 若為真,則SO_LINGER選項被禁止。
SO_LINGER 延遲關閉連接 struct linger 
上面這兩個選項影響close行為
選項 間隔 關閉方式 等待關閉與否
SO_DONTLINGER 不關心 優雅 否
SO_LINGER 零 強制 否
SO_LINGER 非零 優雅 是
若設置了SO_LINGER(亦即linger結構中的l_onoff域設為非零),并設置了零超時間隔,則closesocket()不被阻塞立即執行,不論是否有排隊數據未發送或未被確認。這種關閉方式稱為“強制”或“失效”關閉,因為套接口的虛電路立即被復位,且丟失了未發送的數據。在遠端的recv()調用將以WSAECONNRESET出錯。
若設置了SO_LINGER并確定了非零的超時間隔,則closesocket()調用阻塞進程,直到所剩數據發送完畢或超時。這種關閉稱為“優雅的”關閉。請注意如果套接口置為非阻塞且SO_LINGER設為非零超時,則closesocket()調用將以WSAEWOULDBLOCK錯誤返回。
若在一個流類套接口上設置了SO_DONTLINGER(也就是說將linger結構的l_onoff域設為零),則closesocket()調用立即返回。但是,如果可能,排隊的數據將在套接口關閉前發送。請注意,在這種情況下WINDOWS套接口實現將在一段不確定的時間內保留套接口以及其他資源,這對于想用所以套接口的應用程序來說有一定影響。

    所以一般來說,不應該把linger設置為SO_LINGER 并且設置timeout為0,這樣的話,當本地主機調用closesocket時將會造成一個“強制”或“失效”的非優雅關閉??梢愿鶕嶋H情況設置為另外兩種情況。

posted on 2006-05-06 23:10 楊粼波 閱讀(5476) 評論(0)  編輯 收藏 引用 所屬分類: 文章收藏

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美成黄导航| 99国产精品国产精品毛片| 亚洲一区亚洲| 欧美视频免费在线| 亚洲网站在线观看| 这里只有精品视频在线| 国产精品美女在线| 久久精品理论片| 欧美一区二区视频免费观看 | 久久综合电影一区| 久久久久久九九九九| 亚洲狠狠丁香婷婷综合久久久| 久久亚洲风情| 欧美成人午夜激情视频| 亚洲性夜色噜噜噜7777| 亚洲欧美日韩另类| 在线观看欧美激情| 亚洲日本无吗高清不卡| 欧美大片免费观看| 亚洲伊人网站| 久久精品国产免费| 日韩视频二区| 亚洲欧美日本在线| 亚洲福利在线观看| 一区二区三区视频在线看| 国产日韩视频| 亚洲国产合集| 国产精品亚洲精品| 亚洲第一黄网| 亚洲午夜伦理| 亚洲国产高潮在线观看| 在线一区观看| 亚洲黄色精品| 亚洲一区二区三区四区中文| 在线免费一区三区| 国产精品99久久久久久人| 在线欧美一区| 亚洲欧美日韩一区在线观看| 91久久精品一区二区别| 亚洲免费网站| 一区二区高清视频| 久久一区二区三区av| 午夜国产一区| 欧美精品激情| 欧美成va人片在线观看| 国产精品一级二级三级| 亚洲国产一区二区在线| 国产真实乱偷精品视频免| 一本大道久久a久久综合婷婷| 在线日韩一区二区| 午夜精品免费| 亚洲一区三区视频在线观看 | 亚洲国产精品第一区二区| 国产一区成人| 亚洲一区亚洲| 亚洲欧美精品在线观看| 欧美精品不卡| 亚洲丶国产丶欧美一区二区三区| 国产午夜精品久久久久久免费视 | 欧美一区三区三区高中清蜜桃| 欧美a级在线| 麻豆成人精品| 激情欧美亚洲| 久久成人羞羞网站| 久久精品首页| 国产婷婷色一区二区三区在线| 亚洲视频大全| 午夜精品久久久久久99热软件| 欧美剧在线观看| 亚洲精品国产精品国自产观看浪潮| 亚洲国产精彩中文乱码av在线播放| 性欧美超级视频| 久久黄色网页| 国产综合在线看| 久久成人免费| 欧美电影免费网站| 亚洲欧洲日夜超级视频| 欧美精品在线视频观看| 亚洲乱码国产乱码精品精可以看 | 亚洲三级免费电影| 欧美极品在线视频| 亚洲精品免费在线播放| 亚洲尤物影院| 国产精品免费看| 午夜久久资源| 久久综合中文色婷婷| 影音先锋国产精品| 欧美激情一区二区三区四区| 亚洲美女在线一区| 亚洲女人天堂av| 久久米奇亚洲| 亚洲高清视频中文字幕| 亚洲视频一二三| 国产精品日韩欧美综合| 午夜亚洲福利| 欧美国产激情二区三区| aa日韩免费精品视频一| 国产精品入口日韩视频大尺度| 午夜精品视频在线观看一区二区 | 亚洲国产欧美日韩精品| 欧美日韩国产欧| 亚洲一区二区在线| 欧美~级网站不卡| 在线亚洲免费| 狠狠色综合网站久久久久久久| 欧美成人dvd在线视频| 在线视频精品| 男女视频一区二区| 亚洲综合精品自拍| 亚洲第一区中文99精品| 欧美日韩精品中文字幕| 久久精品99无色码中文字幕| 亚洲人在线视频| 久久久av网站| 国产精品99久久久久久久久| 国语精品中文字幕| 国产精品成人一区二区网站软件 | 亚洲国产成人久久| 欧美一区免费视频| 制服诱惑一区二区| 亚洲第一区色| 国产一区二区在线观看免费播放| 欧美日韩国产另类不卡| 久久综合网色—综合色88| 亚洲欧美日产图| 99国产精品99久久久久久| 欧美成人精品影院| 久久久亚洲精品一区二区三区 | 国产欧美精品va在线观看| 欧美激情一区二区三区高清视频| 久久精品国产v日韩v亚洲| 在线视频你懂得一区| 亚洲国产精品精华液2区45| 久久视频这里只有精品| 香蕉乱码成人久久天堂爱免费 | 亚洲区欧美区| 一区二区三区在线视频观看| 国产精品卡一卡二卡三| 欧美精品在线观看91| 麻豆91精品| 久久精品最新地址| 久久久久久久久久久一区| 性久久久久久久久| 亚洲欧美日韩一区在线| 午夜精品久久久久久久99水蜜桃 | 亚洲高清久久久| 欧美v日韩v国产v| 久久综合久久综合这里只有精品| 亚洲欧美国产三级| 一区二区三区精品| 亚洲视频在线观看免费| 亚洲少妇中出一区| 亚洲欧美激情视频| 黄色日韩精品| 在线成人激情黄色| 在线观看亚洲视频| 欧美一区二区三区精品| 亚洲欧美一级二级三级| 亚洲在线视频免费观看| 亚洲综合不卡| 亚洲欧美日韩网| 销魂美女一区二区三区视频在线| 亚洲永久免费精品| 欧美一区二区视频在线观看| 欧美在线一区二区三区| 欧美在线视频网站| 久久中文久久字幕| 欧美激情视频一区二区三区免费 | 老司机成人网| 欧美成人在线影院| 欧美日韩国产美女| 国产精品一区二区三区四区| 国产亚洲精品美女| 亚洲国产中文字幕在线观看| 亚洲免费高清视频| 欧美一区二区观看视频| 欧美成人精品激情在线观看| 亚洲高清在线精品| 亚洲一区二区三区乱码aⅴ| 久久精品国产第一区二区三区最新章节| 久久久久一区二区三区| 欧美精品久久99| 国产欧美另类| 亚洲精品国产日韩| 性欧美8khd高清极品| 欧美大片在线观看| 亚洲一区二区三区在线看| 久久精品视频导航| 国产精品扒开腿爽爽爽视频| 国产亚洲一二三区| 亚洲社区在线观看| 蜜臀久久99精品久久久画质超高清| 亚洲精品国产精品国自产在线 | 亚洲精品一区二区三区四区高清 | 欧美成人精品h版在线观看| 亚洲天堂av在线免费| 欧美成人影音| 樱桃视频在线观看一区| 欧美一区二区三区四区在线观看地址| 欧美国产精品v|