winlin

merge from 2.0

@@ -113,8 +113,16 @@ int main(int argc, char** argv) @@ -113,8 +113,16 @@ int main(int argc, char** argv)
113 srs_human_trace("duration and timeout must be positive."); 113 srs_human_trace("duration and timeout must be positive.");
114 exit(-3); 114 exit(-3);
115 } 115 }
116 -  
117 - rtmp = srs_rtmp_create(rtmp_url); 116 +
  117 + if ((rtmp = srs_rtmp_create(rtmp_url)) == NULL) {
  118 + srs_human_trace("create rtmp failed");
  119 + ret = -1;
  120 + goto rtmp_destroy;
  121 + }
  122 + if ((ret = srs_rtmp_set_timeout(rtmp, timeout * 1000, timeout * 1000)) != 0) {
  123 + srs_human_trace("set timeout for rtmp failed. errno=%d", ret);
  124 + goto rtmp_destroy;
  125 + }
118 126
119 if ((ret = srs_rtmp_dns_resolve(rtmp)) != 0) { 127 if ((ret = srs_rtmp_dns_resolve(rtmp)) != 0) {
120 srs_human_trace("dns resolve failed. ret=%d", ret); 128 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 {
@@ -480,14 +480,6 @@ int srs_librtmp_context_resolve_host(Context* context) @@ -480,14 +480,6 @@ int srs_librtmp_context_resolve_host(Context* context)
480 { 480 {
481 int ret = ERROR_SUCCESS; 481 int ret = ERROR_SUCCESS;
482 482
483 - // create socket  
484 - srs_freep(context->skt);  
485 - context->skt = new SimpleSocketStream();  
486 -  
487 - if ((ret = context->skt->create_socket()) != ERROR_SUCCESS) {  
488 - return ret;  
489 - }  
490 -  
491 // connect to server:port 483 // connect to server:port
492 context->ip = srs_dns_resolve(context->host); 484 context->ip = srs_dns_resolve(context->host);
493 if (context->ip.empty()) { 485 if (context->ip.empty()) {
@@ -534,6 +526,17 @@ srs_rtmp_t srs_rtmp_create(const char* url) @@ -534,6 +526,17 @@ srs_rtmp_t srs_rtmp_create(const char* url)
534 { 526 {
535 Context* context = new Context(); 527 Context* context = new Context();
536 context->url = url; 528 context->url = url;
  529 +
  530 + // create socket
  531 + srs_freep(context->skt);
  532 + context->skt = new SimpleSocketStream();
  533 +
  534 + if (context->skt->create_socket() != ERROR_SUCCESS) {
  535 + // free the context and return NULL
  536 + srs_freep(context);
  537 + return NULL;
  538 + }
  539 +
537 return context; 540 return context;
538 } 541 }
539 542
@@ -546,8 +549,34 @@ srs_rtmp_t srs_rtmp_create2(const char* url) @@ -546,8 +549,34 @@ srs_rtmp_t srs_rtmp_create2(const char* url)
546 // auto append stream. 549 // auto append stream.
547 context->url += "/livestream"; 550 context->url += "/livestream";
548 551
  552 + // create socket
  553 + srs_freep(context->skt);
  554 + context->skt = new SimpleSocketStream();
  555 +
  556 + if (context->skt->create_socket() != ERROR_SUCCESS) {
  557 + // free the context and return NULL
  558 + srs_freep(context);
  559 + return NULL;
  560 + }
  561 +
549 return context; 562 return context;
550 } 563 }
  564 +
  565 +int srs_rtmp_set_timeout(srs_rtmp_t rtmp, int recv_timeout_ms, int send_timeout_ms)
  566 +{
  567 + int ret = ERROR_SUCCESS;
  568 +
  569 + if (!rtmp) {
  570 + return ret;
  571 + }
  572 +
  573 + Context* context = (Context*)rtmp;
  574 +
  575 + context->skt->set_recv_timeout(recv_timeout_ms * 1000LL);
  576 + context->skt->set_send_timeout(send_timeout_ms * 1000LL);
  577 +
  578 + return ret;
  579 +}
551 580
552 void srs_rtmp_destroy(srs_rtmp_t rtmp) 581 void srs_rtmp_destroy(srs_rtmp_t rtmp)
553 { 582 {
@@ -122,6 +122,14 @@ extern srs_rtmp_t srs_rtmp_create(const char* url); @@ -122,6 +122,14 @@ extern srs_rtmp_t srs_rtmp_create(const char* url);
122 */ 122 */
123 extern srs_rtmp_t srs_rtmp_create2(const char* url); 123 extern srs_rtmp_t srs_rtmp_create2(const char* url);
124 /** 124 /**
  125 + * set socket timeout
  126 + * @param recv_timeout_ms the timeout for receiving messages in ms.
  127 + * @param send_timeout_ms the timeout for sending message in ms.
  128 + *
  129 + * @return 0, success; otherswise, failed.
  130 + */
  131 +extern int srs_rtmp_set_timeout(srs_rtmp_t rtmp, int recv_timeout_ms, int send_timeout_ms);
  132 +/**
125 * close and destroy the rtmp stack. 133 * close and destroy the rtmp stack.
126 * @remark, user should never use the rtmp again. 134 * @remark, user should never use the rtmp again.
127 */ 135 */
@@ -1010,7 +1018,7 @@ typedef void* srs_hijack_io_t; @@ -1010,7 +1018,7 @@ typedef void* srs_hijack_io_t;
1010 * set the socket recv timeout. 1018 * set the socket recv timeout.
1011 * @return 0, success; otherswise, failed. 1019 * @return 0, success; otherswise, failed.
1012 */ 1020 */
1013 - extern void srs_hijack_io_set_recv_timeout(srs_hijack_io_t ctx, int64_t timeout_us); 1021 + extern int srs_hijack_io_set_recv_timeout(srs_hijack_io_t ctx, int64_t timeout_us);
1014 /** 1022 /**
1015 * get the socket recv timeout. 1023 * get the socket recv timeout.
1016 * @return 0, success; otherswise, failed. 1024 * @return 0, success; otherswise, failed.
@@ -1025,7 +1033,7 @@ typedef void* srs_hijack_io_t; @@ -1025,7 +1033,7 @@ typedef void* srs_hijack_io_t;
1025 * set the socket send timeout. 1033 * set the socket send timeout.
1026 * @return 0, success; otherswise, failed. 1034 * @return 0, success; otherswise, failed.
1027 */ 1035 */
1028 - extern void srs_hijack_io_set_send_timeout(srs_hijack_io_t ctx, int64_t timeout_us); 1036 + extern int srs_hijack_io_set_send_timeout(srs_hijack_io_t ctx, int64_t timeout_us);
1029 /** 1037 /**
1030 * get the socket send timeout. 1038 * get the socket send timeout.
1031 * @return 0, success; otherswise, failed. 1039 * @return 0, success; otherswise, failed.