TCP通訊的時候,傳送大量資料會宕機

2021-05-23 08:29:54 字數 1696 閱讀 4428

我在mfc裡面,用socket寫了乙個tcp通訊的程式,非同步套接字程式設計,註冊了fd_read | fd_write | fd_connect | fd_close事件。在客戶端的主線程裡面又建立了兩個執行緒,乙個執行緒不斷的生成資料,另外乙個執行緒把生成的資料傳送出去,只要有資料生成就通過套接字傳送。程式執行一段時間就會宕機。

傳送執行緒呼叫send函式傳送資料,send(pframe->m_socket, pbuf,length, 0);

我感覺資料生成的太多,在網路緩衝裡面的資料還沒有來得及傳送的時候,又通過send函式往網路緩衝區中寫資料了,最後記憶體耗盡,導致宕機。

請問用什麼方法可以解決這個問題呢?

在資料傳送的時候如果知道網路傳送緩衝區還有多大的空閒容量就可以確定是否要呼叫send函式了吧?如果網路傳送緩衝區滿了,就掛起傳送資料的執行緒,如果網路傳送緩衝區的空閒容量大於某個值了,就恢**送資料的執行緒,這樣可以嗎?

怎麼才能知道網路傳送緩衝區是否已經滿了?

如何知道網路傳送緩衝區的空閒容量呢?

你不會是因為其它分配的記憶體資源沒有及時釋放導致的吧。。。

1、怎麼才能知道網路傳送緩衝區是否已經滿了?

2、如何知道網路傳送緩衝區的空閒容量呢?

如果我知道了前面的兩個東西,再改一下程式就知道是不是你說的這個問題了

1。緩衝區慢了會send失敗,再次空閒會呼叫fd_write事件,可以根據這個進行推斷是哪齣了問題。

2。無法得知,這個是tcp演算法決定的,你知道底層緩衝區多大?怎麼個傳送方法?它會拆成多少個小資料報?怎麼個傳送方法?恐怕看tcp/ip協議才知道。

錯誤排查需要你去單步除錯 監控資料異常推斷的。

沒有一眼就能看出來的隱含錯誤;

我在程式裡面可以這樣嗎?定義乙個變數,bool m_bsend;當fd_write訊息到達的時候,m_bsend為true;當在傳送執行緒中send失敗的時候,m_bsend為false。在傳送執行緒中判斷m_bsend的值,如果為true,就繼續執行下面的傳送函式;如果為false,就continue,不執行下面的傳送函式。wireshark之類的工具抓包,然後看看鏈路上是不是有大量的零視窗出現

我覺得你懷疑的東西不是問題所在

底層協議如果連這點容錯都做不到那tcp/ip協議是不是太脆弱了

你是不是有什麼別的相關的位置申請了資源卻沒有及時釋放

你是執行一段時間記憶體才被耗盡的,那很應該就是在執行過程中不斷的適用記憶體而沒有釋放吧,所以才好好看看程式吧,你可以在每次傳送之後就及時的清空buffer,接受資料方用完也釋放記憶體,看看有效果沒。

樓主,知道環形緩衝區麼?這樣緩衝區永遠不會滿,當然你**也要處理好了,不然新的資料會把你沒處理的緩衝區資料給覆蓋了。

bios時間未必可靠,因為能影響他時間準確性的因素太多。

比如:使用者自己修改系統時間(比如是為了防止軟體過期或是什麼其他原因)、病毒修改系統時間、主機板故障導致系統時間重置、有些主機板還可能故障到儲存不了bios資訊,每次啟動都重置。

如果對於時間比較敏感的應用程式來說,可能就會影響到軟體資料的正確性和程式穩定性。比如定時自動提示

或定時控制一些硬體或關鍵的資料錄入時記錄的時間等。

外接時鐘的需求不是沒有的,看應用範圍來說的。特別對工控或取其相關的開發上,有時候時間是很重要的

東西,單靠系統bios的時間,有時候未必可靠,但結合外部硬體(或internet時間伺服器)加上時間記錄

管理過程,就能很好的確保時間的正確性,對於某些工程來說,也是至關重要的解決方案。

英超直播

TCP 多執行緒 同時傳送大量資料 解決辦法

向大家分享一下.呵呵 伺服器向多個終端傳輸大量資料。並且同時向他們傳送,採用安全的tcp方式。我採用的辦法是 首先向多個終端 建立socket陣列,建立多個執行緒 建立多個執行緒的目的不是要 每個執行緒向不同的終端傳送,而是每個執行緒傳送不同的資料,比如乙個1g的資料,我執行緒1取出他的100m內容...

大量資料的tcp的recv

最近在調程式的時候,發現傳送端傳送乙個119136個char的記憶體的時候,在接收端不能全部接收,於是,通過除錯發現,必須在接收端多次的recv以後,進行拼接 如下 char lenbuf 4 int ilen 接收資料 int bytes 先接受前面的四位訊息體長度 if bytes recv c...

PHP查詢MySQL大量資料的時候記憶體占用分析

昨天,有同事在php討論群裡提到,他做的乙個專案由於mysql查詢返回的結果太多 達10萬條 從而導致php記憶體不夠用.所以,他問,在執行下面的 遍歷返回的mysql結果之前,資料是否已經在記憶體中了?複製 如下 while row mysql fetch assoc result 當然,這種問題...