Re: [問題] non-blocking socket問題

看板C_and_CPP作者 (Neko)時間10年前 (2014/01/12 22:37), 編輯推噓1(1010)
留言11則, 3人參與, 最新討論串2/2 (看更多)
→ pcjustin:server有用fork或pthread處理連線嗎? 01/10 17:00 → purincess:send傳回的值不到buffer的長度不是應該從沒傳完的部分 01/10 22:43 → purincess:開始重新send嗎 OAO... 01/10 22:43 推 yvb:幾個問題: (1) server產生資料和client消化資料的速率各如何? 01/11 02:47 → yvb: (2) client收到不完整的資料會如何處理? 01/11 02:48 → yvb: (3) server是否有檢查和處理不完整送出的資料? 01/11 02:51 → yvb: (4) 若是tcp連線, 是否使用了 setsockopt()設定TCP_NODELAY? 01/11 02:54 → yvb:其中 (2) 改為 ...收到不完整/格式不正確的資料... 01/11 02:58 不好意思因為要補充的比較多所以用回覆了 回pcjustin: 沒有耶 select完後就開始處理 處理完就下一輪的select 回purincess: 我的程式比較單純 所以現在沒有考慮這些情況 是send完就繼續下去 不會從上次沒傳完的部分繼續 回yvb: 我每筆資料前面有一個自定義的header 所以client端可以做處理 只要server端每次要send的東西都有確實送出去就可以處理 譬如這次要送1000byte那呼叫send完後的回傳值確實是1000 這樣就不會有問題 如果要送1000bytes但是因為buffer問題讓回傳值少於1000 這樣就會後面全部亂掉 我有用TCP_NODELAY 可是我不太清楚這到底是什麼功能 有搜尋過後也是看不太懂意思 我該拿掉嗎 我想到的方法是在send前先檢查socket buffer還剩多大 如果夠容納這次要send的長度 就send 不夠的話就乾脆別send等下次的資料來再檢查buffer大小 一筆沒send的話不會怎樣就是少了一筆資料而已 不過還不知道socket buffer勝於大小要怎麼查 還在找@@ 感謝各位的回覆 寫server程式還真的不是件容易的事阿 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.34.7.57

01/13 11:35, , 1F
其實你可以大E編輯...
01/13 11:35, 1F

01/13 13:12, , 2F
!!
01/13 13:12, 2F

01/22 13:20, , 3F
TCP_NODELAY看 http://ppt.cc/8lQq 第一張圖跟說明應該不難懂.
01/22 13:20, 3F

01/22 13:21, , 4F
我之所以提上述幾個問題, 我認為是因為 client 處理太慢,
01/22 13:21, 4F

01/22 13:23, , 5F
造成 client 端 recv queue 滿了, 使得 server 端無法繼續發送
01/22 13:23, 5F

01/22 13:26, , 6F
過來, 因此後來 send 的長度就變小了, 也因此流量上不去.
01/22 13:26, 6F

01/22 13:28, , 7F
由於 send 不完整, client 若未考慮接收到不正確資料的情況,
01/22 13:28, 7F

01/22 13:30, , 8F
也可能因此掛掉; 若 server 端考慮傳送不完整時會補送後續料,
01/22 13:30, 8F

01/22 13:33, , 9F
補送後續資料, 也可避免 client 接收錯誤的問題.
01/22 13:33, 9F

01/22 13:35, , 10F
至於TCP_NODELAY,對大量小封包的流量可稍做改善,但非主要問題.
01/22 13:35, 10F

01/22 13:36, , 11F
四個問題是我認為的影響程度, 依序排列的.
01/22 13:36, 11F
文章代碼(AID): #1IqgYtPs (C_and_CPP)
文章代碼(AID): #1IqgYtPs (C_and_CPP)