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

對一個奇怪SOCKET問題的研究

   今天測試網絡服務程序時發(fā)現(xiàn)這樣一個現(xiàn)象:客戶端登錄到服務器,服務器如果驗證發(fā)現(xiàn)用戶名不存在,就返回客戶端錯誤信息,并斷開與客戶端的連接。但是實際測試時卻發(fā)現(xiàn)客戶端并沒有接收到用戶名不存在的錯誤信息,并且明明服務器端關閉了連接,甚至停止了服務,但是客戶端仍然顯示是連接狀態(tài)。

   調試,發(fā)現(xiàn)在斷開連接操作之前(即CLOSE SOCKET之前),加斷點或者寫LOG或者SLEEP幾毫秒后,客戶端都可接收到錯誤信息,并成功斷開。于是分析覺得問題可能出在SOCKET的IO處理上,可能SOCKET IO中的數(shù)據(jù)沒有足夠的時間完全發(fā)送,SOCKET就被關閉了。

   仔細檢查代碼發(fā)現(xiàn)CLOSE SOCKET前做了這樣的操作:

LINGER lingerStruct;
lingerStruct.l_onoff  = 1;    
lingerStruct.l_linger = 0;
setsockopt( IoSocket, SOL_SOCKET, SO_LINGER,    (char *)&lingerStruct, sizeof(lingerStruct) );
CancelIo((HANDLE) IoSocket);
closesocket( IoSocket );
   
   在MSDN中查找setsockeopt關于LINGER的解釋如下:

Setting the SO_DONTLINGER option prevents blocking on member function Close while waiting for unsent data to be sent. Setting this option is equivalent to setting SO_LINGER with l_onoff set to 0.

    若設置了SO_LINGER,并設置了零超時間隔,則closesocket()不被阻塞立即執(zhí)行,不論是否有排隊數(shù)據(jù)未發(fā)送或未被確認。這種關閉方式稱為“強制”或“失效”關閉,因為套接口的虛電路立即被復位,且丟失了未發(fā)送的數(shù)據(jù)。在遠端的recv()調用將以WSAECONNRESET出錯。
   若設置了SO_LINGER并確定了非零的超時間隔,則closesocket()調用阻塞進程,直到所剩數(shù)據(jù)發(fā)送完畢或超時。這種關閉稱為“優(yōu)雅的”關閉。請注意如果套接口置為非阻塞且SO_LINGER設為非零超時,則closesocket()調用將以WSAEWOULDBLOCK錯誤返回。
   若在一個流類套接口上設置了SO_DONTLINGER,則closesocket()調用立即返回。但是,如果可能,排隊的數(shù)據(jù)將在套接口關閉前發(fā)送。請注意,在這種情況下WINDOWS套接口實現(xiàn)將在一段不確定的時間內保留套接口以及其他資源,這對于想用所以套接口的應用程序來說有一定影響。
  簡言之,setsockeopt函數(shù)使用SO_LINGER規(guī)定了斷開SOCKET時處理未發(fā)送完的數(shù)據(jù)的動作。


   查詢UNIX文檔中關于SO_LINGER參數(shù)的解釋更加詳細:

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

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將丟棄保留在套接口發(fā)送緩沖區(qū)中的任何數(shù)據(jù)并發(fā)送一個RST給對方,而不是通常的四分組終止序列,這避免了TIME_WAIT狀態(tài);
  3. l_onoff 為非0,l_linger為非0,當套接口關閉時內核將拖延一段時間(由l_linger決定)。如果套接口緩沖區(qū)中仍殘留數(shù)據(jù),進程將處于睡眠狀態(tài),直 到(a)所有數(shù)據(jù)發(fā)送完且被對方確認,之后進行正常的終止序列(描述字訪問計數(shù)為0)或(b)延遲時間到。此種情況下,應用程序檢查close的返回值是 非常重要的,如果在數(shù)據(jù)發(fā)送完并被確認前時間到,close將返回EWOULDBLOCK錯誤且套接口發(fā)送緩沖區(qū)中的任何數(shù)據(jù)都丟失。close的成功返 回僅告訴我們發(fā)送的數(shù)據(jù)(和FIN)已由對方TCP確認,它并不能告訴我們對方應用進程是否已讀了數(shù)據(jù)。如果套接口設為非阻塞的,它將不等待close完 成。
l_linger的單位依賴于實現(xiàn),4.4BSD假設其單位是時鐘滴答(百分之一秒),但Posix.1g規(guī)定單位為秒。

   在了解了原理之后,將代碼中的lingerStruct.l_linger 設置為非零值,問題立即被解決。

   這里把這個問題寫出來,希望能夠給大家?guī)睃c啟示。

