winlin

for bug #200, fix the writev for librtmp, add comments.

@@ -84,6 +84,7 @@ int SrsStSocket::read(void* buf, size_t size, ssize_t* nread) @@ -84,6 +84,7 @@ int SrsStSocket::read(void* buf, size_t size, ssize_t* nread)
84 // (a value of 0 means the network connection is closed or end of file is reached). 84 // (a value of 0 means the network connection is closed or end of file is reached).
85 // Otherwise, a value of -1 is returned and errno is set to indicate the error. 85 // Otherwise, a value of -1 is returned and errno is set to indicate the error.
86 if (nb_read <= 0) { 86 if (nb_read <= 0) {
  87 + // @see https://github.com/winlinvip/simple-rtmp-server/issues/200
87 if (nb_read < 0 && errno == ETIME) { 88 if (nb_read < 0 && errno == ETIME) {
88 return ERROR_SOCKET_TIMEOUT; 89 return ERROR_SOCKET_TIMEOUT;
89 } 90 }
@@ -113,6 +114,7 @@ int SrsStSocket::read_fully(void* buf, size_t size, ssize_t* nread) @@ -113,6 +114,7 @@ int SrsStSocket::read_fully(void* buf, size_t size, ssize_t* nread)
113 // (a value less than nbyte means the network connection is closed or end of file is reached) 114 // (a value less than nbyte means the network connection is closed or end of file is reached)
114 // Otherwise, a value of -1 is returned and errno is set to indicate the error. 115 // Otherwise, a value of -1 is returned and errno is set to indicate the error.
115 if (nb_read != (ssize_t)size) { 116 if (nb_read != (ssize_t)size) {
  117 + // @see https://github.com/winlinvip/simple-rtmp-server/issues/200
116 if (nb_read < 0 && errno == ETIME) { 118 if (nb_read < 0 && errno == ETIME) {
117 return ERROR_SOCKET_TIMEOUT; 119 return ERROR_SOCKET_TIMEOUT;
118 } 120 }
@@ -141,6 +143,7 @@ int SrsStSocket::write(void* buf, size_t size, ssize_t* nwrite) @@ -141,6 +143,7 @@ int SrsStSocket::write(void* buf, size_t size, ssize_t* nwrite)
141 // On success a non-negative integer equal to nbyte is returned. 143 // On success a non-negative integer equal to nbyte is returned.
142 // Otherwise, a value of -1 is returned and errno is set to indicate the error. 144 // Otherwise, a value of -1 is returned and errno is set to indicate the error.
143 if (nb_write <= 0) { 145 if (nb_write <= 0) {
  146 + // @see https://github.com/winlinvip/simple-rtmp-server/issues/200
144 if (nb_write < 0 && errno == ETIME) { 147 if (nb_write < 0 && errno == ETIME) {
145 return ERROR_SOCKET_TIMEOUT; 148 return ERROR_SOCKET_TIMEOUT;
146 } 149 }
@@ -165,6 +168,7 @@ int SrsStSocket::writev(const iovec *iov, int iov_size, ssize_t* nwrite) @@ -165,6 +168,7 @@ int SrsStSocket::writev(const iovec *iov, int iov_size, ssize_t* nwrite)
165 // On success a non-negative integer equal to nbyte is returned. 168 // On success a non-negative integer equal to nbyte is returned.
166 // Otherwise, a value of -1 is returned and errno is set to indicate the error. 169 // Otherwise, a value of -1 is returned and errno is set to indicate the error.
167 if (nb_write <= 0) { 170 if (nb_write <= 0) {
  171 + // @see https://github.com/winlinvip/simple-rtmp-server/issues/200
168 if (nb_write < 0 && errno == ETIME) { 172 if (nb_write < 0 && errno == ETIME) {
169 return ERROR_SOCKET_TIMEOUT; 173 return ERROR_SOCKET_TIMEOUT;
170 } 174 }
@@ -143,17 +143,25 @@ int SimpleSocketStream::writev(const iovec *iov, int iov_size, ssize_t* nwrite) @@ -143,17 +143,25 @@ int SimpleSocketStream::writev(const iovec *iov, int iov_size, ssize_t* nwrite)
143 { 143 {
144 int ret = ERROR_SUCCESS; 144 int ret = ERROR_SUCCESS;
145 145
146 - *nwrite = ::writev(fd, iov, iov_size); 146 + ssize_t nb_write = ::writev(fd, iov, iov_size);
147 147
148 - if (*nwrite <= 0) {  
149 - if (errno == ETIME) { 148 + if (nwrite) {
  149 + *nwrite = nb_write;
  150 + }
  151 +
  152 + // On success, the readv() function returns the number of bytes read;
  153 + // the writev() function returns the number of bytes written. On error, -1 is
  154 + // returned, and errno is set appropriately.
  155 + if (nb_write <= 0) {
  156 + // @see https://github.com/winlinvip/simple-rtmp-server/issues/200
  157 + if (nb_write < 0 && errno == ETIME) {
150 return ERROR_SOCKET_TIMEOUT; 158 return ERROR_SOCKET_TIMEOUT;
151 } 159 }
152 160
153 return ERROR_SOCKET_WRITE; 161 return ERROR_SOCKET_WRITE;
154 } 162 }
155 163
156 - send_bytes += *nwrite; 164 + send_bytes += nb_write;
157 165
158 return ret; 166 return ret;
159 } 167 }
@@ -202,6 +210,7 @@ int SimpleSocketStream::write(void* buf, size_t size, ssize_t* nwrite) @@ -202,6 +210,7 @@ int SimpleSocketStream::write(void* buf, size_t size, ssize_t* nwrite)
202 } 210 }
203 211
204 if (nb_write <= 0) { 212 if (nb_write <= 0) {
  213 + // @see https://github.com/winlinvip/simple-rtmp-server/issues/200
205 if (nb_write < 0 && errno == ETIME) { 214 if (nb_write < 0 && errno == ETIME) {
206 return ERROR_SOCKET_TIMEOUT; 215 return ERROR_SOCKET_TIMEOUT;
207 } 216 }