diff --git a/trunk/src/app/srs_app_st_socket.cpp b/trunk/src/app/srs_app_st_socket.cpp index 6c8d4be97..92618fdfc 100644 --- a/trunk/src/app/srs_app_st_socket.cpp +++ b/trunk/src/app/srs_app_st_socket.cpp @@ -84,6 +84,7 @@ int SrsStSocket::read(void* buf, size_t size, ssize_t* nread) // (a value of 0 means the network connection is closed or end of file is reached). // Otherwise, a value of -1 is returned and errno is set to indicate the error. if (nb_read <= 0) { + // @see https://github.com/winlinvip/simple-rtmp-server/issues/200 if (nb_read < 0 && errno == ETIME) { return ERROR_SOCKET_TIMEOUT; } @@ -113,6 +114,7 @@ int SrsStSocket::read_fully(void* buf, size_t size, ssize_t* nread) // (a value less than nbyte means the network connection is closed or end of file is reached) // Otherwise, a value of -1 is returned and errno is set to indicate the error. if (nb_read != (ssize_t)size) { + // @see https://github.com/winlinvip/simple-rtmp-server/issues/200 if (nb_read < 0 && errno == ETIME) { return ERROR_SOCKET_TIMEOUT; } @@ -141,6 +143,7 @@ int SrsStSocket::write(void* buf, size_t size, ssize_t* nwrite) // On success a non-negative integer equal to nbyte is returned. // Otherwise, a value of -1 is returned and errno is set to indicate the error. if (nb_write <= 0) { + // @see https://github.com/winlinvip/simple-rtmp-server/issues/200 if (nb_write < 0 && errno == ETIME) { return ERROR_SOCKET_TIMEOUT; } @@ -165,6 +168,7 @@ int SrsStSocket::writev(const iovec *iov, int iov_size, ssize_t* nwrite) // On success a non-negative integer equal to nbyte is returned. // Otherwise, a value of -1 is returned and errno is set to indicate the error. if (nb_write <= 0) { + // @see https://github.com/winlinvip/simple-rtmp-server/issues/200 if (nb_write < 0 && errno == ETIME) { return ERROR_SOCKET_TIMEOUT; } diff --git a/trunk/src/libs/srs_lib_simple_socket.cpp b/trunk/src/libs/srs_lib_simple_socket.cpp index 45e8f5b9e..cc8476778 100644 --- a/trunk/src/libs/srs_lib_simple_socket.cpp +++ b/trunk/src/libs/srs_lib_simple_socket.cpp @@ -143,17 +143,25 @@ int SimpleSocketStream::writev(const iovec *iov, int iov_size, ssize_t* nwrite) { int ret = ERROR_SUCCESS; - *nwrite = ::writev(fd, iov, iov_size); + ssize_t nb_write = ::writev(fd, iov, iov_size); - if (*nwrite <= 0) { - if (errno == ETIME) { + if (nwrite) { + *nwrite = nb_write; + } + + // On success, the readv() function returns the number of bytes read; + // the writev() function returns the number of bytes written. On error, -1 is + // returned, and errno is set appropriately. + if (nb_write <= 0) { + // @see https://github.com/winlinvip/simple-rtmp-server/issues/200 + if (nb_write < 0 && errno == ETIME) { return ERROR_SOCKET_TIMEOUT; } return ERROR_SOCKET_WRITE; } - send_bytes += *nwrite; + send_bytes += nb_write; return ret; } @@ -202,6 +210,7 @@ int SimpleSocketStream::write(void* buf, size_t size, ssize_t* nwrite) } if (nb_write <= 0) { + // @see https://github.com/winlinvip/simple-rtmp-server/issues/200 if (nb_write < 0 && errno == ETIME) { return ERROR_SOCKET_TIMEOUT; }