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

srs-librtmp: implements the simple socket stream.

This commit is contained in:
winlin 2014-03-02 13:06:21 +08:00
parent 86267f854c
commit 76f37baafe
2 changed files with 102 additions and 7 deletions

View file

@ -30,10 +30,21 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <sys/socket.h> #include <sys/socket.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <arpa/inet.h> #include <arpa/inet.h>
#include <errno.h>
#include <sys/uio.h>
#ifndef ST_UTIME_NO_TIMEOUT
#define ST_UTIME_NO_TIMEOUT -1
#endif
SimpleSocketStream::SimpleSocketStream() SimpleSocketStream::SimpleSocketStream()
{ {
fd = -1; fd = -1;
send_timeout = recv_timeout = ST_UTIME_NO_TIMEOUT;
recv_bytes = send_bytes = 0;
srs_update_system_time_ms();
start_time_ms = srs_get_system_time_ms();
} }
SimpleSocketStream::~SimpleSocketStream() SimpleSocketStream::~SimpleSocketStream()
@ -71,70 +82,149 @@ int SimpleSocketStream::connect(const char* server_ip, int port)
int SimpleSocketStream::read(const void* buf, size_t size, ssize_t* nread) int SimpleSocketStream::read(const void* buf, size_t size, ssize_t* nread)
{ {
int ret = ERROR_SUCCESS; int ret = ERROR_SUCCESS;
*nread = ::recv(fd, (void*)buf, size, 0);
// On success a non-negative integer indicating the number of bytes actually read is returned
// (a value of 0 means the network connection is closed or end of file is reached).
if (*nread <= 0) {
if (errno == ETIME) {
return ERROR_SOCKET_TIMEOUT;
}
if (*nread == 0) {
errno = ECONNRESET;
}
return ERROR_SOCKET_READ;
}
recv_bytes += *nread;
return ret; return ret;
} }
// ISrsProtocolReader // ISrsProtocolReader
void SimpleSocketStream::set_recv_timeout(int64_t timeout_us) void SimpleSocketStream::set_recv_timeout(int64_t timeout_us)
{ {
recv_timeout = timeout_us;
} }
int64_t SimpleSocketStream::get_recv_timeout() int64_t SimpleSocketStream::get_recv_timeout()
{ {
return -1; return recv_timeout;
} }
int64_t SimpleSocketStream::get_recv_bytes() int64_t SimpleSocketStream::get_recv_bytes()
{ {
return 0; return recv_bytes;
} }
int SimpleSocketStream::get_recv_kbps() int SimpleSocketStream::get_recv_kbps()
{ {
srs_update_system_time_ms();
int64_t diff_ms = srs_get_system_time_ms() - start_time_ms;
if (diff_ms <= 0) {
return 0; return 0;
}
return recv_bytes * 8 / diff_ms;
} }
// ISrsProtocolWriter // ISrsProtocolWriter
void SimpleSocketStream::set_send_timeout(int64_t timeout_us) void SimpleSocketStream::set_send_timeout(int64_t timeout_us)
{ {
send_timeout = timeout_us;
} }
int64_t SimpleSocketStream::get_send_timeout() int64_t SimpleSocketStream::get_send_timeout()
{ {
return -1; return send_timeout;
} }
int64_t SimpleSocketStream::get_send_bytes() int64_t SimpleSocketStream::get_send_bytes()
{ {
return 0; return send_bytes;
} }
int SimpleSocketStream::get_send_kbps() int SimpleSocketStream::get_send_kbps()
{ {
srs_update_system_time_ms();
int64_t diff_ms = srs_get_system_time_ms() - start_time_ms;
if (diff_ms <= 0) {
return 0; return 0;
}
return send_bytes * 8 / diff_ms;
} }
int SimpleSocketStream::writev(const iovec *iov, int iov_size, ssize_t* nwrite) int SimpleSocketStream::writev(const iovec *iov, int iov_size, ssize_t* nwrite)
{ {
int ret = ERROR_SUCCESS; int ret = ERROR_SUCCESS;
*nwrite = ::writev(fd, iov, iov_size);
if (*nwrite <= 0) {
if (errno == ETIME) {
return ERROR_SOCKET_TIMEOUT;
}
return ERROR_SOCKET_WRITE;
}
send_bytes += *nwrite;
return ret; return ret;
} }
// ISrsProtocolReaderWriter // ISrsProtocolReaderWriter
bool SimpleSocketStream::is_never_timeout(int64_t timeout_us) bool SimpleSocketStream::is_never_timeout(int64_t timeout_us)
{ {
return true; return timeout_us == (int64_t)ST_UTIME_NO_TIMEOUT;
} }
int SimpleSocketStream::read_fully(const void* buf, size_t size, ssize_t* nread) int SimpleSocketStream::read_fully(const void* buf, size_t size, ssize_t* nread)
{ {
int ret = ERROR_SUCCESS; int ret = ERROR_SUCCESS;
size_t left = size;
*nread = 0;
while (left > 0) {
char* this_buf = (char*)buf + *nread;
ssize_t this_nread;
if ((ret = this->read(this_buf, left, &this_nread)) != ERROR_SUCCESS) {
return ret;
}
*nread += this_nread;
left -= this_nread;
}
recv_bytes += *nread;
return ret; return ret;
} }
int SimpleSocketStream::write(const void* buf, size_t size, ssize_t* nwrite) int SimpleSocketStream::write(const void* buf, size_t size, ssize_t* nwrite)
{ {
int ret = ERROR_SUCCESS; int ret = ERROR_SUCCESS;
*nwrite = ::send(fd, (void*)buf, size, 0);
if (*nwrite <= 0) {
if (errno == ETIME) {
return ERROR_SOCKET_TIMEOUT;
}
return ERROR_SOCKET_WRITE;
}
send_bytes += *nwrite;
return ret; return ret;
} }

View file

@ -39,6 +39,11 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
class SimpleSocketStream : public ISrsProtocolReaderWriter class SimpleSocketStream : public ISrsProtocolReaderWriter
{ {
private: private:
int64_t start_time_ms;
int64_t recv_timeout;
int64_t send_timeout;
int64_t recv_bytes;
int64_t send_bytes;
int fd; int fd;
public: public:
SimpleSocketStream(); SimpleSocketStream();