posted on 2007-11-14 11:45 迷宮の未來 閱讀(3150) 評論(6)  編輯 收藏 引用

評論

# re: 關閉SOCKET時需注意的問題[未登錄] 2007-11-14 15:45 heroboy

shutdown(...) first.  回復  更多評論   

# re: 關閉SOCKET時需注意的問題 2007-11-14 16:12 追夢時代

@heroboy
謝謝,剛測試了shutdown也可以解決問題  回復  更多評論   

# re: 關閉SOCKET時需注意的問題 2007-11-14 16:21 追夢時代

這里貼上MSDN對于shutdown的注意事項,shutdown不管SO_LINGER如何設置都不會堵塞。

The shutdown function is used on all types of sockets to disable reception, transmission, or both.

If the how parameter is SD_RECEIVE, subsequent calls to the recv function on the socket will be disallowed. This has no effect on the lower protocol layers. For TCP sockets, if there is still data queued on the socket waiting to be received, or data arrives subsequently, the connection is reset, since the data cannot be delivered to the user. For UDP sockets, incoming datagrams are accepted and queued. In no case will an ICMP error packet be generated.

If the how parameter is SD_SEND, subsequent calls to the send function are disallowed. For TCP sockets, a FIN will be sent after all data is sent and acknowledged by the receiver.

Setting how to SD_BOTH disables both sends and receives as described above.

The shutdown function does not close the socket. Any resources attached to the socket will not be freed until closesocket is invoked.

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.
When FD_CLOSE received, call recv until zero returned, or SOCKET_ERROR.
3. Call closesocket.

Note The shutdown function does not block regardless of the SO_LINGER setting on the socket.

An application should not rely on being able to reuse a socket after it has been shut down. In particular, a Windows Sockets provider is not required to support the use of connect on a socket that has been shut down.
  回復  更多評論   

# re: 關閉SOCKET時需注意的問題 2007-11-14 16:34 追夢時代

http://hi.baidu.com/developer_chen/blog/item/53208b4594f4bf25cefca322.html
這篇文章描述了如何安全的關閉SOCKET  回復  更多評論   

# re: 對一個奇怪SOCKET問題的研究 2007-12-23 17:21 秦歌

shutdown管用  回復  更多評論   

# re: 對一個奇怪SOCKET問題的研究 2008-01-31 22:00 abettor

默認情況下,linger是保持TIME_WAIT狀態(tài)的。
如果設置了linger選項,closesocket的時候就會以粗暴的形式實現(xiàn)。也就是,在斷開連接的三次握手時,一旦接受到了對方的ACK后,發(fā)送一個RST就立即清理資源,而并不等待TCP/IP協(xié)議棧真的將全部數(shù)據(jù)發(fā)出,更不會等上兩個MSL的TIME_WAIT狀態(tài)。這樣的話,也許RST根本就還沒有發(fā)送出去,所以對等端意識不到連接已經中斷。  回復  更多評論   

<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

導航

統(tǒng)計

常用鏈接

留言簿(10)

隨筆檔案

文章檔案

最新隨筆

搜索

積分與排名

最新隨筆

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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精品国产高清一区二区| 久久av一区二区三区| 欧美国产精品劲爆| 欧美精品18+| 亚洲女人天堂成人av在线| 亚洲午夜久久久久久久久电影网| 欧美特黄视频| 久久国产精品一区二区三区四区| 欧美在线1区| 亚洲欧洲精品一区二区| 亚洲免费激情| 国产一区二区三区网站| 欧美大胆成人| 欧美日韩在线一区二区| 久久久国产视频91| 欧美激情第六页| 午夜精品在线| 蜜桃久久av一区| 亚洲在线第一页| 久久精品一区中文字幕| 一区二区三区四区国产精品| 欧美亚洲视频在线观看| 亚洲精品视频免费观看| 午夜久久久久| 一本色道久久加勒比88综合| 亚洲综合色激情五月| 亚洲理论在线观看| 亚洲欧美视频一区| 99日韩精品| 久久久国产精品一区二区三区| 99视频超级精品| 久久精品亚洲一区二区| 亚洲图片欧洲图片av| 久久这里有精品15一区二区三区| 亚洲影院在线| 欧美区一区二| 欧美成人网在线| 国产日韩久久| 夜夜狂射影院欧美极品| 最近看过的日韩成人| 欧美综合国产| 久久久久九九视频| 国产精品一区三区| 99这里只有精品| 亚洲精品一区在线| 久久综合激情| 久久午夜国产精品| 国产亚洲精久久久久久| 亚洲综合成人婷婷小说| 亚洲一区二区三区精品动漫| 欧美韩日亚洲| 亚洲电影观看| 亚洲大片av| 久久精品视频在线播放| 久久精品最新地址| 国产欧美精品日韩| 亚洲欧美日产图| 亚洲人成毛片在线播放| 亚洲男女毛片无遮挡| 欧美欧美在线| 亚洲精品影视在线观看| 日韩系列在线| 欧美性大战xxxxx久久久| 9色porny自拍视频一区二区| 一区二区动漫| 国产精品福利片| 亚洲性视频网址| 欧美在线播放视频| 国内精品久久久久影院优 | 中文精品视频一区二区在线观看| 久久综合久久综合久久综合| 欧美va天堂在线| 亚洲日本久久| 欧美视频精品在线| 亚洲伊人色欲综合网| 久久久91精品国产一区二区三区 | 亚洲日本成人网| 欧美高清在线视频| 日韩亚洲欧美高清| 欧美一区二区三区免费看| 国产午夜精品理论片a级探花| 欧美在线资源| 亚洲电影视频在线| 亚洲免费一级电影| 国内久久视频| 欧美成人一区二免费视频软件| 亚洲国产日韩在线| 亚洲欧美在线一区二区| 国内精品一区二区| 欧美精品久久久久久久免费观看| 一区二区三区|亚洲午夜| 久久成人精品一区二区三区| 在线日韩一区二区| 国产精品国产自产拍高清av王其 | 欧美电影在线| 亚洲小视频在线观看| 国产亚洲欧美日韩日本| 美女诱惑一区| 亚洲一区日韩在线| 欧美激情1区2区| 午夜久久久久久久久久一区二区| 韩国视频理论视频久久| 欧美极品一区二区三区| 先锋影音久久久| 亚洲国产片色| 久久久久久久精| 亚洲欧美日韩视频二区| 亚洲国产精品一区在线观看不卡 | 亚洲精品一区二| 国产亚洲一区在线| 欧美精品久久久久a| 欧美一区二区三区视频在线 | 欧美一区综合| 99精品欧美一区| 亚洲国产精品悠悠久久琪琪| 欧美一区二区三区在线观看| 99re66热这里只有精品3直播| 91久久综合亚洲鲁鲁五月天| 激情亚洲一区二区三区四区| 国产精品久久91| 欧美精品二区三区四区免费看视频| 亚洲欧美春色| 一区二区三区av| 亚洲美女免费视频| 亚洲人成在线影院| 欧美激情成人在线| 久久性天堂网| 久久精品视频va| 欧美在线观看网站| 亚洲综合导航| 亚洲欧美在线视频观看| 亚洲一区二区三区高清| 中文精品一区二区三区| 99国产欧美久久久精品| 亚洲伦伦在线| 日韩小视频在线观看专区| 亚洲精品美女久久久久| 亚洲乱码精品一二三四区日韩在线 | 亚洲一二三四区| 一区二区91| 一区二区三区日韩精品视频| 亚洲美女中出| 这里只有精品电影| 夜夜嗨av色综合久久久综合网| 亚洲精品一区二区三区四区高清 | 久久久亚洲精品一区二区三区| 欧美一区二区三区播放老司机| 亚洲欧美日韩国产| 欧美亚洲免费高清在线观看| 欧美一区91| 麻豆成人在线播放| 欧美激情一区二区三区全黄 | 亚洲精品久久久久中文字幕欢迎你 | 免费成人av| 亚洲电影av| av不卡在线观看| 午夜在线视频观看日韩17c| 久久狠狠亚洲综合| 欧美激情一区二区三区高清视频| 欧美精品久久久久久久| 国产精品久久久久久久久借妻| 国产精品制服诱惑| 国语自产偷拍精品视频偷| 亚洲国产日韩欧美在线动漫| av成人免费| 久久久国产精品亚洲一区| 免费久久精品视频| 中国女人久久久| 久久精品30| 欧美日韩一区二区在线 | 女同一区二区| 国产精品成人免费精品自在线观看| 国产精品久久久久久久久久免费 | 136国产福利精品导航网址| 9人人澡人人爽人人精品| 欧美呦呦网站| 亚洲国产精品第一区二区三区| 在线亚洲欧美| 欧美成人情趣视频| 国产日韩欧美在线播放不卡| 亚洲电影欧美电影有声小说| 亚洲午夜黄色| 欧美不卡视频| 午夜精品美女久久久久av福利| 欧美粗暴jizz性欧美20| 蘑菇福利视频一区播放| 午夜精品网站| 欧美屁股在线| 亚洲成人资源| 久久av二区| 一本色道久久加勒比精品| 久久久福利视频| 国产女人18毛片水18精品| 亚洲免费观看视频| 久久婷婷激情| 香蕉精品999视频一区二区| 欧美日韩美女| 99国内精品久久| 欧美激情按摩| 久久综合九色欧美综合狠狠|