解决兼容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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值