正在寫一個網路程式,使用tcp協議,可是在連接管理方面有點卡殼了,求助啊
是這樣的,連接建立后,自己寫的一個網路庫維持并管理該連接,接收到資料后拋給應用層處理。同時應用層在另一個執行緒中使用該連接發送資料。網路層檢測到該連接斷開后,通知應用層,然后銷毀該連接。應用層收到網路層的連接斷開訊息后,自己做些清理并將該連接標記為不可用,以避免連接銷毀后繼續發送資料。
那么問題來了,由于收發不在一個執行緒中,很可能發送執行緒呼叫流程已經進入網路庫的發送函式,但此時接收執行緒銷毀了連接,于是Crash。想過使用智能指標std::shared_ptr,以上問題解決了,但是網路庫中創建的連接很可能在應用層銷毀,于是出現了跨dll釋放堆記憶體的問題,可能又崩潰了…………
怎么辦啊
uj5u.com熱心網友回復:
加一個執行緒安全的訊息緩沖佇列,應用層發訊息時,放到訊息佇列中,網路執行緒從佇列中取訊息發送。 注意加鎖。uj5u.com熱心網友回復:
不行啊。如果訊息發送佇列和tcp連接是一一對應的,那么訊息發送佇列就是在連接建立時創建,連接斷開時銷毀,訊息發送佇列和維護和連接的維護是一樣的。
如果所有連接公用同一個訊息發送佇列,效率就是不可想象的低,即使使用讀寫鎖和哈希表維護與連接一一對應的佇列,效率同樣跟不上。
uj5u.com熱心網友回復:
你不是每個連接單獨一個執行緒吧? 用epoll或者iocp。 可以參考下libevent的實作,一個簡單的開源網路庫。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/153688.html
標籤:網絡通信
上一篇:vnc協議udp實作方法
下一篇:關于華為路由器命令的問題
