mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
SRT: Refine the SRT socket code.
This commit is contained in:
parent
6c94e91792
commit
492e3a888c
2 changed files with 72 additions and 62 deletions
|
@ -549,13 +549,18 @@ srs_error_t SrsSrtSocket::connect(const string& ip, int port)
|
||||||
|
|
||||||
// @see https://github.com/Haivision/srt/blob/master/docs/API/API-functions.md#srt_connect
|
// @see https://github.com/Haivision/srt/blob/master/docs/API/API-functions.md#srt_connect
|
||||||
int ret = srt_connect(srt_fd_, (const sockaddr*)&inaddr, sizeof(inaddr));
|
int ret = srt_connect(srt_fd_, (const sockaddr*)&inaddr, sizeof(inaddr));
|
||||||
|
if (ret != 0) {
|
||||||
|
return srs_error_new(ERROR_SRT_IO, "srt_connect, err=%s", srt_getlasterror_str());
|
||||||
|
}
|
||||||
|
|
||||||
if (ret == 0) {
|
// Connect succeed, in async mode, means SRT API succeed and return directly,
|
||||||
// Connect succuess, in async mode, means SRT API succuess and return directly,
|
|
||||||
// and the connection is in progress, like tcp socket API connect errno EINPROGRESS,
|
// and the connection is in progress, like tcp socket API connect errno EINPROGRESS,
|
||||||
// and the SRT IO threads will do the real handshake step to finish srt connect.
|
// and the SRT IO threads will do the real handshake step to finish srt connect.
|
||||||
SRT_SOCKSTATUS srt_status = srt_getsockstate(srt_fd_);
|
SRT_SOCKSTATUS srt_status = srt_getsockstate(srt_fd_);
|
||||||
if (srt_status != SRTS_CONNECTED) {
|
if (srt_status == SRTS_CONNECTED) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
// Connect is in progress, wait until it finish or error.
|
// Connect is in progress, wait until it finish or error.
|
||||||
if ((err = wait_writeable()) != srs_success) {
|
if ((err = wait_writeable()) != srs_success) {
|
||||||
return srs_error_wrap(err, "wait writeable");
|
return srs_error_wrap(err, "wait writeable");
|
||||||
|
@ -566,10 +571,6 @@ srs_error_t SrsSrtSocket::connect(const string& ip, int port)
|
||||||
if (srt_status != SRTS_CONNECTED) {
|
if (srt_status != SRTS_CONNECTED) {
|
||||||
return srs_error_new(ERROR_SRT_IO, "srt_connect, err=%s", srt_getlasterror_str());
|
return srs_error_new(ERROR_SRT_IO, "srt_connect, err=%s", srt_getlasterror_str());
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return srs_error_new(ERROR_SRT_IO, "srt_connect, err=%s", srt_getlasterror_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
@ -583,20 +584,22 @@ srs_error_t SrsSrtSocket::accept(SRTSOCKET* client_srt_fd)
|
||||||
int addrlen = sizeof(inaddr);
|
int addrlen = sizeof(inaddr);
|
||||||
// @see https://github.com/Haivision/srt/blob/master/docs/API/API-functions.md#srt_accept
|
// @see https://github.com/Haivision/srt/blob/master/docs/API/API-functions.md#srt_accept
|
||||||
SRTSOCKET srt_fd = srt_accept(srt_fd_, (sockaddr*)&inaddr, &addrlen);
|
SRTSOCKET srt_fd = srt_accept(srt_fd_, (sockaddr*)&inaddr, &addrlen);
|
||||||
if (srt_fd == SRT_INVALID_SOCK) {
|
|
||||||
if (srt_getlasterror(NULL) == SRT_EASYNCRCV) {
|
// Accept ok, return with the SRT client fd.
|
||||||
|
if (srt_fd != SRT_INVALID_SOCK) {
|
||||||
|
*client_srt_fd = srt_fd;
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Got something error, return immediately.
|
||||||
|
if (srt_getlasterror(NULL) != SRT_EASYNCRCV) {
|
||||||
|
return srs_error_new(ERROR_SRT_IO, "srt_accept, err=%s", srt_getlasterror_str());
|
||||||
|
}
|
||||||
|
|
||||||
// Accept would block, wait until new client connect or error.
|
// Accept would block, wait until new client connect or error.
|
||||||
if ((err = wait_readable()) != srs_success) {
|
if ((err = wait_readable()) != srs_success) {
|
||||||
return srs_error_wrap(err, "wait readable");
|
return srs_error_wrap(err, "wait readable");
|
||||||
}
|
}
|
||||||
continue;
|
|
||||||
} else {
|
|
||||||
return srs_error_new(ERROR_SRT_IO, "srt_accept, err=%s", srt_getlasterror_str());
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
*client_srt_fd = srt_fd;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
|
@ -609,19 +612,22 @@ srs_error_t SrsSrtSocket::recvmsg(void* buf, size_t size, ssize_t* nread)
|
||||||
while (true) {
|
while (true) {
|
||||||
// @see https://github.com/Haivision/srt/blob/master/docs/API/API-functions.md#srt_recvmsg
|
// @see https://github.com/Haivision/srt/blob/master/docs/API/API-functions.md#srt_recvmsg
|
||||||
int ret = srt_recvmsg(srt_fd_, (char*)buf, size);
|
int ret = srt_recvmsg(srt_fd_, (char*)buf, size);
|
||||||
if (ret < 0) {
|
|
||||||
if (srt_getlasterror(NULL) == SRT_EASYNCRCV) {
|
// Receive message ok.
|
||||||
if ((err = wait_readable()) != srs_success) {
|
if (ret >= 0) {
|
||||||
return srs_error_wrap(err, "wait readable");
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
} else {
|
|
||||||
return srs_error_new(ERROR_SRT_IO, "srt_recvmsg, err=%s", srt_getlasterror_str());
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
recv_bytes_ += ret;
|
recv_bytes_ += ret;
|
||||||
*nread = ret;
|
*nread = ret;
|
||||||
break;
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Got something error, return immediately.
|
||||||
|
if (srt_getlasterror(NULL) != SRT_EASYNCRCV) {
|
||||||
|
return srs_error_new(ERROR_SRT_IO, "srt_recvmsg, err=%s", srt_getlasterror_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for the fd ready or error, switch to other coroutines.
|
||||||
|
if ((err = wait_readable()) != srs_success) {
|
||||||
|
return srs_error_wrap(err, "wait readable");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -635,19 +641,22 @@ srs_error_t SrsSrtSocket::sendmsg(void* buf, size_t size, ssize_t* nwrite)
|
||||||
while (true) {
|
while (true) {
|
||||||
// @see https://github.com/Haivision/srt/blob/master/docs/API/API-functions.md#srt_sendmsg
|
// @see https://github.com/Haivision/srt/blob/master/docs/API/API-functions.md#srt_sendmsg
|
||||||
int ret = srt_sendmsg(srt_fd_, (const char*)buf, size, -1, 1);
|
int ret = srt_sendmsg(srt_fd_, (const char*)buf, size, -1, 1);
|
||||||
if (ret < 0) {
|
|
||||||
if (srt_getlasterror(NULL) == SRT_EASYNCSND) {
|
// Send message ok.
|
||||||
if ((err = wait_writeable()) != srs_success) {
|
if (ret >= 0) {
|
||||||
return srs_error_wrap(err, "wait writeable");
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
} else {
|
|
||||||
return srs_error_new(ERROR_SRT_IO, "srt_sendmsg, err=%s", srt_getlasterror_str());
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
send_bytes_ += ret;
|
send_bytes_ += ret;
|
||||||
*nwrite = ret;
|
*nwrite = ret;
|
||||||
break;
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Got something error, return immediately.
|
||||||
|
if (srt_getlasterror(NULL) != SRT_EASYNCSND) {
|
||||||
|
return srs_error_new(ERROR_SRT_IO, "srt_sendmsg, err=%s", srt_getlasterror_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for the fd ready or error, switch to other coroutines.
|
||||||
|
if ((err = wait_writeable()) != srs_success) {
|
||||||
|
return srs_error_wrap(err, "wait writeable");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -671,8 +680,7 @@ srs_error_t SrsSrtSocket::wait_readable()
|
||||||
// Wait event fired or timeout.
|
// Wait event fired or timeout.
|
||||||
int ret = srs_cond_timedwait(read_cond_, recv_timeout_);
|
int ret = srs_cond_timedwait(read_cond_, recv_timeout_);
|
||||||
// TODO: FIXME: need to disable it?
|
// TODO: FIXME: need to disable it?
|
||||||
err = disable_read();
|
if ((err = disable_read()) != srs_success) {
|
||||||
if (err != srs_success) {
|
|
||||||
srs_freep(err);
|
srs_freep(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -709,8 +717,7 @@ srs_error_t SrsSrtSocket::wait_writeable()
|
||||||
}
|
}
|
||||||
|
|
||||||
int ret = srs_cond_timedwait(write_cond_, send_timeout_);
|
int ret = srs_cond_timedwait(write_cond_, send_timeout_);
|
||||||
err = disable_write();
|
if ((err = disable_write()) != srs_success) {
|
||||||
if (err != srs_success) {
|
|
||||||
srs_freep(err);
|
srs_freep(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -769,8 +776,10 @@ srs_error_t SrsSrtSocket::disable_write()
|
||||||
return disable_event(SRT_EPOLL_OUT);
|
return disable_event(SRT_EPOLL_OUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
srs_error_t SrsSrtSocket::enable_event(int event) {
|
srs_error_t SrsSrtSocket::enable_event(int event)
|
||||||
|
{
|
||||||
srs_error_t err = srs_success;
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
// Event has been subscribed.
|
// Event has been subscribed.
|
||||||
if ((events_ & event) == event) {
|
if ((events_ & event) == event) {
|
||||||
return err;
|
return err;
|
||||||
|
@ -784,11 +793,14 @@ srs_error_t SrsSrtSocket::enable_event(int event) {
|
||||||
} else {
|
} else {
|
||||||
err = srt_poller_->mod_socket(this);
|
err = srt_poller_->mod_socket(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
srs_error_t SrsSrtSocket::disable_event(int event) {
|
srs_error_t SrsSrtSocket::disable_event(int event)
|
||||||
|
{
|
||||||
srs_error_t err = srs_success;
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
// Event has been unsubscribed.
|
// Event has been unsubscribed.
|
||||||
if ((events_ & event) == 0) {
|
if ((events_ & event) == 0) {
|
||||||
return err;
|
return err;
|
||||||
|
@ -801,10 +813,12 @@ srs_error_t SrsSrtSocket::disable_event(int event) {
|
||||||
} else {
|
} else {
|
||||||
err = srt_poller_->mod_socket(this);
|
err = srt_poller_->mod_socket(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
srs_error_t SrsSrtSocket::check_error() {
|
srs_error_t SrsSrtSocket::check_error()
|
||||||
|
{
|
||||||
srs_error_t err = srs_success;
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
if (has_error_) {
|
if (has_error_) {
|
||||||
|
|
|
@ -36,10 +36,6 @@ SrsConfig* _srs_config = NULL;
|
||||||
SrsServer* _srs_server = NULL;
|
SrsServer* _srs_server = NULL;
|
||||||
bool _srs_in_docker = false;
|
bool _srs_in_docker = false;
|
||||||
|
|
||||||
#ifdef SRS_SRT
|
|
||||||
SrsSrtEventLoop* _srt_eventloop = NULL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <srs_app_st.hpp>
|
#include <srs_app_st.hpp>
|
||||||
|
|
||||||
// Initialize global settings.
|
// Initialize global settings.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue