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