亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: close Socket 時(shí)發(fā)送tcp RST 信令而非FIN,怎么清空SOCKET讀緩沖區(qū)? [打印本頁(yè)]

作者: XZisonsun    時(shí)間: 2013-08-22 11:41
標(biāo)題: close Socket 時(shí)發(fā)送tcp RST 信令而非FIN,怎么清空SOCKET讀緩沖區(qū)?
本人在做web服務(wù)器的文件上傳功能。我先解析IE發(fā)過(guò)來(lái)的頭,發(fā)現(xiàn)上傳的文件內(nèi)容太大,于是我就不接受此次上傳。我就close此socket,但由于此socket,讀緩沖區(qū)還有數(shù)據(jù),導(dǎo)致close操作 發(fā)送給IE一個(gè)rst信令而非fin。IE網(wǎng)頁(yè)采用POST上傳的、這樣就會(huì)出現(xiàn)空白頁(yè)面。

要解決這個(gè)問(wèn)題 辦法 1 是 發(fā)現(xiàn)文件太大了 仍然socket 接收,但不寫(xiě)入磁盤(pán)。 但這樣太慢了。
                    2 發(fā)現(xiàn)文件太大。shutdown 關(guān)閉socket 讀緩沖區(qū),清楚讀緩沖區(qū), 再關(guān)閉寫(xiě)緩沖期
                       但 怎么清空讀緩沖區(qū)呢?????????????

                     3  大家有沒(méi)有好的處理辦法?



作者: XZisonsun    時(shí)間: 2013-08-22 12:06
sf and up
作者: yulihua49    時(shí)間: 2013-08-22 12:16
XZisonsun 發(fā)表于 2013-08-22 11:41
本人在做web服務(wù)器的文件上傳功能。我先解析IE發(fā)過(guò)來(lái)的頭,發(fā)現(xiàn)上傳的文件內(nèi)容太大,于是我就不接受此次上傳 ...

linger......................
作者: csumck    時(shí)間: 2013-08-22 12:46
回復(fù) 3# yulihua49


    mark,樓上說(shuō)的詳細(xì)點(diǎn)呢,把linger設(shè)置成多少?
作者: XZisonsun    時(shí)間: 2013-08-22 13:36
回復(fù) 3# yulihua49


    那個(gè)是針對(duì)發(fā)送吧?

我這個(gè)是接收。。。
作者: myworkstation    時(shí)間: 2013-08-22 14:33
回復(fù) 1# XZisonsun


    先shutdown(SHUT_RDWR或者SHUT_RD)然后再close,試試。shutdown之后對(duì)端不能再發(fā)送數(shù)據(jù),但不影響既到達(dá)的數(shù)據(jù)緩沖。然后close,關(guān)閉連接。這樣應(yīng)該不會(huì)再rst。
作者: yxw-yxw    時(shí)間: 2013-08-22 17:02
本帖最后由 yxw-yxw 于 2013-08-22 17:03 編輯

ie 出現(xiàn)空白頁(yè)面是因?yàn)槟銢](méi)有往 IE 發(fā)送數(shù)據(jù)就close了。

要達(dá)到你的要求,可以在檢查到文件太大的時(shí)候(分析 http 頭后),不用read(或是recv),直接往連接socket write(或是send)數(shù)據(jù)(錯(cuò)誤消息之類(lèi)的),然后close socket。close掉連接socket后,內(nèi)核不再保留與之關(guān)聯(lián)的緩沖區(qū)
作者: Aquester    時(shí)間: 2013-08-23 21:59
XZisonsun 發(fā)表于 2013-08-22 11:41
本人在做web服務(wù)器的文件上傳功能。我先解析IE發(fā)過(guò)來(lái)的頭,發(fā)現(xiàn)上傳的文件內(nèi)容太大,于是我就不接受此次上傳 ...


