正在显示
4 个修改的文件
包含
86 行增加
和
14 行删除
| @@ -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. |
-
请 注册 或 登录 后发表评论