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

對一個奇怪SOCKET問題的研究

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

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

   仔細(xì)檢查代碼發(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關(guān)于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.

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


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

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

SO_LINGER選項用來改變此缺省設(shè)置。使用如下結(jié)構(gòu):
struct linger {
     int l_onoff; /* 0 = off, nozero = on */
     int l_linger; /* linger time */
};

有下列三種情況:

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

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

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

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

評論

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

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

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

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

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

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

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.
  回復(fù)  更多評論   

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

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

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

shutdown管用  回復(fù)  更多評論   

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

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


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


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

導(dǎo)航

統(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>
            欧美高清免费| 亚洲综合精品自拍| 欧美激情视频在线免费观看 欧美视频免费一 | 亚洲图中文字幕| 亚洲一区免费观看| 亚洲欧美日韩网| 久久免费的精品国产v∧| 久久影音先锋| 欧美三区在线观看| 国产在线欧美日韩| 91久久精品网| 亚洲欧美日本另类| 久久综合网络一区二区| 亚洲国产精品尤物yw在线观看 | 一本色道久久88精品综合| 亚洲欧洲综合| 亚洲欧美精品suv| 久久一区二区三区国产精品| 欧美激情一区二区在线 | 国产精品久久久久久久久久尿 | 国产精品欧美在线| 国产一区深夜福利| 一区二区三区.www| 久久在线精品| 亚洲午夜羞羞片| 欧美bbbxxxxx| 国产亚洲福利社区一区| 99国产精品视频免费观看| 久久gogo国模啪啪人体图| 亚洲国产高清自拍| 久久精品1区| 国产精品国产自产拍高清av| 在线看片日韩| 欧美一区二区三区视频在线| 91久久精品国产91久久性色tv | 亚洲人成网在线播放| 午夜精品一区二区三区在线| 亚洲国产日韩精品| 久久久91精品国产| 国产精品自拍在线| 中文亚洲免费| 亚洲精品午夜精品| 欧美高清视频| 亚洲第一黄色网| 久久久久免费观看| 亚洲欧美中文日韩v在线观看| 欧美精品成人一区二区在线观看 | 欧美日韩免费观看一区二区三区| 黄色成人在线免费| 久久精品日韩一区二区三区| 日韩午夜av在线| 欧美噜噜久久久xxx| 亚洲国产精品久久久久秋霞影院| 久久亚洲午夜电影| 久久久国产一区二区三区| 国产日韩1区| 久久国产欧美| 欧美三级第一页| 久久久一区二区| 国产免费成人av| 99热免费精品| 91久久国产综合久久蜜月精品 | 久久不射2019中文字幕| 国产麻豆精品视频| 欧美在线电影| 欧美在线观看视频一区二区| 国产精品综合不卡av| 欧美自拍偷拍午夜视频| 亚洲自拍偷拍网址| 国产视频不卡| 蜜桃久久av一区| 理论片一区二区在线| 亚洲国产一区视频| 亚洲日韩欧美视频一区| 欧美日韩在线视频一区二区| 亚洲综合二区| 欧美专区第一页| 影音先锋中文字幕一区| 亚洲国产精选| 国产精品一区二区在线观看| 久久久久**毛片大全| 久久噜噜噜精品国产亚洲综合| 亚洲黄色精品| 亚洲网站在线| 在线观看视频一区二区| 亚洲日本一区二区三区| 国产精品日韩二区| 欧美成人69av| 国产精品日韩在线| 蜜臀99久久精品久久久久久软件| 欧美精品国产精品日韩精品| 欧美伊人精品成人久久综合97| 久久婷婷成人综合色| 亚洲视频综合| 久久久无码精品亚洲日韩按摩| 99视频日韩| 久久九九电影| 亚洲欧美日韩中文在线制服| 久久久蜜臀国产一区二区| 亚洲午夜久久久久久久久电影院 | 亚洲五月婷婷| 亚洲国产精品一区二区尤物区 | 欧美一级免费视频| 免费永久网站黄欧美| 性欧美videos另类喷潮| 欧美福利影院| 久久综合伊人77777| 欧美日韩午夜在线| 欧美二区乱c少妇| 六十路精品视频| 欧美日韩裸体免费视频| 亚洲综合不卡| 久久久久久久久久久久久久一区| 亚洲精品女人| 久久国产免费| 性欧美xxxx视频在线观看| 欧美v日韩v国产v| 久久久999精品免费| 欧美日韩色综合| 亚洲第一网站| 激情成人中文字幕| 亚洲女ⅴideoshd黑人| 在线视频一区观看| 欧美激情久久久久| 欧美激情一区二区三区全黄| 国产字幕视频一区二区| 亚洲视频第一页| 国产精品99久久久久久久女警| 美日韩精品免费观看视频| 久久久之久亚州精品露出| 国产欧美日韩91| 午夜精品视频网站| 午夜激情久久久| 国产精品久久国产精品99gif| 日韩一区二区精品视频| 亚洲精品欧美一区二区三区| 老司机免费视频久久| 欧美成人免费网| 亚洲欧洲免费视频| 欧美精品乱码久久久久久按摩 | 欧美成人自拍| 亚洲高清网站| 欧美99久久| 亚洲区第一页| 一本一本a久久| 欧美日韩在线观看视频| 一本色道久久综合亚洲精品不卡| 99国产精品久久久久久久成人热| 欧美本精品男人aⅴ天堂| 亚洲黄一区二区| 日韩午夜黄色| 欧美揉bbbbb揉bbbbb| 亚洲永久网站| 美女尤物久久精品| 亚洲国产综合91精品麻豆| 欧美激情自拍| 亚洲一区二区精品| 久久久久久高潮国产精品视| 在线观看视频一区| 欧美精品三级日韩久久| 亚洲一区二区三区乱码aⅴ蜜桃女| 午夜国产欧美理论在线播放| 国产一区二区在线免费观看| 噜噜噜在线观看免费视频日韩| 亚洲人成啪啪网站| 欧美亚洲在线观看| 亚洲国产精品日韩| 国产精品久久久久久一区二区三区| 亚洲欧美综合精品久久成人| 美乳少妇欧美精品| 亚洲专区在线视频| 亚洲国产第一页| 国产精品国产三级国产a| 久久精品论坛| 夜夜狂射影院欧美极品| 欧美黑人在线播放| 亚洲一区二区三区精品动漫| 久久精品国产成人| 亚洲精品之草原avav久久| 欧美视频日韩| 久久精品视频免费| 日韩午夜电影av| 免费短视频成人日韩| 亚洲自拍偷拍福利| 亚洲欧洲日产国产综合网| 国产欧美日韩91| 欧美成人激情视频免费观看| 亚洲综合好骚| 亚洲人午夜精品免费| 久久久一区二区| 亚洲一区亚洲| 亚洲日本va午夜在线影院| 国外成人在线| 欧美性天天影院| 欧美69视频| 久久久av水蜜桃| 亚洲欧美日韩一区二区三区在线观看 | 免费永久网站黄欧美| 欧美一区二区性| 亚洲性视频网站|