mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2026-07-03 17:27:33 +08:00
完善ipv6网络适配
This commit is contained in:
@@ -80,7 +80,7 @@ bool RtpProcess::inputRtp(bool is_udp, const Socket::Ptr &sock, const char *data
|
||||
if (!_sock) {
|
||||
//第一次运行本函数
|
||||
_sock = sock;
|
||||
_addr = *addr;
|
||||
_addr = *((struct sockaddr_storage *)addr);
|
||||
emitOnPublish();
|
||||
}
|
||||
|
||||
@@ -198,11 +198,11 @@ void RtpProcess::setOnDetach(const function<void()> &cb) {
|
||||
}
|
||||
|
||||
string RtpProcess::get_peer_ip() {
|
||||
return SockUtil::inet_ntoa(((struct sockaddr_in &) _addr).sin_addr);
|
||||
return SockUtil::inet_ntoa((struct sockaddr *)&_addr);
|
||||
}
|
||||
|
||||
uint16_t RtpProcess::get_peer_port() {
|
||||
return ntohs(((struct sockaddr_in &) _addr).sin_port);
|
||||
return SockUtil::inet_port((struct sockaddr *)&_addr);
|
||||
}
|
||||
|
||||
string RtpProcess::get_local_ip() {
|
||||
|
||||
@@ -84,7 +84,7 @@ private:
|
||||
private:
|
||||
uint32_t _dts = 0;
|
||||
uint64_t _total_bytes = 0;
|
||||
struct sockaddr _addr{0};
|
||||
struct sockaddr_storage _addr{0};
|
||||
toolkit::Socket::Ptr _sock;
|
||||
MediaInfo _media_info;
|
||||
toolkit::Ticker _last_frame_time;
|
||||
|
||||
@@ -53,7 +53,7 @@ public:
|
||||
}
|
||||
if (!strong_self->_rtcp_addr) {
|
||||
//只设置一次rtcp对端端口
|
||||
strong_self->_rtcp_addr = std::make_shared<struct sockaddr>();
|
||||
strong_self->_rtcp_addr = std::make_shared<struct sockaddr_storage>();
|
||||
memcpy(strong_self->_rtcp_addr.get(), addr, addr_len);
|
||||
}
|
||||
auto rtcps = RtcpHeader::loadFromBytes(buf->data(), buf->size());
|
||||
@@ -71,10 +71,13 @@ private:
|
||||
}
|
||||
_ticker.resetTime();
|
||||
|
||||
auto rtcp_addr = _rtcp_addr.get();
|
||||
auto rtcp_addr = (struct sockaddr *)_rtcp_addr.get();
|
||||
if (!rtcp_addr) {
|
||||
//默认的,rtcp端口为rtp端口+1
|
||||
((sockaddr_in *) addr)->sin_port = htons(ntohs(((sockaddr_in *) addr)->sin_port) + 1);
|
||||
switch(addr->sa_family){
|
||||
case AF_INET: ((sockaddr_in *) addr)->sin_port = htons(ntohs(((sockaddr_in *) addr)->sin_port) + 1); break;
|
||||
case AF_INET6: ((sockaddr_in6 *) addr)->sin6_port = htons(ntohs(((sockaddr_in6 *) addr)->sin6_port) + 1); break;
|
||||
}
|
||||
//未收到rtcp打洞包时,采用默认的rtcp端口
|
||||
rtcp_addr = addr;
|
||||
}
|
||||
@@ -85,7 +88,7 @@ private:
|
||||
Ticker _ticker;
|
||||
Socket::Ptr _rtcp_sock;
|
||||
uint32_t _sample_rate;
|
||||
std::shared_ptr<struct sockaddr> _rtcp_addr;
|
||||
std::shared_ptr<struct sockaddr_storage> _rtcp_addr;
|
||||
};
|
||||
|
||||
void RtpServer::start(uint16_t local_port, const string &stream_id, bool enable_tcp, const char *local_ip, bool re_use_port, uint32_t ssrc) {
|
||||
|
||||
@@ -40,7 +40,7 @@ void RtpSession::attachServer(const Server &server) {
|
||||
RtpSession::RtpSession(const Socket::Ptr &sock) : Session(sock) {
|
||||
DebugP(this);
|
||||
socklen_t addr_len = sizeof(_addr);
|
||||
getpeername(sock->rawFD(), &_addr, &addr_len);
|
||||
getpeername(sock->rawFD(), (struct sockaddr *)&_addr, &addr_len);
|
||||
}
|
||||
|
||||
RtpSession::~RtpSession() {
|
||||
@@ -110,7 +110,7 @@ void RtpSession::onRtpPacket(const char *data, size_t len) {
|
||||
WarnP(this) << "ssrc不匹配,rtp已丢弃:" << rtp_ssrc << " != " << _ssrc;
|
||||
return;
|
||||
}
|
||||
_process->inputRtp(false, getSock(), data, len, &_addr);
|
||||
_process->inputRtp(false, getSock(), data, len, (struct sockaddr *)&_addr);
|
||||
} catch (RtpTrack::BadRtpException &ex) {
|
||||
if (!_is_udp) {
|
||||
WarnL << ex.what() << ",开始搜索ssrc以便恢复上下文";
|
||||
|
||||
@@ -50,7 +50,7 @@ private:
|
||||
uint32_t _ssrc = 0;
|
||||
toolkit::Ticker _ticker;
|
||||
std::string _stream_id;
|
||||
struct sockaddr _addr;
|
||||
struct sockaddr_storage _addr;
|
||||
RtpProcess::Ptr _process;
|
||||
std::shared_ptr<toolkit::ObjectStatistic<toolkit::TcpSession> > _statistic_tcp;
|
||||
std::shared_ptr<toolkit::ObjectStatistic<toolkit::UdpSession> > _statistic_udp;
|
||||
|
||||
Reference in New Issue
Block a user