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

對(duì)一個(gè)奇怪SOCKET問(wèn)題的研究

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

   調(diào)試,發(fā)現(xiàn)在斷開(kāi)連接操作之前(即CLOSE SOCKET之前),加斷點(diǎn)或者寫LOG或者SLEEP幾毫秒后,客戶端都可接收到錯(cuò)誤信息,并成功斷開(kāi)。于是分析覺(jué)得問(wèn)題可能出在SOCKET的IO處理上,可能SOCKET IO中的數(shù)據(jù)沒(méi)有足夠的時(shí)間完全發(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è)置了零超時(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ò)。
   若設(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ò)誤返回。
   若在一個(gè)流類套接口上設(shè)置了SO_DONTLINGER,則closesocket()調(diào)用立即返回。但是,如果可能,排隊(duì)的數(shù)據(jù)將在套接口關(guān)閉前發(fā)送。請(qǐng)注意,在這種情況下WINDOWS套接口實(shí)現(xiàn)將在一段不確定的時(shí)間內(nèi)保留套接口以及其他資源,這對(duì)于想用所以套接口的應(yīng)用程序來(lái)說(shuō)有一定影響。
  簡(jiǎn)言之,setsockeopt函數(shù)使用SO_LINGER規(guī)定了斷開(kāi)SOCKET時(shí)處理未發(fā)送完的數(shù)據(jù)的動(dòng)作。


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

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

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

有下列三種情況:

  1. l_onoff為0,則該選項(xiàng)關(guān)閉,l_linger的值被忽略,等于缺省情況,close立即返回;
  2. l_onoff為非0,l_linger為0,則套接口關(guān)閉時(shí)TCP夭折連接,TCP將丟棄保留在套接口發(fā)送緩沖區(qū)中的任何數(shù)據(jù)并發(fā)送一個(gè)RST給對(duì)方,而不是通常的四分組終止序列,這避免了TIME_WAIT狀態(tài);
  3. 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)行正常的終止序列(描述字訪問(wè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ī)定單位為秒。

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

   這里把這個(gè)問(wèn)題寫出來(lái),希望能夠給大家?guī)?lái)點(diǎn)啟示。

posted on 2007-11-14 11:45 迷宮の未來(lái) 閱讀(3157) 評(píng)論(6)  編輯 收藏 引用

評(píng)論

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

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

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

@heroboy
謝謝,剛測(cè)試了shutdown也可以解決問(wèn)題  回復(fù)  更多評(píng)論   

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

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

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ù)  更多評(píng)論   

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

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

# re: 對(duì)一個(gè)奇怪SOCKET問(wèn)題的研究 2007-12-23 17:21 秦歌

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

# re: 對(duì)一個(gè)奇怪SOCKET問(wèn)題的研究 2008-01-31 22:00 abettor

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


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


<2008年5月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

留言簿(10)

隨筆檔案

文章檔案

最新隨筆

搜索

積分與排名

