winlin

fix the timeout for librtmp

@@ -88,7 +88,15 @@ int main(int argc, char** argv) @@ -88,7 +88,15 @@ int main(int argc, char** argv)
88 exit(-2); 88 exit(-2);
89 } 89 }
90 90
91 - rtmp = srs_rtmp_create(rtmp_url); 91 + if ((rtmp = srs_rtmp_create(rtmp_url)) == NULL) {
  92 + srs_human_trace("create rtmp failed");
  93 + ret = -1;
  94 + goto rtmp_destroy;
  95 + }
  96 + if ((ret = srs_rtmp_set_timeout(rtmp, timeout * 1000, timeout * 1000)) != 0) {
  97 + srs_human_trace("set timeout for rtmp failed. errno=%d", ret);
  98 + goto rtmp_destroy;
  99 + }
92 100
93 if ((ret = srs_rtmp_dns_resolve(rtmp)) != 0) { 101 if ((ret = srs_rtmp_dns_resolve(rtmp)) != 0) {
94 srs_human_trace("dns resolve failed. ret=%d", ret); 102 srs_human_trace("dns resolve failed. ret=%d", ret);
@@ -27,7 +27,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -27,7 +27,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 27
28 // for srs-librtmp, @see https://github.com/ossrs/srs/issues/213 28 // for srs-librtmp, @see https://github.com/ossrs/srs/issues/213
29 #ifndef _WIN32 29 #ifndef _WIN32
30 - #define SOCKET_ETIME ETIME 30 + #define SOCKET_ETIME EWOULDBLOCK
31 #define SOCKET_ECONNRESET ECONNRESET 31 #define SOCKET_ECONNRESET ECONNRESET
32 32
33 #define SOCKET_ERRNO() errno 33 #define SOCKET_ERRNO() errno
@@ -160,10 +160,23 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -160,10 +160,23 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
160 160
161 return ret; 161 return ret;
162 } 162 }
163 - void srs_hijack_io_set_recv_timeout(srs_hijack_io_t ctx, int64_t timeout_us) 163 + int srs_hijack_io_set_recv_timeout(srs_hijack_io_t ctx, int64_t timeout_us)
164 { 164 {
165 SrsBlockSyncSocket* skt = (SrsBlockSyncSocket*)ctx; 165 SrsBlockSyncSocket* skt = (SrsBlockSyncSocket*)ctx;
  166 +
  167 + int sec = timeout_us / (1000 * 1000LL);
  168 + int microsec = timeout_us / 1000LL % 1000;
  169 +
  170 + sec = srs_max(0, sec);
  171 + microsec = srs_max(0, microsec);
  172 +
  173 + struct timeval tv = { sec , microsec };
  174 + if (setsockopt(skt->fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) == -1) {
  175 + return SOCKET_ERRNO();
  176 + }
166 skt->recv_timeout = timeout_us; 177 skt->recv_timeout = timeout_us;
  178 +
  179 + return ERROR_SUCCESS;
167 } 180 }
168 int64_t srs_hijack_io_get_recv_timeout(srs_hijack_io_t ctx) 181 int64_t srs_hijack_io_get_recv_timeout(srs_hijack_io_t ctx)
169 { 182 {
@@ -175,10 +188,24 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -175,10 +188,24 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
175 SrsBlockSyncSocket* skt = (SrsBlockSyncSocket*)ctx; 188 SrsBlockSyncSocket* skt = (SrsBlockSyncSocket*)ctx;
176 return skt->recv_bytes; 189 return skt->recv_bytes;
177 } 190 }
178 - void srs_hijack_io_set_send_timeout(srs_hijack_io_t ctx, int64_t timeout_us) 191 + int srs_hijack_io_set_send_timeout(srs_hijack_io_t ctx, int64_t timeout_us)
179 { 192 {
180 SrsBlockSyncSocket* skt = (SrsBlockSyncSocket*)ctx; 193 SrsBlockSyncSocket* skt = (SrsBlockSyncSocket*)ctx;
  194 +
  195 + int sec = timeout_us / (1000 * 1000LL);
  196 + int microsec = timeout_us / 1000LL % 1000;
  197 +
  198 + sec = srs_max(0, sec);
  199 + microsec = srs_max(0, microsec);
  200 +
  201 + struct timeval tv = { sec , microsec };
  202 + if (setsockopt(skt->fd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)) == -1) {
  203 + return SOCKET_ERRNO();
  204 + }
  205 +
181 skt->send_timeout = timeout_us; 206 skt->send_timeout = timeout_us;
  207 +
  208 + return ERROR_SUCCESS;
182 } 209 }
183 int64_t srs_hijack_io_get_send_timeout(srs_hijack_io_t ctx) 210 int64_t srs_hijack_io_get_send_timeout(srs_hijack_io_t ctx)
184 { 211 {
@@ -484,14 +484,6 @@ int srs_librtmp_context_resolve_host(Context* context) @@ -484,14 +484,6 @@ int srs_librtmp_context_resolve_host(Context* context)
484 { 484 {
485 int ret = ERROR_SUCCESS; 485 int ret = ERROR_SUCCESS;
486 486
487 - // create socket  
488 - srs_freep(context->skt);  
489 - context->skt = new SimpleSocketStream();  
490 -  
491 - if ((ret = context->skt->create_socket()) != ERROR_SUCCESS) {  
492 - return ret;  
493 - }  
494 -  
495 // connect to server:port 487 // connect to server:port
496 context->ip = srs_dns_resolve(context->host); 488 context->ip = srs_dns_resolve(context->host);
497 if (context->ip.empty()) { 489 if (context->ip.empty()) {
@@ -540,6 +532,17 @@ srs_rtmp_t srs_rtmp_create(const char* url) @@ -540,6 +532,17 @@ srs_rtmp_t srs_rtmp_create(const char* url)
540 { 532 {
541 Context* context = new Context(); 533 Context* context = new Context();
542 context->url = url; 534 context->url = url;
  535 +
  536 + // create socket
  537 + srs_freep(context->skt);
  538 + context->skt = new SimpleSocketStream();
  539 +
  540 + if (context->skt->create_socket() != ERROR_SUCCESS) {
  541 + // free the context and return NULL
  542 + srs_freep(context);
  543 + return NULL;
  544 + }
  545 +
543 return context; 546 return context;
544 } 547 }
545 548
@@ -552,8 +555,34 @@ srs_rtmp_t srs_rtmp_create2(const char* url) @@ -552,8 +555,34 @@ srs_rtmp_t srs_rtmp_create2(const char* url)
552 // auto append stream. 555 // auto append stream.
553 context->url += "/livestream"; 556 context->url += "/livestream";
554 557
  558 + // create socket
  559 + srs_freep(context->skt);
  560 + context->skt = new SimpleSocketStream();
  561 +
  562 + if (context->skt->create_socket() != ERROR_SUCCESS) {
  563 + // free the context and return NULL
  564 + srs_freep(context);
  565 + return NULL;
  566 + }
  567 +
555 return context; 568 return context;
556 } 569 }
  570 +
  571 +int srs_rtmp_set_timeout(srs_rtmp_t rtmp, int recv_timeout_ms, int send_timeout_ms)
  572 +{
  573 + int ret = ERROR_SUCCESS;
  574 +
  575 + if (!rtmp) {
  576 + return ret;
  577 + }
  578 +
  579 + Context* context = (Context*)rtmp;
  580 +
  581 + context->skt->set_recv_timeout(recv_timeout_ms * 1000LL);
  582 + context->skt->set_send_timeout(send_timeout_ms * 1000LL);
  583 +
  584 + return ret;
  585 +}
557 586
558 void srs_rtmp_destroy(srs_rtmp_t rtmp) 587 void srs_rtmp_destroy(srs_rtmp_t rtmp)
559 { 588 {
@@ -108,6 +108,14 @@ extern srs_rtmp_t srs_rtmp_create(const char* url); @@ -108,6 +108,14 @@ extern srs_rtmp_t srs_rtmp_create(const char* url);
108 */ 108 */
109 extern srs_rtmp_t srs_rtmp_create2(const char* url); 109 extern srs_rtmp_t srs_rtmp_create2(const char* url);
110 /** 110 /**
  111 + * set socket timeout
  112 + * @param recv_timeout_ms the timeout for receiving messages in ms.
  113 + * @param send_timeout_ms the timeout for sending message in ms.
  114 + *
  115 + * @return 0, success; otherswise, failed.
  116 + */
  117 +extern int srs_rtmp_set_timeout(srs_rtmp_t rtmp, int recv_timeout_ms, int send_timeout_ms);
  118 +/**
111 * close and destroy the rtmp stack. 119 * close and destroy the rtmp stack.
112 * @remark, user should never use the rtmp again. 120 * @remark, user should never use the rtmp again.
113 */ 121 */
@@ -982,7 +990,7 @@ typedef void* srs_hijack_io_t; @@ -982,7 +990,7 @@ typedef void* srs_hijack_io_t;
982 * set the socket recv timeout. 990 * set the socket recv timeout.
983 * @return 0, success; otherswise, failed. 991 * @return 0, success; otherswise, failed.
984 */ 992 */
985 - extern void srs_hijack_io_set_recv_timeout(srs_hijack_io_t ctx, int64_t timeout_us); 993 + extern int srs_hijack_io_set_recv_timeout(srs_hijack_io_t ctx, int64_t timeout_us);
986 /** 994 /**
987 * get the socket recv timeout. 995 * get the socket recv timeout.
988 * @return 0, success; otherswise, failed. 996 * @return 0, success; otherswise, failed.
@@ -997,7 +1005,7 @@ typedef void* srs_hijack_io_t; @@ -997,7 +1005,7 @@ typedef void* srs_hijack_io_t;
997 * set the socket send timeout. 1005 * set the socket send timeout.
998 * @return 0, success; otherswise, failed. 1006 * @return 0, success; otherswise, failed.
999 */ 1007 */
1000 - extern void srs_hijack_io_set_send_timeout(srs_hijack_io_t ctx, int64_t timeout_us); 1008 + extern int srs_hijack_io_set_send_timeout(srs_hijack_io_t ctx, int64_t timeout_us);
1001 /** 1009 /**
1002 * get the socket send timeout. 1010 * get the socket send timeout.
1003 * @return 0, success; otherswise, failed. 1011 * @return 0, success; otherswise, failed.