2013-04-04 77 views
0

我有來自多個simultaneos插座libev套接字通信失敗

我使用的recv()從插座接收消息獲取消息的基於libev套接字服務器。和send()向插座 溝通的問題是,有時候即使我做了send()和發送的輸出()> 0 仍然對對方的套接字接收任何

的剝離下來代碼的版本在這裏 http://pastebin.com/SM7uPkVD

(大部分是從網上剪切粘貼)

的問題是socket通信工作精絕時代的99%,這只是一些地方這失敗。 是否有一些明顯的東西我缺少

回答

0

當使用SOCK_STREAM套接字時,不能保證多次發送導致多次接收。特別是,您的服務器可能會在第124行中一次讀取多個合併請求,然後在第135行中只回復一次,導致您認爲數據丟失。您應該檢查readlen > 3是否驗證。

+0

是否有沒有緩衝區的實現。使用其他流。因此,每次寫入和讀取都將分開處理 – Ram 2013-04-04 11:57:08

+0

這種情況發生的原因很多:降低IPC開銷。與其試圖避免它,你應該通過分割來自大量接收數據的多個請求來利用它。這可以通過搜索一個請求結束標記(將\ n \ r'做些什麼?),在每個請求前加上它的大小,或者簡單地說,通過具有固定大小的請求來完成。 – jop 2013-04-04 12:39:43

+0

如果我的數據大小保證很小(小於1kb),並且我也可以控制它,那麼執行read()或recv()的最佳方法是什麼。我應該每次讀1個字符查找「\ r」來結束覆蓋或將發送程序更改爲固定寬度的前綴 – Ram 2013-04-04 13:25:49