看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) GCC 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) NO 問題(Question): 各位好 請問我的server程式需要頻繁的呼叫send函式把資料送出去 然後又是一個real-time的系統所以用blocking的socket的話 會慢慢累積delay 最後就是崩潰 資料全部過時 搜尋了一下 應該是要改用non-blocking的socket 於是我用 int flags= fcntl(forwardSockfd, F_GETFL, 0); fcntl(forwardSockfd, F_SETFL, flags | O_NONBLOCK); 這種方式將socket改成non-blocking 請問這樣做的話 我還需要檢查send的return值嗎 目前遇到的問題可能會有: 1. client斷線 造成呼叫send的時候剛好broken pipe 2. client跳電 造成buffer full 要等兩小時後才會time out結束連線 如果我用non-blocking的話 以上兩種問題該如何得知呢 因為blocking socket的時候 還可以看回傳值 測試用non-blocking socket後 回傳值常會變成-1 然後errno是EAGAIN 但是不是很懂意思 所以我是否可直接跳過return值? 感謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.34.7.57
danny8376:EAGAIN就是叫你AGAIN啊 01/09 11:36
danny8376:non-blocking就兩種狀況 能馬上給出結果 所以給結果了 01/09 11:37
danny8376:這時跟一般socket沒啥差別 另一種狀況就是還沒結果 01/09 11:37
danny8376:這時就丟出EAGAIN 叫你晚點再來試 看到時會不會有結果 01/09 11:38
neko0624:請問是哪兩種狀況? 那我遇到EAGAIN的時候要什麼時候再回 01/09 12:01
neko0624:來看?下次呼叫send的時候嗎. 所以是不是我遇到EAGAIN就 01/09 12:02
neko0624:不理他就好了 01/09 12:02
wuliou:反正C語言通常return 0以外都是出錯啦 01/09 14:23
wuliou:non-blocking就是用try的 不成功就return err 01/09 14:24
wuliou:不會卡在那邊 01/09 14:24
neko0624:謝謝 server這邊搞定了 卻變成client端收到的資料有問題 01/09 16:23
neko0624:程式跑約0.5秒後 收到的資料欄位會亂掉 跟著程式就掛掉了 01/09 16:24
neko0624:請問會不會是send端的buffer滿了的關係?我該如何除錯呢 01/09 16:24
neko0624:因為資料都是固定長度的 所以欄位會亂掉除了send端的 01/09 16:31
neko0624:buffer overflow外 我想不出其他可能性 :( 01/09 16:32
yvb:前面 w大的 "C語言通常return 0以外都是出錯" 怎解?? 01/09 18:34
yvb:什麼 open(), send(), printf() ... 大於 0 也都是對啊... 01/09 18:37
yvb:回原PO, 若是 server client 不同台, 試著抓封包出來看吧... 01/09 18:38
yvb:或是收送兩端都把資料先 dump 出來, 再做後續處理... 01/09 18:42
yvb:應該可以協助 debug 看看收送過程發生什麼事... 01/09 18:43
neko0624:我把server端每次send的回傳值印出來 因為長度是固定的 01/09 19:19
neko0624:果然每次都是正確的長度 然後約0.5秒後就會長度變少 01/09 19:20
neko0624:然後client端就爆了 所以應該是buffer的問題囉 01/09 19:20
neko0624:我的資料流量約4xxKB/s 我明天試試看把buffer加大 01/09 19:21
neko0624:不好意思 這是我的第一隻server程式 所以問題比較基本 01/09 19:22
AstralBrain:buffer加大只會讓你晚幾秒死 不要這樣做 01/09 20:31
AstralBrain:blocking socket會卡 表示你的頻寬可能撐不住這個流量 01/09 20:39
AstralBrain:用什麼方式送都一樣沒救 01/09 20:40
timTan:會python 的話,可以試 twisted 01/09 23:26
neko0624:是喔 可是server跟client的網卡跟線路應該都稱的住這流量 01/10 00:07
neko0624:一秒4xxKB/s而已 我想會不會是send太頻繁(一秒300多次) 01/10 00:08
AstralBrain:那應該有其他原因讓流量到不了400kB 01/10 13:32
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