close()正常需要執(zhí)行四次握手,它不會(huì)發(fā)RST,而是FIN,只有之前發(fā)的數(shù)據(jù)已經(jīng)被收到,peer才會(huì)收到FIN。
作者: cxytz01    時(shí)間: 2013-08-24 02:13
Aquester 發(fā)表于 2013-08-23 21:59
close()正常需要執(zhí)行四次握手,它不會(huì)發(fā)RST,而是FIN,只有之前發(fā)的數(shù)據(jù)已經(jīng)被收到,peer才會(huì)收到FIN。


對(duì),close需要四次握手,并且會(huì)發(fā)送fin。 不會(huì)發(fā)送rst。


------------------------------
linger是針對(duì)發(fā)送的,不是針對(duì)接收的。

rst的發(fā)送條件有幾樣
1.客戶端向服務(wù)器不存在的端口發(fā)送請(qǐng)求,會(huì)收到服務(wù)器的icmp不可達(dá)消息,tcp使用rst復(fù)位。
2.正常終止連接的方式是發(fā)送fin,但是可以設(shè)置lingger,來(lái)使用發(fā)送rst異常終止一個(gè)連接。
3.用于半打開(kāi)鏈接。


作者: myworkstation    時(shí)間: 2013-08-24 15:36
回復(fù) 8# Aquester


    close的行為典型的情況下受linger選項(xiàng)的影響,針對(duì)linger的設(shè)置來(lái)講,當(dāng)其l_onoff非0,且l_linger為0,那么當(dāng)套接口關(guān)閉時(shí)TCP將丟棄保留的套接口發(fā)送緩沖區(qū)的任何數(shù)據(jù)并發(fā)送一個(gè) RST給對(duì)方。另一方面TCP的規(guī)范RFC 2525第2.17節(jié)規(guī)定了“如果緩存區(qū)有未讀數(shù)據(jù)那么關(guān)閉socket將會(huì)發(fā)送RST給對(duì)放方“,linux實(shí)現(xiàn)符合些標(biāo)準(zhǔn)了,所以樓主情況是合理的。


RFC中的原話如下:
When an application closes a connection in such a way that it can
      no longer read any received data, the TCP SHOULD, per section
      4.2.2.13 of RFC 1122, send a RST if there is any unread received
      data, or if any new data is received. A TCP that fails to do so
      exhibits "Failure to RST on close with data pending".


linger發(fā)送RST的行為在man文檔中有比較隱晦的說(shuō)明:
If SO_LINGER is disabled and a close is issued, the sys-
     tem will process the close in a manner that allows the process to con-
     tinue as quickly as possible
作者: myworkstation    時(shí)間: 2013-08-24 15:37
回復(fù) 9# cxytz01


    你的解釋不完全對(duì),詳細(xì)解釋看回復(fù)
作者: cxytz01    時(shí)間: 2013-08-25 20:23
回復(fù) 11# myworkstation

哪里有錯(cuò),看不出來(lái),請(qǐng)指正。我是根據(jù)unp, tcp/ip詳解卷一來(lái)的,里面是這么說(shuō)的。


   
作者: myworkstation    時(shí)間: 2013-08-25 20:35
回復(fù) 12# cxytz01


    close需要四次握手,并且會(huì)發(fā)送fin。 不會(huì)發(fā)送rst。
這句話有問(wèn)題,你下面明明已經(jīng)說(shuō)了“正常終止連接的方式是發(fā)送fin,但是可以設(shè)置lingger,來(lái)使用發(fā)送rst異常終止一個(gè)連接!保
而且我在之前的回貼中也說(shuō)了。TCP的規(guī)范RFC 2525第2.17節(jié)規(guī)定了“如果緩存區(qū)有未讀數(shù)據(jù)那么關(guān)閉socket將會(huì)發(fā)送RST給對(duì)放方“,所以這時(shí)候既使不設(shè)置linger,close也同樣會(huì)發(fā)送rst

作者: bo8362    時(shí)間: 2015-12-28 16:25
版主就是版主,水平高呵




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2