解決兼容xp的webrtc早期版本的Thread::Clear() 奔潰問題!

因項目需要編譯了一個兼容window xp的webrtc版本,將全部的項目編譯成功後,將之前的p2p文件傳輸模塊移植到本項目中,運行後沒出問題,但是在和對端進行文件傳輸時,不穩定地出現程序奔潰,後來查找到後,發現了是Thread::Clear的問題,在多線程情況下Send Packet,這個版本的webrtc會出現線程之間不能夠正確地保持互斥的關係,導致在計算遍歷sendlist_的時候其中的線程訪問的iterator指向的是一個被毀壞的內存,於是就崩潰了!

google到一個解決這個問題的patch包,根據pitch修改當前版本的webrtc版本源碼,這個問題可以得到有效的解決!patch包如下https://bugs.chromium.org/p/webrtc/issues/attachment?aid=2440

----------------------------------------------------------------------------------------

用VS2013編譯的p2p模塊,做了個文件傳輸的demo,在本機上運行無誤,但是放到windows xp上運行提示“***.exe不是有效的Win32應用程序”,解決辦法請看此處http://www.vcerror.com/?p=1483,我是直接設置項目屬性鏈接器->系統->子系統->控制檯或windows 後面的”最低版本“是5.01,然後就解決了

--------------------------------------------------------------------------------

   之前自己寫的基於webrtc的demo,使用兼容windows xp的webrtc版本源碼運行,發現在運行時日誌時不時會打印“

ingle:Port[audio:1:0::Net[em1:172.16.32.0/24:Unknown]]: Received TURN message with invalid message integrity, msg_type=257”,有點無語,但是也有點興奮!因爲之前使用webrtc-xp版本的代碼跑文件傳輸的demo,傳輸過程中發生了丟包!按道理來講,webrtc應該在底層就處理了丟包的這種情況!再怎麼不濟,不是還可以通過turnserver轉發的方式將丟掉的包重新傳送到對面的client,可實際上,那些包就這麼消失了!偶爾會出現這種情況,文件傳輸完成後,比對發送、接收方md5值發現不想等,文件傳輸失敗!一想到這,莫非本端的client和turnserver的連接就是因爲“invalid message integrity”發生了問題,導致不能中轉?但是查找後得出的結論是“Received TURN message with invalid message integrity, msg_type=257”,並不是導致文件傳輸的原因,Received TURN message with invalid message integrity並不能影響webrtc的任何性能問題,但是這條日誌看着真是礙眼,現提供解決辦法:
Index: webrtc/p2p/base/turnport.cc
diff --git a/webrtc/p2p/base/turnport.cc b/webrtc/p2p/base/turnport.cc
index fbdcfeb67266df8e565f2c87f9926cb9feb87e43..a22b46568d66141d6f8ff28a08e8d6150e21aa66 100644
--- a/webrtc/p2p/base/turnport.cc
+++ b/webrtc/p2p/base/turnport.cc
@@ -459,6 +459,14 @@ void TurnPort::OnReadPacket(
   } else if (msg_type == TURN_DATA_INDICATION) {
     HandleDataIndication(data, size, packet_time);
   } else {
+    if (SharedSocket() &&
+        (msg_type == STUN_BINDING_RESPONSE ||
+         msg_type == STUN_BINDING_ERROR_RESPONSE)) {
+      LOG_J(LS_VERBOSE, this) <<
+          "Ignoring STUN binding response message on shared socket.";
+      return;
+    }
+
     // This must be a response for one of our requests.
     // Check success responses, but not errors, for MESSAGE-INTEGRITY.
     if (IsStunSuccessResponseType(msg_type) &&
按照上述文本添加和刪除 turnport.cc中相應的代碼,便可讓這條日誌消失在輸出日誌中!
-------------------------------------------------------------------------------------------
    webrtc使用datachannelinterface傳輸數據的時候,其使用的srtp協議,因此不再需要自己控制數據包的錯誤重傳,因此不需要像傳輸視頻數據那樣,在代碼中顯式地做數據重傳處理。
After establishing peer-to-peer connection, application creates at least one data channel to share video, audio or pure data. By default data channel uses SRTP (Secure Real-time Transport Protocol), which doesn’t require packet retransmission, so stream continues as fast as connection permits; in the other side when we need to share reliable data like an image or a file, data channel can transport information through SCTP (Stream Control Transmission Protocol) which has control over packet retransmission and ordering. Both protocol works over UDP.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章