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

Chinaunix

標(biāo)題: LINUX下TCP編程,如何設(shè)置TCP連接超過預(yù)計(jì)時(shí)間后自動(dòng)斷開? [打印本頁]

作者: mini_peng    時(shí)間: 2015-05-12 21:49
標(biāo)題: LINUX下TCP編程,如何設(shè)置TCP連接超過預(yù)計(jì)時(shí)間后自動(dòng)斷開?
本帖最后由 mini_peng 于 2015-05-13 22:56 編輯

函數(shù)int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout);的最后一個(gè)參數(shù),是起這個(gè)作用的嗎?
比如:我想讓TCP 某連接180秒內(nèi)無數(shù)據(jù)傳送(閑置)就超時(shí)自動(dòng)斷開。這個(gè)參數(shù)可以實(shí)現(xiàn)嗎?
作者: mini_peng    時(shí)間: 2015-05-12 21:54
struct timeval tv;

        tv.tv_sec = 30;
        tv.tv_usec = 0;
                nready = select(maxfd + 1, &rset, NULL, NULL, &tv);

似乎沒見起作用,空閑40秒后,TCP連接依然存活。
作者: guocslock    時(shí)間: 2015-05-13 13:17
select不是做這個(gè)事的。
TCP有;顧C(jī)制,即使TCP鏈接空閑,;顧C(jī)制也可以保持鏈接一段時(shí)間,這個(gè)時(shí)間可以通過相關(guān)參數(shù)調(diào)整,由于這些參數(shù)都是全局性的,所以調(diào)整的時(shí)候需要考慮整個(gè)系統(tǒng),而不僅僅是某一些應(yīng)用。
針對(duì)你的問題,可以起個(gè)定時(shí)器,收到一個(gè)數(shù)據(jù)包就對(duì)定時(shí)器清零;當(dāng)定時(shí)器到達(dá)30秒,斷開TCP鏈接。
作者: Logic0    時(shí)間: 2015-05-13 17:34
select 只是查看在制定時(shí)間內(nèi)是否有 fd 可讀或可寫
返回 0 超時(shí)的時(shí)候,你直接 close 這個(gè)socket 不就好了么?
作者: mini_peng    時(shí)間: 2015-05-13 22:54
回復(fù) 4# Logic0

我等了很久,它都沒有超時(shí)而斷開。


   
作者: Logic0    時(shí)間: 2015-05-14 15:52
mini_peng 發(fā)表于 2015-05-13 22:54
回復(fù) 4# Logic0

我等了很久,它都沒有超時(shí)而斷開。


和你等多久沒關(guān)系,編碼要把自己的意圖明白地寫出來,不要期待其他人“自動(dòng)”給你做什么
你想讓它斷開,就直接close
作者: mini_peng    時(shí)間: 2015-05-17 17:16
本帖最后由 mini_peng 于 2015-05-17 17:17 編輯

回復(fù) 6# Logic0


    那我只好,另開一個(gè)線程,做一個(gè)死循環(huán),讀當(dāng)前時(shí)間與 最近一次接收到數(shù)據(jù)時(shí)產(chǎn)生的時(shí)間標(biāo)記 進(jìn)行比較,然后close();

但,我不知道,另開一個(gè)線程做死循環(huán),會(huì)不會(huì)對(duì)操作系統(tǒng)的響應(yīng)上有很大影響 ??
作者: Logic0    時(shí)間: 2015-05-18 17:00
mini_peng 發(fā)表于 2015-05-17 17:16
回復(fù) 6# Logic0


不是這個(gè)意思,select 的作用是 在 timeout 指定時(shí)間內(nèi),觀察 是否有指定的可讀或可寫事件發(fā)生,如果有發(fā)生則給出這個(gè) fd,如果沒有則返回0,也就是在timeout 事件內(nèi)沒有關(guān)注的事件發(fā)生;

鏈接是否有數(shù)據(jù)過來,是探測(cè)可讀事件,timeout 事件內(nèi)無可讀事件,也就是 select 返回 0,你就直接調(diào)用 close ,關(guān)閉鏈接;

可寫麻煩一些,可以給每個(gè)socket 綁定一個(gè) 計(jì)時(shí)器,過期關(guān)閉即可,無需定期掃描。不過定期掃描對(duì)大量 socket 來說,也不失為一種方案。

PS:在linux 下,可以使用 man + 命令 或者 man + 函數(shù) 的方式來查看這個(gè)命令或者系統(tǒng)調(diào)用的文檔
作者: getecho    時(shí)間: 2015-06-16 18:05
  1. res = select(read, wirte, error, time)
  2. if(res == 0 )
  3.   //如果在time時(shí)間內(nèi),沒有動(dòng)作,則關(guān)閉
  4.   close...
  5. else //有動(dòng)作,檢查,然后做事
  6.   do something
復(fù)制代碼

作者: gotojyh    時(shí)間: 2015-06-19 11:23
  1. struct timeval tv;
  2. tv.tv_sec = 180;
  3. tv.tv_usec = 0;
  4. nready = select(maxfd + 1, &rset, NULL, NULL, &tv);
  5. if(nready<0)
  6. close(fd);//關(guān)掉你要關(guān)的socket fd
  7. else
  8. ...
復(fù)制代碼

作者: Fart_King    時(shí)間: 2015-06-24 12:03
開一個(gè)線程做定時(shí)器可以很簡(jiǎn)單的滿足你的要求。




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