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

  免費注冊 查看新帖 |

Chinaunix

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

[C] 如何設置socket發(fā)送完數據后再關閉socket [復制鏈接]

論壇徽章:
1
15-16賽季CBA聯(lián)賽之深圳
日期:2016-02-17 16:12:23
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2014-01-28 14:13 |只看該作者 |倒序瀏覽
本帖最后由 lewy7 于 2014-01-29 14:23 編輯

一socket服務端,write數據到socket的時候(數據長度2KB,且該socket是非阻塞的),然后就直接close(socket_fd)了,

導致客戶端read的時候發(fā)生Connection reset by peer(客戶端單進程,1%的概率發(fā)生,數據越大發(fā)生概率就越大,但數據長度小于1KB的時候就沒有這種情況)

服務端socket未設置setsockopt(SO_LINGER)或者(SO_DONTLINGER)。



后來試了一下服務端對需要write的socket用SO_LINGER,也無效

貼代碼:

for  epoll_wait{
     if  fd ==  listenfd
             accept;   setnonblock(clientfd);  EPOLLIN&& EPOLL_CTL_ADD;
     if  EPOLLIN|EPOLLET
             read;     EPOLLOUT&&EPOLL_CTL_MOD;
     if  EPOLLOUT|EPOLLET
             write;     EPOLL_CTL_DEL ;  close(fd);
}

請問一下這個情況應該怎么修改服務端?

論壇徽章:
0
2 [報告]
發(fā)表于 2014-01-28 14:36 |只看該作者
    struct linger tmp = { 0, 0 };
    ret = setsockopt( sockfd, SOL_SOCKET, SO_LINGER, &tmp, sizeof( tmp ) );

論壇徽章:
1
15-16賽季CBA聯(lián)賽之深圳
日期:2016-02-17 16:12:23
3 [報告]
發(fā)表于 2014-01-28 21:50 |只看該作者
回復 2# wenlq


   這個試過了,但報錯了:illegal seek。

  但相同的代碼,我拿到另一臺機子(ubuntu)上去就沒有發(fā)現(xiàn)有這樣的問題(Connection reset by peer)。先前的那臺機子是(RHEL5),是不是系統(tǒng)參數的問題?


Speed=19084 Requests/min, 648890 bytes/sec.
Requests: 19084 susceed, 0 failed.

論壇徽章:
4
雙子座
日期:2014-08-28 10:08:002015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:58:112015年亞洲杯之阿聯(lián)酋
日期:2015-03-13 03:25:15
4 [報告]
發(fā)表于 2014-01-29 09:03 |只看該作者
so_linger一般是請求方用的, server端一般不主動調用close函數,除非異常。

so_linger是說請求方發(fā)送完了,直接發(fā)一個RST的包,而不是FIN的包關閉連接

至于server那邊,你開門做生意還能主動趕客戶嗎?所以一般不主動關,除非被攻擊,或者異常

論壇徽章:
1
15-16賽季CBA聯(lián)賽之深圳
日期:2016-02-17 16:12:23
5 [報告]
發(fā)表于 2014-01-29 12:08 |只看該作者
回復 4# weishuo1999


   
weishuo1999 發(fā)表于 2014-01-29 09:03
so_linger一般是請求方用的, server端一般不主動調用close函數,除非異常。

so_linger是說請求方發(fā)送完 ...



發(fā)送完畢后不主動關,要是客戶端也不關的話,這個socket不也會一直開著的嗎?

論壇徽章:
59
2015年亞洲杯之約旦
日期:2015-01-27 21:27:392015年亞洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵節(jié)徽章
日期:2015-03-06 15:50:392015年亞洲杯之阿聯(lián)酋
日期:2015-03-19 17:39:302015年亞洲杯之中國
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03雙子座
日期:2014-12-10 21:39:16處女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
6 [報告]
發(fā)表于 2014-01-29 13:25 |只看該作者
回復 5# lewy7
當然一直開著~~
但是別人也只能一直開著啊~~
你要擔心這個問題,
可以設一個很大的數值,
但Socket數大于這個數值時,
按最久未使用順序,
給它們發(fā)測試包,
如果錯誤則關之~

   

論壇徽章:
1
15-16賽季CBA聯(lián)賽之深圳
日期:2016-02-17 16:12:23
7 [報告]
發(fā)表于 2014-01-29 15:04 |只看該作者
回復 6# folklore


    看來是我設計有問題,當初就不應該想著靠write一次能發(fā)這么多數據出去,什么MTU啊,buf啊都有可能限制一次發(fā)送的數據長度,而又因為這個socket是非阻塞的,所以就報了這樣的錯,犯了這樣的罪。

  謝謝以上各位的幫助{:3_203:}

論壇徽章:
1
白羊座
日期:2013-09-18 22:02:26
8 [報告]
發(fā)表于 2014-02-04 23:53 |只看該作者
看看poll或select對tcp的ack是否管用。

論壇徽章:
3
2015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:032015年亞洲杯之中國
日期:2015-04-22 15:52:45
9 [報告]
發(fā)表于 2014-02-05 17:52 |只看該作者
這是經典TCP短連接的問題啊.
你每次send后, 判斷一下返回值是否OK.
不覺得send后close會有什么問題.
您需要登錄后才可以回帖 登錄 | 注冊

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP