1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

For #307, support sendmmsg to improve RTC performance

This commit is contained in:
winlin 2020-04-04 22:43:44 +08:00
parent 3793404ceb
commit 55a4052d90
8 changed files with 107 additions and 9 deletions

View file

@ -564,6 +564,7 @@ void SrsRtcSenderThread::send_and_free_messages(SrsSharedPtrMessage** msgs, int
{
srs_error_t err = srs_success;
vector<mmsghdr> mhdrs;
for (int i = 0; i < nb_msgs; i++) {
SrsSharedPtrMessage* msg = msgs[i];
@ -585,22 +586,42 @@ void SrsRtcSenderThread::send_and_free_messages(SrsSharedPtrMessage** msgs, int
}
int length = pkt->size;
char buf[kRtpPacketSize];
char* buf = new char[kRtpPacketSize];
if ((err = rtc_session->dtls_session->protect_rtp(buf, pkt->payload, length)) != srs_success) {
srs_warn("srtp err %s", srs_error_desc(err).c_str());
srs_freep(err);
srs_warn("srtp err %s", srs_error_desc(err).c_str()); srs_freep(err); srs_freepa(buf);
continue;
}
// TODO: use sendmmsg to send multi packet one system call
if ((err = udp_mux_skt->sendto(buf, length, 0)) != srs_success) {
srs_warn("send err %s", srs_error_desc(err).c_str());
srs_freep(err);
}
mmsghdr mhdr;
memset(&mhdr, 0, sizeof(mmsghdr));
mhdr.msg_hdr.msg_name = (sockaddr_in*)udp_mux_skt->peer_addr();
mhdr.msg_hdr.msg_namelen = udp_mux_skt->peer_addrlen();
mhdr.msg_hdr.msg_iovlen = 1;
mhdr.msg_hdr.msg_iov = new iovec();
mhdr.msg_hdr.msg_iov->iov_base = buf;
mhdr.msg_hdr.msg_iov->iov_len = length;
mhdrs.push_back(mhdr);
}
srs_freep(msg);
}
if (!mhdrs.empty()) {
mmsghdr* msgvec = &mhdrs[0];
unsigned int vlen = (unsigned int)mhdrs.size();
int r0 = srs_sendmmsg(udp_mux_skt->stfd(), msgvec, vlen, 0, SRS_UTIME_NO_TIMEOUT);
if (r0 != (int)vlen) {
srs_warn("sendmsg %d msgs, %d done", vlen, r0);
}
}
for (int i = 0; i < (int)mhdrs.size(); i++) {
msghdr* hdr = &mhdrs[i].msg_hdr;
for (int i = 0; i < (int)hdr->msg_iovlen; i++) {
iovec* iov = hdr->msg_iov + i;
delete (char*)iov->iov_base;
}
}
}
SrsRtcSession::SrsRtcSession(SrsRtcServer* rtc_svr, const SrsRequest& req, const std::string& un, int context_id)