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

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 16636 | 回復: 13
打印 上一主題 下一主題

[函數(shù)] close Socket 時發(fā)送tcp RST 信令而非FIN,怎么清空SOCKET讀緩沖區(qū)? [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2013-08-22 11:41 |只看該作者 |倒序瀏覽
本人在做web服務器的文件上傳功能。我先解析IE發(fā)過來的頭,發(fā)現(xiàn)上傳的文件內(nèi)容太大,于是我就不接受此次上傳。我就close此socket,但由于此socket,讀緩沖區(qū)還有數(shù)據(jù),導致close操作 發(fā)送給IE一個rst信令而非fin。IE網(wǎng)頁采用POST上傳的、這樣就會出現(xiàn)空白頁面。

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

                     3  大家有沒有好的處理辦法?


論壇徽章:
0
2 [報告]
發(fā)表于 2013-08-22 12:06 |只看該作者
sf and up

論壇徽章:
15
射手座
日期:2014-11-29 19:22:4915-16賽季CBA聯(lián)賽之青島
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16賽季CBA聯(lián)賽之四川
日期:2017-02-07 21:08:572015年亞冠紀念徽章
日期:2015-11-06 12:31:58每日論壇發(fā)貼之星
日期:2015-08-04 06:20:00程序設計版塊每日發(fā)帖之星
日期:2015-08-04 06:20:00程序設計版塊每日發(fā)帖之星
日期:2015-07-12 22:20:002015亞冠之浦和紅鉆
日期:2015-07-08 10:10:132015亞冠之大阪鋼巴
日期:2015-06-29 11:21:122015亞冠之廣州恒大
日期:2015-05-22 21:55:412015年亞洲杯之伊朗
日期:2015-04-10 16:28:25
3 [報告]
發(fā)表于 2013-08-22 12:16 |只看該作者
XZisonsun 發(fā)表于 2013-08-22 11:41
本人在做web服務器的文件上傳功能。我先解析IE發(fā)過來的頭,發(fā)現(xiàn)上傳的文件內(nèi)容太大,于是我就不接受此次上傳 ...

linger......................

論壇徽章:
1
2015年辭舊歲徽章
日期:2015-03-03 16:54:15
4 [報告]
發(fā)表于 2013-08-22 12:46 |只看該作者
回復 3# yulihua49


    mark,樓上說的詳細點呢,把linger設置成多少?

論壇徽章:
0
5 [報告]
發(fā)表于 2013-08-22 13:36 |只看該作者
回復 3# yulihua49


    那個是針對發(fā)送吧?

我這個是接收。。。

論壇徽章:
17
處女座
日期:2013-08-27 09:59:352015亞冠之柏太陽神
日期:2015-07-30 10:16:402015亞冠之薩濟拖拉機
日期:2015-07-29 18:58:182015年亞洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥豬
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56雙子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
6 [報告]
發(fā)表于 2013-08-22 14:33 |只看該作者
回復 1# XZisonsun


    先shutdown(SHUT_RDWR或者SHUT_RD)然后再close,試試。shutdown之后對端不能再發(fā)送數(shù)據(jù),但不影響既到達的數(shù)據(jù)緩沖。然后close,關閉連接。這樣應該不會再rst。

論壇徽章:
0
7 [報告]
發(fā)表于 2013-08-22 17:02 |只看該作者
本帖最后由 yxw-yxw 于 2013-08-22 17:03 編輯

ie 出現(xiàn)空白頁面是因為你沒有往 IE 發(fā)送數(shù)據(jù)就close了。

要達到你的要求,可以在檢查到文件太大的時候(分析 http 頭后),不用read(或是recv),直接往連接socket write(或是send)數(shù)據(jù)(錯誤消息之類的),然后close socket。close掉連接socket后,內(nèi)核不再保留與之關聯(lián)的緩沖區(qū)

論壇徽章:
0
8 [報告]
發(fā)表于 2013-08-23 21:59 |只看該作者
XZisonsun 發(fā)表于 2013-08-22 11:41
本人在做web服務器的文件上傳功能。我先解析IE發(fā)過來的頭,發(fā)現(xiàn)上傳的文件內(nèi)容太大,于是我就不接受此次上傳 ...


close()正常需要執(zhí)行四次握手,它不會發(fā)RST,而是FIN,只有之前發(fā)的數(shù)據(jù)已經(jīng)被收到,peer才會收到FIN。

論壇徽章:
7
天蝎座
日期:2013-09-28 10:45:42雙子座
日期:2013-10-16 16:27:09射手座
日期:2013-10-23 10:21:32處女座
日期:2014-09-17 16:44:332015年亞洲杯之巴林
日期:2015-04-09 17:28:01冥斗士
日期:2015-11-26 16:19:0015-16賽季CBA聯(lián)賽之山東
日期:2018-03-02 23:59:31
9 [報告]
發(fā)表于 2013-08-24 02:13 |只看該作者
Aquester 發(fā)表于 2013-08-23 21:59
close()正常需要執(zhí)行四次握手,它不會發(fā)RST,而是FIN,只有之前發(fā)的數(shù)據(jù)已經(jīng)被收到,peer才會收到FIN。


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


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

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

論壇徽章:
17
處女座
日期:2013-08-27 09:59:352015亞冠之柏太陽神
日期:2015-07-30 10:16:402015亞冠之薩濟拖拉機
日期:2015-07-29 18:58:182015年亞洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥豬
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56雙子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
10 [報告]
發(fā)表于 2013-08-24 15:36 |只看該作者
回復 8# Aquester


    close的行為典型的情況下受linger選項的影響,針對linger的設置來講,當其l_onoff非0,且l_linger為0,那么當套接口關閉時TCP將丟棄保留的套接口發(fā)送緩沖區(qū)的任何數(shù)據(jù)并發(fā)送一個 RST給對方。另一方面TCP的規(guī)范RFC 2525第2.17節(jié)規(guī)定了“如果緩存區(qū)有未讀數(shù)據(jù)那么關閉socket將會發(fā)送RST給對放方“,linux實現(xià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文檔中有比較隱晦的說明:
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
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP