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

對一個奇怪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>
            国产精品乱码一区二区三区| 亚洲最快最全在线视频| 在线播放不卡| 樱桃国产成人精品视频| 午夜一区二区三视频在线观看 | 欧美精品在线免费观看| 欧美大片在线看| 欧美精品一区二区三区在线播放| 欧美激情视频在线播放| 欧美韩国日本综合| 欧美偷拍一区二区| 国产欧美一区二区视频| 狠狠干综合网| 亚洲人成网站在线播| 亚洲一区精彩视频| 久久久精品久久久久| 欧美激情第3页| 一本久道久久综合中文字幕| 在线视频亚洲| 久久国产欧美日韩精品| 欧美va日韩va| 国产美女精品| 亚洲人成啪啪网站| 欧美专区一区二区三区| 欧美成人精品一区| 亚洲一品av免费观看| 久久阴道视频| 国产精品久久九九| 最新热久久免费视频| 午夜精品福利一区二区蜜股av| 另类图片国产| 亚洲欧美一区二区视频| 欧美国产精品中文字幕| 国产综合婷婷| 午夜精品免费视频| 亚洲日本电影在线| 欧美在线精品一区| 国产精品国产三级国产 | 国产日韩欧美自拍| 亚洲视频axxx| 欧美1区2区| 欧美亚洲免费| 国产精品激情偷乱一区二区∴| 亚洲国产精品久久久久久女王| 午夜影院日韩| 亚洲精品在线视频观看| 久久躁狠狠躁夜夜爽| 国产视频亚洲| 午夜欧美大片免费观看| 亚洲老板91色精品久久| 欧美电影在线播放| 尤物yw午夜国产精品视频明星| 久久本道综合色狠狠五月| 99国产精品视频免费观看| 免费成人av| 亚洲黄色在线视频| 免费观看30秒视频久久| 欧美一区二区三区四区在线观看地址 | 亚洲午夜一级| 欧美电影电视剧在线观看| 午夜伦欧美伦电影理论片| 欧美午夜一区二区三区免费大片| 亚洲精品在线观看免费| 欧美激情在线播放| 久久综合久久综合这里只有精品| 国产亚洲成精品久久| 久久精品视频在线播放| 午夜一区二区三区不卡视频| 国产精品美女视频网站| 欧美亚洲在线| 亚洲欧美国产不卡| 国产一区二区三区在线观看免费| 久久久噜噜噜久久中文字幕色伊伊| 欧美亚洲综合在线| 国内精品久久久久久久影视麻豆| 久久婷婷国产综合尤物精品| 久久久噜噜噜久久| 亚洲激情第一区| 亚洲精品1区| 欧美色区777第一页| 亚洲欧美久久久| 亚洲欧美综合v| 韩国三级电影一区二区| 欧美国产极速在线| 欧美日韩不卡在线| 亚洲欧美国产77777| 欧美在线电影| 日韩视频欧美视频| 亚洲尤物在线| **性色生活片久久毛片| 亚洲免费观看| 国语精品中文字幕| 亚洲精品乱码| 国产麻豆日韩| 亚洲国产成人不卡| 国产精品视频免费观看www| 久久亚洲私人国产精品va媚药| 欧美成人精品不卡视频在线观看| 亚洲在线电影| 免费av成人在线| 欧美一区二区日韩一区二区| 久久综合九色九九| 午夜日本精品| 欧美二区在线播放| 欧美伊久线香蕉线新在线| 蜜臀99久久精品久久久久久软件| 亚洲天堂网在线观看| 久久久91精品国产| 亚洲欧美www| 欧美黑人多人双交| 久久亚洲欧美| 国产精品视屏| 99成人在线| 亚洲国产裸拍裸体视频在线观看乱了 | 欧美午夜不卡| 另类激情亚洲| 国产精品天美传媒入口| 亚洲国产免费看| 国产香蕉久久精品综合网| 亚洲精选国产| 亚洲激情自拍| 久久久久国色av免费看影院| 亚洲欧美乱综合| 欧美精品在线网站| 欧美高清视频一区二区三区在线观看| 亚洲欧美综合v| 亚洲欧洲一区二区在线播放| 国产一区999| 在线一区日本视频| 乱中年女人伦av一区二区| 性久久久久久久久| 欧美日韩三级视频| 亚洲国产一区二区三区青草影视| 激情久久婷婷| 亚洲欧美网站| 欧美在线视频全部完| 欧美午夜一区| 亚洲裸体在线观看| 99re66热这里只有精品3直播| 久久精品国产77777蜜臀| 久久久久九九九九| 国产欧美一区二区三区久久人妖 | 一二三区精品| 欧美激情视频在线免费观看 欧美视频免费一 | 亚洲伦理在线| 欧美xx视频| 亚洲二区精品| 亚洲精品视频在线播放| 欧美国产国产综合| 日韩网站在线看片你懂的| 中文精品视频一区二区在线观看| 欧美日韩一区二区视频在线观看| 亚洲美女av黄| 欧美一区二区三区另类| 国产人成精品一区二区三| 欧美一区二区私人影院日本| 久久男人资源视频| 91久久国产综合久久| 欧美人与性动交α欧美精品济南到| 亚洲欧洲三级电影| 亚洲欧美日韩精品久久亚洲区 | 亚洲毛片一区| 欧美一区精品| 亚洲第一精品久久忘忧草社区| 久久综合福利| 亚洲美女色禁图| 久久午夜激情| 在线一区视频| 国产精品一区二区你懂得| 性色av一区二区三区红粉影视| 久久久久久999| 亚洲精品视频一区二区三区| 欧美午夜视频网站| 久久精品欧美| 亚洲精品国精品久久99热| 亚洲免费影视第一页| 国产有码在线一区二区视频| 欧美高清视频在线播放| 亚洲自拍16p| 欧美国产大片| 午夜亚洲性色福利视频| 亚洲国产精品黑人久久久| 国产精品电影在线观看| 久久这里有精品视频| 亚洲一区精品视频| 亚洲第一中文字幕在线观看| 欧美一进一出视频| 日韩亚洲视频在线| 一区二区亚洲| 国产欧美亚洲精品| 欧美日韩国语| 欧美不卡高清| 久久久久免费视频| 亚洲欧美日韩精品一区二区| 亚洲国产另类久久精品| 久久久久这里只有精品| 亚洲欧美福利一区二区| 亚洲免费电影在线| 在线看成人片| 国产自产在线视频一区|