最新隨筆

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲一区二区三区激情| 国产精品羞羞答答xxdd| 欧美一级大片在线观看| 欧美福利电影网| 欧美中文字幕视频| 欧美日韩另类丝袜其他| 久久嫩草精品久久久精品一| 国产精品久久久对白| 最新精品在线| 亚洲国产另类 国产精品国产免费| 亚洲网站视频福利| 亚洲桃花岛网站| 欧美国产一区二区| 欧美第一黄网免费网站| 黄色日韩网站| 欧美专区在线观看一区| 久久九九热免费视频| 国产精品影片在线观看| 亚洲一区二区成人| 亚洲欧美在线磁力| 国产精品亚洲综合| 亚洲女人小视频在线观看| 亚洲午夜精品一区二区三区他趣| 欧美精品v国产精品v日韩精品| 女女同性女同一区二区三区91| 激情91久久| 久久在线91| 亚洲电影免费观看高清| 亚洲精品美女在线观看| 欧美激情影院| 日韩视频一区二区三区在线播放| 99re6热在线精品视频播放速度| 女人香蕉久久**毛片精品| 亚洲第一在线综合在线| 999亚洲国产精| 欧美视频一区二区| 亚洲中午字幕| 久久久亚洲精品一区二区三区| 国模一区二区三区| 免费成人小视频| 亚洲激情成人| 亚洲永久免费观看| 国产一区二区精品在线观看| 久久免费国产| 亚洲人成亚洲人成在线观看图片 | 久久久久国色av免费看影院| 国产一二三精品| 玖玖视频精品| 日韩一区二区久久| 欧美一区日本一区韩国一区| 韩日成人av| 欧美成人一品| 亚洲一区二区少妇| 美日韩精品免费| 一区二区欧美在线| 国产午夜精品理论片a级大结局| 久久美女艺术照精彩视频福利播放| 亚洲第一免费播放区| 亚洲欧美视频在线观看视频| 精品999在线观看| 欧美人交a欧美精品| 亚洲欧美资源在线| 亚洲国产日韩欧美综合久久| 欧美亚洲尤物久久| 亚洲精品国产精品国自产在线| 国产精品久久久久免费a∨ | 久久米奇亚洲| 中文久久精品| 欧美激情1区| 欧美亚洲一区二区在线观看| 亚洲国产日韩美| 国产精品一区免费在线观看| 欧美电影免费观看高清完整版| 亚洲欧美一区二区三区极速播放 | 欧美日韩高清在线观看| 欧美在线观看www| 一本大道久久a久久精品综合| 久久综合久久综合久久综合| 亚洲午夜羞羞片| 91久久夜色精品国产九色| 国产日韩精品一区二区三区 | 亚洲精品久久久久中文字幕欢迎你| 国产精品国产三级国产普通话三级 | 久久先锋资源| 亚洲一区二区三区免费观看| 亚洲国产日韩欧美| 免费看亚洲片| 久久久综合精品| 性久久久久久久久| 日韩视频一区二区在线观看| 尤妮丝一区二区裸体视频| 国产精品一卡| 国产精品福利在线观看| 欧美片第一页| 欧美激情一区二区三区| 裸体女人亚洲精品一区| 久久久久久电影| 久久精品国产2020观看福利| 亚洲一线二线三线久久久| 亚洲精品日日夜夜| 亚洲国产精品va在线看黑人动漫| 久久免费国产精品1| 久久久久久久久综合| 欧美在线三区| 久久久免费av| 久久中文久久字幕| 免费成人黄色| 欧美韩日一区二区三区| 你懂的国产精品| 欧美国产精品v| 欧美激情一区三区| 亚洲欧洲一二三| 亚洲精品影视在线观看| 99re视频这里只有精品| 亚洲最快最全在线视频| 亚洲深夜av| 性色一区二区| 久久久久国产精品厨房| 久久亚洲精品一区二区| 免费在线播放第一区高清av| 欧美成人精品1314www| 欧美精品www在线观看| 欧美日韩人人澡狠狠躁视频| 欧美性事在线| 国产欧美综合在线| 在线播放中文一区| 亚洲毛片av在线| 亚洲一区视频在线| 久久久久久久精| 欧美成在线观看| 亚洲精品综合精品自拍| 亚洲午夜羞羞片| 久久精品系列| 欧美日韩mv| 国产欧美在线视频| 亚洲二区视频| 亚洲午夜在线| 久久综合五月| 99在线精品免费视频九九视| 亚洲欧美日韩综合一区| 狂野欧美激情性xxxx欧美| 欧美日韩精品免费观看视频完整 | 亚洲国产精品一区二区三区| 99re6热在线精品视频播放速度| 午夜国产精品视频| 欧美1区2区视频| 亚洲天堂第二页| 老色鬼久久亚洲一区二区| 国产精品第一页第二页第三页| 国产一区二区中文| 一本大道av伊人久久综合| 久久er精品视频| 亚洲精品小视频| 久久国产精品网站| 国产精品九九久久久久久久| 亚洲国产成人在线播放| 欧美一区二区黄| 亚洲理论电影网| 久久日韩粉嫩一区二区三区| 国产精品高潮呻吟久久| 亚洲欧洲日本一区二区三区| 久久99伊人| 亚洲最新视频在线| 免费成人性网站| 狠狠色噜噜狠狠色综合久| 亚洲综合清纯丝袜自拍| 亚洲区在线播放| 玖玖在线精品| 国产曰批免费观看久久久| 亚洲欧美精品在线| 亚洲欧洲日韩在线| 久热精品视频在线| 国产一区视频在线观看免费| 亚洲一区二区影院| 亚洲人成免费| 免费在线欧美黄色| 一区二区视频免费完整版观看| 欧美一区二区三区啪啪| 一区二区三区高清| 欧美精品综合| 日韩亚洲欧美高清| 欧美激情性爽国产精品17p| 久久精品二区| 国产资源精品在线观看| 欧美一区二区大片| 亚洲嫩草精品久久| 国产精品免费aⅴ片在线观看| 亚洲色在线视频| 日韩亚洲在线| 欧美日韩午夜剧场| 亚洲一区二区3| 一本色道久久88亚洲综合88| 欧美日韩亚洲综合| 亚洲午夜一区二区| 一区二区三区四区国产| 国产精品久线观看视频| 午夜欧美理论片| 欧美自拍丝袜亚洲| 一区在线影院| 欧美黄色免费网站|