winlin

use SrsTcpClient instead raw socket.

@@ -276,6 +276,8 @@ int SrsDynamicHttpConn::connect() @@ -276,6 +276,8 @@ int SrsDynamicHttpConn::connect()
276 if ((ret = transport->connect(req->host, req->port, ST_UTIME_NO_TIMEOUT)) != ERROR_SUCCESS) { 276 if ((ret = transport->connect(req->host, req->port, ST_UTIME_NO_TIMEOUT)) != ERROR_SUCCESS) {
277 return ret; 277 return ret;
278 } 278 }
  279 +
  280 + srs_freep(client);
279 client = new SrsRtmpClient(transport); 281 client = new SrsRtmpClient(transport);
280 282
281 client->set_recv_timeout(SRS_CONSTS_RTMP_RECV_TIMEOUT_US); 283 client->set_recv_timeout(SRS_CONSTS_RTMP_RECV_TIMEOUT_US);
@@ -63,13 +63,12 @@ using namespace std; @@ -63,13 +63,12 @@ using namespace std;
63 63
64 SrsEdgeIngester::SrsEdgeIngester() 64 SrsEdgeIngester::SrsEdgeIngester()
65 { 65 {
66 - io = NULL; 66 + transport = new SrsTcpClient();
67 kbps = new SrsKbps(); 67 kbps = new SrsKbps();
68 client = NULL; 68 client = NULL;
69 _edge = NULL; 69 _edge = NULL;
70 _req = NULL; 70 _req = NULL;
71 stream_id = 0; 71 stream_id = 0;
72 - stfd = NULL;  
73 lb = new SrsLbRoundRobin(); 72 lb = new SrsLbRoundRobin();
74 pthread = new SrsReusableThread2("edge-igs", this, SRS_EDGE_INGESTER_SLEEP_US); 73 pthread = new SrsReusableThread2("edge-igs", this, SRS_EDGE_INGESTER_SLEEP_US);
75 } 74 }
@@ -78,6 +77,7 @@ SrsEdgeIngester::~SrsEdgeIngester() @@ -78,6 +77,7 @@ SrsEdgeIngester::~SrsEdgeIngester()
78 { 77 {
79 stop(); 78 stop();
80 79
  80 + srs_freep(transport);
81 srs_freep(lb); 81 srs_freep(lb);
82 srs_freep(pthread); 82 srs_freep(pthread);
83 srs_freep(kbps); 83 srs_freep(kbps);
@@ -109,11 +109,9 @@ int SrsEdgeIngester::start() @@ -109,11 +109,9 @@ int SrsEdgeIngester::start()
109 void SrsEdgeIngester::stop() 109 void SrsEdgeIngester::stop()
110 { 110 {
111 pthread->stop(); 111 pthread->stop();
112 -  
113 - close_underlayer_socket(); 112 + transport->close();
114 113
115 srs_freep(client); 114 srs_freep(client);
116 - srs_freep(io);  
117 kbps->set_io(NULL, NULL); 115 kbps->set_io(NULL, NULL);
118 116
119 // notice to unpublish. 117 // notice to unpublish.
@@ -336,17 +334,12 @@ int SrsEdgeIngester::process_publish_message(SrsCommonMessage* msg) @@ -336,17 +334,12 @@ int SrsEdgeIngester::process_publish_message(SrsCommonMessage* msg)
336 return ret; 334 return ret;
337 } 335 }
338 336
339 -void SrsEdgeIngester::close_underlayer_socket()  
340 -{  
341 - srs_close_stfd(stfd);  
342 -}  
343 -  
344 int SrsEdgeIngester::connect_server(string& ep_server, int& ep_port) 337 int SrsEdgeIngester::connect_server(string& ep_server, int& ep_port)
345 { 338 {
346 int ret = ERROR_SUCCESS; 339 int ret = ERROR_SUCCESS;
347 340
348 // reopen 341 // reopen
349 - close_underlayer_socket(); 342 + transport->close();
350 343
351 SrsConfDirective* conf = _srs_config->get_vhost_edge_origin(_req->vhost); 344 SrsConfDirective* conf = _srs_config->get_vhost_edge_origin(_req->vhost);
352 345
@@ -368,20 +361,16 @@ int SrsEdgeIngester::connect_server(string& ep_server, int& ep_port) @@ -368,20 +361,16 @@ int SrsEdgeIngester::connect_server(string& ep_server, int& ep_port)
368 361
369 // open socket. 362 // open socket.
370 int64_t timeout = SRS_EDGE_INGESTER_TIMEOUT_US; 363 int64_t timeout = SRS_EDGE_INGESTER_TIMEOUT_US;
371 - if ((ret = srs_socket_connect(ep_server, ep_port, timeout, &stfd)) != ERROR_SUCCESS) { 364 + if ((ret = transport->connect(ep_server, ep_port, timeout)) != ERROR_SUCCESS) {
372 srs_warn("edge pull failed, stream=%s, tcUrl=%s to server=%s, port=%d, timeout=%"PRId64", ret=%d", 365 srs_warn("edge pull failed, stream=%s, tcUrl=%s to server=%s, port=%d, timeout=%"PRId64", ret=%d",
373 _req->stream.c_str(), _req->tcUrl.c_str(), ep_server.c_str(), ep_port, timeout, ret); 366 _req->stream.c_str(), _req->tcUrl.c_str(), ep_server.c_str(), ep_port, timeout, ret);
374 return ret; 367 return ret;
375 } 368 }
376 369
377 srs_freep(client); 370 srs_freep(client);
378 - srs_freep(io);  
379 -  
380 - srs_assert(stfd);  
381 - io = new SrsStSocket(stfd);  
382 - client = new SrsRtmpClient(io); 371 + client = new SrsRtmpClient(transport);
383 372
384 - kbps->set_io(io, io); 373 + kbps->set_io(transport, transport);
385 374
386 srs_trace("edge pull connected, url=%s/%s, server=%s:%d", 375 srs_trace("edge pull connected, url=%s/%s, server=%s:%d",
387 _req->tcUrl.c_str(), _req->stream.c_str(), ep_server.c_str(), ep_port); 376 _req->tcUrl.c_str(), _req->stream.c_str(), ep_server.c_str(), ep_port);
@@ -391,14 +380,13 @@ int SrsEdgeIngester::connect_server(string& ep_server, int& ep_port) @@ -391,14 +380,13 @@ int SrsEdgeIngester::connect_server(string& ep_server, int& ep_port)
391 380
392 SrsEdgeForwarder::SrsEdgeForwarder() 381 SrsEdgeForwarder::SrsEdgeForwarder()
393 { 382 {
394 - io = NULL; 383 + transport = new SrsTcpClient();
395 kbps = new SrsKbps(); 384 kbps = new SrsKbps();
396 client = NULL; 385 client = NULL;
397 _edge = NULL; 386 _edge = NULL;
398 _req = NULL; 387 _req = NULL;
399 lb = new SrsLbRoundRobin(); 388 lb = new SrsLbRoundRobin();
400 stream_id = 0; 389 stream_id = 0;
401 - stfd = NULL;  
402 pthread = new SrsReusableThread2("edge-fwr", this, SRS_EDGE_FORWARDER_SLEEP_US); 390 pthread = new SrsReusableThread2("edge-fwr", this, SRS_EDGE_FORWARDER_SLEEP_US);
403 queue = new SrsMessageQueue(); 391 queue = new SrsMessageQueue();
404 send_error_code = ERROR_SUCCESS; 392 send_error_code = ERROR_SUCCESS;
@@ -408,6 +396,7 @@ SrsEdgeForwarder::~SrsEdgeForwarder() @@ -408,6 +396,7 @@ SrsEdgeForwarder::~SrsEdgeForwarder()
408 { 396 {
409 stop(); 397 stop();
410 398
  399 + srs_freep(transport);
411 srs_freep(lb); 400 srs_freep(lb);
412 srs_freep(pthread); 401 srs_freep(pthread);
413 srs_freep(queue); 402 srs_freep(queue);
@@ -473,13 +462,11 @@ int SrsEdgeForwarder::start() @@ -473,13 +462,11 @@ int SrsEdgeForwarder::start()
473 void SrsEdgeForwarder::stop() 462 void SrsEdgeForwarder::stop()
474 { 463 {
475 pthread->stop(); 464 pthread->stop();
476 -  
477 - close_underlayer_socket(); 465 + transport->close();
478 466
479 queue->clear(); 467 queue->clear();
480 468
481 srs_freep(client); 469 srs_freep(client);
482 - srs_freep(io);  
483 kbps->set_io(NULL, NULL); 470 kbps->set_io(NULL, NULL);
484 } 471 }
485 472
@@ -586,17 +573,12 @@ int SrsEdgeForwarder::proxy(SrsCommonMessage* msg) @@ -586,17 +573,12 @@ int SrsEdgeForwarder::proxy(SrsCommonMessage* msg)
586 return ret; 573 return ret;
587 } 574 }
588 575
589 -void SrsEdgeForwarder::close_underlayer_socket()  
590 -{  
591 - srs_close_stfd(stfd);  
592 -}  
593 -  
594 int SrsEdgeForwarder::connect_server(string& ep_server, int& ep_port) 576 int SrsEdgeForwarder::connect_server(string& ep_server, int& ep_port)
595 { 577 {
596 int ret = ERROR_SUCCESS; 578 int ret = ERROR_SUCCESS;
597 579
598 // reopen 580 // reopen
599 - close_underlayer_socket(); 581 + transport->close();
600 582
601 SrsConfDirective* conf = _srs_config->get_vhost_edge_origin(_req->vhost); 583 SrsConfDirective* conf = _srs_config->get_vhost_edge_origin(_req->vhost);
602 srs_assert(conf); 584 srs_assert(conf);
@@ -610,20 +592,16 @@ int SrsEdgeForwarder::connect_server(string& ep_server, int& ep_port) @@ -610,20 +592,16 @@ int SrsEdgeForwarder::connect_server(string& ep_server, int& ep_port)
610 592
611 // open socket. 593 // open socket.
612 int64_t timeout = SRS_EDGE_FORWARDER_TIMEOUT_US; 594 int64_t timeout = SRS_EDGE_FORWARDER_TIMEOUT_US;
613 - if ((ret = srs_socket_connect(ep_server, ep_port, timeout, &stfd)) != ERROR_SUCCESS) { 595 + if ((ret = transport->connect(ep_server, ep_port, timeout)) != ERROR_SUCCESS) {
614 srs_warn("edge push failed, stream=%s, tcUrl=%s to server=%s, port=%d, timeout=%"PRId64", ret=%d", 596 srs_warn("edge push failed, stream=%s, tcUrl=%s to server=%s, port=%d, timeout=%"PRId64", ret=%d",
615 _req->stream.c_str(), _req->tcUrl.c_str(), ep_server.c_str(), ep_port, timeout, ret); 597 _req->stream.c_str(), _req->tcUrl.c_str(), ep_server.c_str(), ep_port, timeout, ret);
616 return ret; 598 return ret;
617 } 599 }
618 600
619 srs_freep(client); 601 srs_freep(client);
620 - srs_freep(io);  
621 -  
622 - srs_assert(stfd);  
623 - io = new SrsStSocket(stfd);  
624 - client = new SrsRtmpClient(io); 602 + client = new SrsRtmpClient(transport);
625 603
626 - kbps->set_io(io, io); 604 + kbps->set_io(transport, transport);
627 605
628 // open socket. 606 // open socket.
629 srs_trace("edge push connected, stream=%s, tcUrl=%s to server=%s, port=%d", 607 srs_trace("edge push connected, stream=%s, tcUrl=%s to server=%s, port=%d",
@@ -47,6 +47,7 @@ class SrsMessageQueue; @@ -47,6 +47,7 @@ class SrsMessageQueue;
47 class ISrsProtocolReaderWriter; 47 class ISrsProtocolReaderWriter;
48 class SrsKbps; 48 class SrsKbps;
49 class SrsLbRoundRobin; 49 class SrsLbRoundRobin;
  50 +class SrsTcpClient;
50 51
51 /** 52 /**
52 * the state of edge, auto machine 53 * the state of edge, auto machine
@@ -85,8 +86,7 @@ private: @@ -85,8 +86,7 @@ private:
85 SrsPlayEdge* _edge; 86 SrsPlayEdge* _edge;
86 SrsRequest* _req; 87 SrsRequest* _req;
87 SrsReusableThread2* pthread; 88 SrsReusableThread2* pthread;
88 - st_netfd_t stfd;  
89 - ISrsProtocolReaderWriter* io; 89 + SrsTcpClient* transport;
90 SrsKbps* kbps; 90 SrsKbps* kbps;
91 SrsRtmpClient* client; 91 SrsRtmpClient* client;
92 SrsLbRoundRobin* lb; 92 SrsLbRoundRobin* lb;
@@ -103,7 +103,6 @@ public: @@ -103,7 +103,6 @@ public:
103 virtual int cycle(); 103 virtual int cycle();
104 private: 104 private:
105 virtual int ingest(); 105 virtual int ingest();
106 - virtual void close_underlayer_socket();  
107 virtual int connect_server(std::string& ep_server, int& ep_port); 106 virtual int connect_server(std::string& ep_server, int& ep_port);
108 virtual int connect_app(std::string ep_server, int ep_port); 107 virtual int connect_app(std::string ep_server, int ep_port);
109 virtual int process_publish_message(SrsCommonMessage* msg); 108 virtual int process_publish_message(SrsCommonMessage* msg);
@@ -121,8 +120,7 @@ private: @@ -121,8 +120,7 @@ private:
121 SrsPublishEdge* _edge; 120 SrsPublishEdge* _edge;
122 SrsRequest* _req; 121 SrsRequest* _req;
123 SrsReusableThread2* pthread; 122 SrsReusableThread2* pthread;
124 - st_netfd_t stfd;  
125 - ISrsProtocolReaderWriter* io; 123 + SrsTcpClient* transport;
126 SrsKbps* kbps; 124 SrsKbps* kbps;
127 SrsRtmpClient* client; 125 SrsRtmpClient* client;
128 SrsLbRoundRobin* lb; 126 SrsLbRoundRobin* lb;
@@ -152,7 +150,6 @@ public: @@ -152,7 +150,6 @@ public:
152 public: 150 public:
153 virtual int proxy(SrsCommonMessage* msg); 151 virtual int proxy(SrsCommonMessage* msg);
154 private: 152 private:
155 - virtual void close_underlayer_socket();  
156 virtual int connect_server(std::string& ep_server, int& ep_port); 153 virtual int connect_server(std::string& ep_server, int& ep_port);
157 virtual int connect_app(std::string ep_server, int ep_port); 154 virtual int connect_app(std::string ep_server, int ep_port);
158 }; 155 };
@@ -54,9 +54,8 @@ SrsForwarder::SrsForwarder(SrsSource* _source) @@ -54,9 +54,8 @@ SrsForwarder::SrsForwarder(SrsSource* _source)
54 source = _source; 54 source = _source;
55 55
56 _req = NULL; 56 _req = NULL;
57 - io = NULL;  
58 client = NULL; 57 client = NULL;
59 - stfd = NULL; 58 + transport = new SrsTcpClient();
60 kbps = new SrsKbps(); 59 kbps = new SrsKbps();
61 stream_id = 0; 60 stream_id = 0;
62 61
@@ -71,6 +70,7 @@ SrsForwarder::~SrsForwarder() @@ -71,6 +70,7 @@ SrsForwarder::~SrsForwarder()
71 { 70 {
72 on_unpublish(); 71 on_unpublish();
73 72
  73 + srs_freep(transport);
74 srs_freep(pthread); 74 srs_freep(pthread);
75 srs_freep(queue); 75 srs_freep(queue);
76 srs_freep(jitter); 76 srs_freep(jitter);
@@ -151,11 +151,9 @@ int SrsForwarder::on_publish() @@ -151,11 +151,9 @@ int SrsForwarder::on_publish()
151 void SrsForwarder::on_unpublish() 151 void SrsForwarder::on_unpublish()
152 { 152 {
153 pthread->stop(); 153 pthread->stop();
154 -  
155 - close_underlayer_socket(); 154 + transport->close();
156 155
157 srs_freep(client); 156 srs_freep(client);
158 - srs_freep(io);  
159 kbps->set_io(NULL, NULL); 157 kbps->set_io(NULL, NULL);
160 } 158 }
161 159
@@ -271,11 +269,6 @@ int SrsForwarder::cycle() @@ -271,11 +269,6 @@ int SrsForwarder::cycle()
271 return ret; 269 return ret;
272 } 270 }
273 271
274 -void SrsForwarder::close_underlayer_socket()  
275 -{  
276 - srs_close_stfd(stfd);  
277 -}  
278 -  
279 void SrsForwarder::discovery_ep(string& server, int& port, string& tc_url) 272 void SrsForwarder::discovery_ep(string& server, int& port, string& tc_url)
280 { 273 {
281 SrsRequest* req = _req; 274 SrsRequest* req = _req;
@@ -292,7 +285,7 @@ int SrsForwarder::connect_server(string& ep_server, int& ep_port) @@ -292,7 +285,7 @@ int SrsForwarder::connect_server(string& ep_server, int& ep_port)
292 int ret = ERROR_SUCCESS; 285 int ret = ERROR_SUCCESS;
293 286
294 // reopen 287 // reopen
295 - close_underlayer_socket(); 288 + transport->close();
296 289
297 // discovery the server port and tcUrl from req and ep_forward. 290 // discovery the server port and tcUrl from req and ep_forward.
298 string tc_url; 291 string tc_url;
@@ -300,20 +293,16 @@ int SrsForwarder::connect_server(string& ep_server, int& ep_port) @@ -300,20 +293,16 @@ int SrsForwarder::connect_server(string& ep_server, int& ep_port)
300 293
301 // open socket. 294 // open socket.
302 int64_t timeout = SRS_FORWARDER_SLEEP_US; 295 int64_t timeout = SRS_FORWARDER_SLEEP_US;
303 - if ((ret = srs_socket_connect(ep_server, ep_port, timeout, &stfd)) != ERROR_SUCCESS) { 296 + if ((ret = transport->connect(ep_server, ep_port, timeout)) != ERROR_SUCCESS) {
304 srs_warn("forward failed, stream=%s, tcUrl=%s to server=%s, port=%d, timeout=%"PRId64", ret=%d", 297 srs_warn("forward failed, stream=%s, tcUrl=%s to server=%s, port=%d, timeout=%"PRId64", ret=%d",
305 _req->stream.c_str(), _req->tcUrl.c_str(), ep_server.c_str(), ep_port, timeout, ret); 298 _req->stream.c_str(), _req->tcUrl.c_str(), ep_server.c_str(), ep_port, timeout, ret);
306 return ret; 299 return ret;
307 } 300 }
308 301
309 srs_freep(client); 302 srs_freep(client);
310 - srs_freep(io);  
311 -  
312 - srs_assert(stfd);  
313 - io = new SrsStSocket(stfd);  
314 - client = new SrsRtmpClient(io); 303 + client = new SrsRtmpClient(transport);
315 304
316 - kbps->set_io(io, io); 305 + kbps->set_io(transport, transport);
317 306
318 srs_trace("forward connected, stream=%s, tcUrl=%s to server=%s, port=%d", 307 srs_trace("forward connected, stream=%s, tcUrl=%s to server=%s, port=%d",
319 _req->stream.c_str(), _req->tcUrl.c_str(), ep_server.c_str(), ep_port); 308 _req->stream.c_str(), _req->tcUrl.c_str(), ep_server.c_str(), ep_port);
@@ -56,11 +56,10 @@ private: @@ -56,11 +56,10 @@ private:
56 SrsRequest* _req; 56 SrsRequest* _req;
57 int stream_id; 57 int stream_id;
58 private: 58 private:
59 - st_netfd_t stfd;  
60 SrsReusableThread2* pthread; 59 SrsReusableThread2* pthread;
61 private: 60 private:
62 SrsSource* source; 61 SrsSource* source;
63 - ISrsProtocolReaderWriter* io; 62 + SrsTcpClient* transport;
64 SrsKbps* kbps; 63 SrsKbps* kbps;
65 SrsRtmpClient* client; 64 SrsRtmpClient* client;
66 SrsRtmpJitter* jitter; 65 SrsRtmpJitter* jitter;
@@ -99,7 +98,6 @@ public: @@ -99,7 +98,6 @@ public:
99 public: 98 public:
100 virtual int cycle(); 99 virtual int cycle();
101 private: 100 private:
102 - virtual void close_underlayer_socket();  
103 virtual void discovery_ep(std::string& server, int& port, std::string& tc_url); 101 virtual void discovery_ep(std::string& server, int& port, std::string& tc_url);
104 virtual int connect_server(std::string& ep_server, int& ep_port); 102 virtual int connect_server(std::string& ep_server, int& ep_port);
105 virtual int connect_app(std::string ep_server, int ep_port); 103 virtual int connect_app(std::string ep_server, int ep_port);
@@ -39,9 +39,7 @@ using namespace std; @@ -39,9 +39,7 @@ using namespace std;
39 39
40 SrsHttpClient::SrsHttpClient() 40 SrsHttpClient::SrsHttpClient()
41 { 41 {
42 - connected = false;  
43 - stfd = NULL;  
44 - skt = NULL; 42 + transport = new SrsTcpClient();
45 parser = NULL; 43 parser = NULL;
46 timeout_us = 0; 44 timeout_us = 0;
47 port = 0; 45 port = 0;
@@ -50,6 +48,8 @@ SrsHttpClient::SrsHttpClient() @@ -50,6 +48,8 @@ SrsHttpClient::SrsHttpClient()
50 SrsHttpClient::~SrsHttpClient() 48 SrsHttpClient::~SrsHttpClient()
51 { 49 {
52 disconnect(); 50 disconnect();
  51 +
  52 + srs_freep(transport);
53 srs_freep(parser); 53 srs_freep(parser);
54 } 54 }
55 55
@@ -102,7 +102,7 @@ int SrsHttpClient::post(string path, string req, ISrsHttpMessage** ppmsg) @@ -102,7 +102,7 @@ int SrsHttpClient::post(string path, string req, ISrsHttpMessage** ppmsg)
102 << req; 102 << req;
103 103
104 std::string data = ss.str(); 104 std::string data = ss.str();
105 - if ((ret = skt->write((void*)data.c_str(), data.length(), NULL)) != ERROR_SUCCESS) { 105 + if ((ret = transport->write((void*)data.c_str(), data.length(), NULL)) != ERROR_SUCCESS) {
106 // disconnect when error. 106 // disconnect when error.
107 disconnect(); 107 disconnect();
108 108
@@ -111,7 +111,7 @@ int SrsHttpClient::post(string path, string req, ISrsHttpMessage** ppmsg) @@ -111,7 +111,7 @@ int SrsHttpClient::post(string path, string req, ISrsHttpMessage** ppmsg)
111 } 111 }
112 112
113 ISrsHttpMessage* msg = NULL; 113 ISrsHttpMessage* msg = NULL;
114 - if ((ret = parser->parse_message(skt, NULL, &msg)) != ERROR_SUCCESS) { 114 + if ((ret = parser->parse_message(transport, NULL, &msg)) != ERROR_SUCCESS) {
115 srs_error("parse http post response failed. ret=%d", ret); 115 srs_error("parse http post response failed. ret=%d", ret);
116 return ret; 116 return ret;
117 } 117 }
@@ -148,7 +148,7 @@ int SrsHttpClient::get(string path, std::string req, ISrsHttpMessage** ppmsg) @@ -148,7 +148,7 @@ int SrsHttpClient::get(string path, std::string req, ISrsHttpMessage** ppmsg)
148 << req; 148 << req;
149 149
150 std::string data = ss.str(); 150 std::string data = ss.str();
151 - if ((ret = skt->write((void*)data.c_str(), data.length(), NULL)) != ERROR_SUCCESS) { 151 + if ((ret = transport->write((void*)data.c_str(), data.length(), NULL)) != ERROR_SUCCESS) {
152 // disconnect when error. 152 // disconnect when error.
153 disconnect(); 153 disconnect();
154 154
@@ -157,7 +157,7 @@ int SrsHttpClient::get(string path, std::string req, ISrsHttpMessage** ppmsg) @@ -157,7 +157,7 @@ int SrsHttpClient::get(string path, std::string req, ISrsHttpMessage** ppmsg)
157 } 157 }
158 158
159 ISrsHttpMessage* msg = NULL; 159 ISrsHttpMessage* msg = NULL;
160 - if ((ret = parser->parse_message(skt, NULL, &msg)) != ERROR_SUCCESS) { 160 + if ((ret = parser->parse_message(transport, NULL, &msg)) != ERROR_SUCCESS) {
161 srs_error("parse http post response failed. ret=%d", ret); 161 srs_error("parse http post response failed. ret=%d", ret);
162 return ret; 162 return ret;
163 } 163 }
@@ -171,37 +171,30 @@ int SrsHttpClient::get(string path, std::string req, ISrsHttpMessage** ppmsg) @@ -171,37 +171,30 @@ int SrsHttpClient::get(string path, std::string req, ISrsHttpMessage** ppmsg)
171 171
172 void SrsHttpClient::disconnect() 172 void SrsHttpClient::disconnect()
173 { 173 {
174 - connected = false;  
175 -  
176 - srs_close_stfd(stfd);  
177 - srs_freep(skt); 174 + transport->close();
178 } 175 }
179 176
180 int SrsHttpClient::connect() 177 int SrsHttpClient::connect()
181 { 178 {
182 int ret = ERROR_SUCCESS; 179 int ret = ERROR_SUCCESS;
183 180
184 - if (connected) { 181 + if (transport->connected()) {
185 return ret; 182 return ret;
186 } 183 }
187 184
188 disconnect(); 185 disconnect();
189 186
190 // open socket. 187 // open socket.
191 - if ((ret = srs_socket_connect(host, port, timeout_us, &stfd)) != ERROR_SUCCESS) { 188 + if ((ret = transport->connect(host, port, timeout_us)) != ERROR_SUCCESS) {
192 srs_warn("http client failed, server=%s, port=%d, timeout=%"PRId64", ret=%d", 189 srs_warn("http client failed, server=%s, port=%d, timeout=%"PRId64", ret=%d",
193 host.c_str(), port, timeout_us, ret); 190 host.c_str(), port, timeout_us, ret);
194 return ret; 191 return ret;
195 } 192 }
196 srs_info("connect to server success. server=%s, port=%d", host.c_str(), port); 193 srs_info("connect to server success. server=%s, port=%d", host.c_str(), port);
197 194
198 - srs_assert(!skt);  
199 - skt = new SrsStSocket(stfd);  
200 - connected = true;  
201 -  
202 // set the recv/send timeout in us. 195 // set the recv/send timeout in us.
203 - skt->set_recv_timeout(timeout_us);  
204 - skt->set_send_timeout(timeout_us); 196 + transport->set_recv_timeout(timeout_us);
  197 + transport->set_send_timeout(timeout_us);
205 198
206 return ret; 199 return ret;
207 } 200 }
@@ -49,9 +49,7 @@ class SrsStSocket; @@ -49,9 +49,7 @@ class SrsStSocket;
49 class SrsHttpClient 49 class SrsHttpClient
50 { 50 {
51 private: 51 private:
52 - bool connected;  
53 - st_netfd_t stfd;  
54 - SrsStSocket* skt; 52 + SrsTcpClient* transport;
55 SrsHttpParser* parser; 53 SrsHttpParser* parser;
56 private: 54 private:
57 int64_t timeout_us; 55 int64_t timeout_us;
@@ -303,7 +303,7 @@ int SrsHttpResponseWriter::send_header(char* data, int size) @@ -303,7 +303,7 @@ int SrsHttpResponseWriter::send_header(char* data, int size)
303 return skt->write((void*)buf.c_str(), buf.length(), NULL); 303 return skt->write((void*)buf.c_str(), buf.length(), NULL);
304 } 304 }
305 305
306 -SrsHttpResponseReader::SrsHttpResponseReader(SrsHttpMessage* msg, SrsStSocket* io) 306 +SrsHttpResponseReader::SrsHttpResponseReader(SrsHttpMessage* msg, ISrsProtocolReaderWriter* io)
307 { 307 {
308 skt = io; 308 skt = io;
309 owner = msg; 309 owner = msg;
@@ -494,7 +494,7 @@ int SrsHttpResponseReader::read_specified(char* data, int nb_data, int* nb_read) @@ -494,7 +494,7 @@ int SrsHttpResponseReader::read_specified(char* data, int nb_data, int* nb_read)
494 return ret; 494 return ret;
495 } 495 }
496 496
497 -SrsHttpMessage::SrsHttpMessage(SrsStSocket* io, SrsConnection* c) : ISrsHttpMessage() 497 +SrsHttpMessage::SrsHttpMessage(ISrsProtocolReaderWriter* io, SrsConnection* c) : ISrsHttpMessage()
498 { 498 {
499 conn = c; 499 conn = c;
500 chunked = false; 500 chunked = false;
@@ -870,7 +870,7 @@ int SrsHttpParser::initialize(enum http_parser_type type, bool allow_jsonp) @@ -870,7 +870,7 @@ int SrsHttpParser::initialize(enum http_parser_type type, bool allow_jsonp)
870 return ret; 870 return ret;
871 } 871 }
872 872
873 -int SrsHttpParser::parse_message(SrsStSocket* skt, SrsConnection* conn, ISrsHttpMessage** ppmsg) 873 +int SrsHttpParser::parse_message(ISrsProtocolReaderWriter* io, SrsConnection* conn, ISrsHttpMessage** ppmsg)
874 { 874 {
875 *ppmsg = NULL; 875 *ppmsg = NULL;
876 876
@@ -887,7 +887,7 @@ int SrsHttpParser::parse_message(SrsStSocket* skt, SrsConnection* conn, ISrsHttp @@ -887,7 +887,7 @@ int SrsHttpParser::parse_message(SrsStSocket* skt, SrsConnection* conn, ISrsHttp
887 header_parsed = 0; 887 header_parsed = 0;
888 888
889 // do parse 889 // do parse
890 - if ((ret = parse_message_imp(skt)) != ERROR_SUCCESS) { 890 + if ((ret = parse_message_imp(io)) != ERROR_SUCCESS) {
891 if (!srs_is_client_gracefully_close(ret)) { 891 if (!srs_is_client_gracefully_close(ret)) {
892 srs_error("parse http msg failed. ret=%d", ret); 892 srs_error("parse http msg failed. ret=%d", ret);
893 } 893 }
@@ -895,7 +895,7 @@ int SrsHttpParser::parse_message(SrsStSocket* skt, SrsConnection* conn, ISrsHttp @@ -895,7 +895,7 @@ int SrsHttpParser::parse_message(SrsStSocket* skt, SrsConnection* conn, ISrsHttp
895 } 895 }
896 896
897 // create msg 897 // create msg
898 - SrsHttpMessage* msg = new SrsHttpMessage(skt, conn); 898 + SrsHttpMessage* msg = new SrsHttpMessage(io, conn);
899 899
900 // initalize http msg, parse url. 900 // initalize http msg, parse url.
901 if ((ret = msg->update(url, jsonp, &header, buffer, headers)) != ERROR_SUCCESS) { 901 if ((ret = msg->update(url, jsonp, &header, buffer, headers)) != ERROR_SUCCESS) {
@@ -910,7 +910,7 @@ int SrsHttpParser::parse_message(SrsStSocket* skt, SrsConnection* conn, ISrsHttp @@ -910,7 +910,7 @@ int SrsHttpParser::parse_message(SrsStSocket* skt, SrsConnection* conn, ISrsHttp
910 return ret; 910 return ret;
911 } 911 }
912 912
913 -int SrsHttpParser::parse_message_imp(SrsStSocket* skt) 913 +int SrsHttpParser::parse_message_imp(ISrsProtocolReaderWriter* io)
914 { 914 {
915 int ret = ERROR_SUCCESS; 915 int ret = ERROR_SUCCESS;
916 916
@@ -944,7 +944,7 @@ int SrsHttpParser::parse_message_imp(SrsStSocket* skt) @@ -944,7 +944,7 @@ int SrsHttpParser::parse_message_imp(SrsStSocket* skt)
944 // when nothing parsed, read more to parse. 944 // when nothing parsed, read more to parse.
945 if (nparsed == 0) { 945 if (nparsed == 0) {
946 // when requires more, only grow 1bytes, but the buffer will cache more. 946 // when requires more, only grow 1bytes, but the buffer will cache more.
947 - if ((ret = buffer->grow(skt, buffer->size() + 1)) != ERROR_SUCCESS) { 947 + if ((ret = buffer->grow(io, buffer->size() + 1)) != ERROR_SUCCESS) {
948 if (!srs_is_client_gracefully_close(ret)) { 948 if (!srs_is_client_gracefully_close(ret)) {
949 srs_error("read body from server failed. ret=%d", ret); 949 srs_error("read body from server failed. ret=%d", ret);
950 } 950 }
@@ -120,7 +120,7 @@ public: @@ -120,7 +120,7 @@ public:
120 class SrsHttpResponseReader : virtual public ISrsHttpResponseReader 120 class SrsHttpResponseReader : virtual public ISrsHttpResponseReader
121 { 121 {
122 private: 122 private:
123 - SrsStSocket* skt; 123 + ISrsProtocolReaderWriter* skt;
124 SrsHttpMessage* owner; 124 SrsHttpMessage* owner;
125 SrsFastStream* buffer; 125 SrsFastStream* buffer;
126 bool is_eof; 126 bool is_eof;
@@ -131,7 +131,7 @@ private: @@ -131,7 +131,7 @@ private:
131 // already read total bytes. 131 // already read total bytes.
132 int64_t nb_total_read; 132 int64_t nb_total_read;
133 public: 133 public:
134 - SrsHttpResponseReader(SrsHttpMessage* msg, SrsStSocket* io); 134 + SrsHttpResponseReader(SrsHttpMessage* msg, ISrsProtocolReaderWriter* io);
135 virtual ~SrsHttpResponseReader(); 135 virtual ~SrsHttpResponseReader();
136 public: 136 public:
137 /** 137 /**
@@ -208,7 +208,7 @@ private: @@ -208,7 +208,7 @@ private:
208 // the method in QueryString will override the HTTP method. 208 // the method in QueryString will override the HTTP method.
209 std::string jsonp_method; 209 std::string jsonp_method;
210 public: 210 public:
211 - SrsHttpMessage(SrsStSocket* io, SrsConnection* c); 211 + SrsHttpMessage(ISrsProtocolReaderWriter* io, SrsConnection* c);
212 virtual ~SrsHttpMessage(); 212 virtual ~SrsHttpMessage();
213 public: 213 public:
214 /** 214 /**
@@ -332,12 +332,12 @@ public: @@ -332,12 +332,12 @@ public:
332 * or error and *ppmsg must be NULL. 332 * or error and *ppmsg must be NULL.
333 * @remark, if success, *ppmsg always NOT-NULL, *ppmsg always is_complete(). 333 * @remark, if success, *ppmsg always NOT-NULL, *ppmsg always is_complete().
334 */ 334 */
335 - virtual int parse_message(SrsStSocket* skt, SrsConnection* conn, ISrsHttpMessage** ppmsg); 335 + virtual int parse_message(ISrsProtocolReaderWriter* io, SrsConnection* conn, ISrsHttpMessage** ppmsg);
336 private: 336 private:
337 /** 337 /**
338 * parse the HTTP message to member field: msg. 338 * parse the HTTP message to member field: msg.
339 */ 339 */
340 - virtual int parse_message_imp(SrsStSocket* skt); 340 + virtual int parse_message_imp(ISrsProtocolReaderWriter* io);
341 private: 341 private:
342 static int on_message_begin(http_parser* parser); 342 static int on_message_begin(http_parser* parser);
343 static int on_headers_complete(http_parser* parser); 343 static int on_headers_complete(http_parser* parser);
@@ -132,9 +132,8 @@ SrsMpegtsOverUdp::SrsMpegtsOverUdp(SrsConfDirective* c) @@ -132,9 +132,8 @@ SrsMpegtsOverUdp::SrsMpegtsOverUdp(SrsConfDirective* c)
132 output = _srs_config->get_stream_caster_output(c); 132 output = _srs_config->get_stream_caster_output(c);
133 133
134 req = NULL; 134 req = NULL;
135 - io = NULL;  
136 client = NULL; 135 client = NULL;
137 - stfd = NULL; 136 + transport = new SrsTcpClient();
138 stream_id = 0; 137 stream_id = 0;
139 138
140 avc = new SrsRawH264Stream(); 139 avc = new SrsRawH264Stream();
@@ -150,6 +149,7 @@ SrsMpegtsOverUdp::~SrsMpegtsOverUdp() @@ -150,6 +149,7 @@ SrsMpegtsOverUdp::~SrsMpegtsOverUdp()
150 { 149 {
151 close(); 150 close();
152 151
  152 + srs_freep(transport);
153 srs_freep(buffer); 153 srs_freep(buffer);
154 srs_freep(stream); 154 srs_freep(stream);
155 srs_freep(context); 155 srs_freep(context);
@@ -345,8 +345,8 @@ int SrsMpegtsOverUdp::on_ts_video(SrsTsMessage* msg, SrsBuffer* avs) @@ -345,8 +345,8 @@ int SrsMpegtsOverUdp::on_ts_video(SrsTsMessage* msg, SrsBuffer* avs)
345 } 345 }
346 346
347 // ts tbn to flv tbn. 347 // ts tbn to flv tbn.
348 - u_int32_t dts = msg->dts / 90;  
349 - u_int32_t pts = msg->dts / 90; 348 + u_int32_t dts = (u_int32_t)(msg->dts / 90);
  349 + u_int32_t pts = (u_int32_t)(msg->dts / 90);
350 350
351 // send each frame. 351 // send each frame.
352 while (!avs->empty()) { 352 while (!avs->empty()) {
@@ -504,7 +504,7 @@ int SrsMpegtsOverUdp::on_ts_audio(SrsTsMessage* msg, SrsBuffer* avs) @@ -504,7 +504,7 @@ int SrsMpegtsOverUdp::on_ts_audio(SrsTsMessage* msg, SrsBuffer* avs)
504 } 504 }
505 505
506 // ts tbn to flv tbn. 506 // ts tbn to flv tbn.
507 - u_int32_t dts = msg->dts / 90; 507 + u_int32_t dts = (u_int32_t)(msg->dts / 90);
508 508
509 // send each frame. 509 // send each frame.
510 while (!avs->empty()) { 510 while (!avs->empty()) {
@@ -604,7 +604,7 @@ int SrsMpegtsOverUdp::connect() @@ -604,7 +604,7 @@ int SrsMpegtsOverUdp::connect()
604 604
605 // when ok, ignore. 605 // when ok, ignore.
606 // TODO: FIXME: should reconnect when disconnected. 606 // TODO: FIXME: should reconnect when disconnected.
607 - if (io || client) { 607 + if (transport->connected()) {
608 return ret; 608 return ret;
609 } 609 }
610 610
@@ -616,12 +616,13 @@ int SrsMpegtsOverUdp::connect() @@ -616,12 +616,13 @@ int SrsMpegtsOverUdp::connect()
616 } 616 }
617 617
618 // connect host. 618 // connect host.
619 - if ((ret = srs_socket_connect(req->host, req->port, ST_UTIME_NO_TIMEOUT, &stfd)) != ERROR_SUCCESS) { 619 + if ((ret = transport->connect(req->host, req->port, ST_UTIME_NO_TIMEOUT)) != ERROR_SUCCESS) {
620 srs_error("mpegts: connect server %s:%d failed. ret=%d", req->host.c_str(), req->port, ret); 620 srs_error("mpegts: connect server %s:%d failed. ret=%d", req->host.c_str(), req->port, ret);
621 return ret; 621 return ret;
622 } 622 }
623 - io = new SrsStSocket(stfd);  
624 - client = new SrsRtmpClient(io); 623 +
  624 + srs_freep(client);
  625 + client = new SrsRtmpClient(transport);
625 626
626 client->set_recv_timeout(SRS_CONSTS_RTMP_RECV_TIMEOUT_US); 627 client->set_recv_timeout(SRS_CONSTS_RTMP_RECV_TIMEOUT_US);
627 client->set_send_timeout(SRS_CONSTS_RTMP_SEND_TIMEOUT_US); 628 client->set_send_timeout(SRS_CONSTS_RTMP_SEND_TIMEOUT_US);
@@ -704,9 +705,9 @@ int SrsMpegtsOverUdp::connect_app(string ep_server, int ep_port) @@ -704,9 +705,9 @@ int SrsMpegtsOverUdp::connect_app(string ep_server, int ep_port)
704 void SrsMpegtsOverUdp::close() 705 void SrsMpegtsOverUdp::close()
705 { 706 {
706 srs_freep(client); 707 srs_freep(client);
707 - srs_freep(io);  
708 srs_freep(req); 708 srs_freep(req);
709 - srs_close_stfd(stfd); 709 +
  710 + transport->close();
710 } 711 }
711 712
712 #endif 713 #endif
@@ -86,8 +86,7 @@ private: @@ -86,8 +86,7 @@ private:
86 std::string output; 86 std::string output;
87 private: 87 private:
88 SrsRequest* req; 88 SrsRequest* req;
89 - st_netfd_t stfd;  
90 - SrsStSocket* io; 89 + SrsTcpClient* transport;
91 SrsRtmpClient* client; 90 SrsRtmpClient* client;
92 int stream_id; 91 int stream_id;
93 private: 92 private:
@@ -1229,11 +1229,13 @@ int SrsRtmpConn::check_edge_token_traverse_auth() @@ -1229,11 +1229,13 @@ int SrsRtmpConn::check_edge_token_traverse_auth()
1229 1229
1230 srs_assert(req); 1230 srs_assert(req);
1231 1231
1232 - st_netfd_t stsock = NULL; 1232 + SrsTcpClient* transport = new SrsTcpClient();
  1233 + SrsAutoFree(SrsTcpClient, transport);
  1234 +
1233 vector<string> args = _srs_config->get_vhost_edge_origin(req->vhost)->args; 1235 vector<string> args = _srs_config->get_vhost_edge_origin(req->vhost)->args;
1234 for (int i = 0; i < (int)args.size(); i++) { 1236 for (int i = 0; i < (int)args.size(); i++) {
1235 string hostport = args.at(i); 1237 string hostport = args.at(i);
1236 - if ((ret = connect_server(hostport, &stsock)) == ERROR_SUCCESS) { 1238 + if ((ret = connect_server(hostport, transport)) == ERROR_SUCCESS) {
1237 break; 1239 break;
1238 } 1240 }
1239 } 1241 }
@@ -1242,20 +1244,13 @@ int SrsRtmpConn::check_edge_token_traverse_auth() @@ -1242,20 +1244,13 @@ int SrsRtmpConn::check_edge_token_traverse_auth()
1242 return ret; 1244 return ret;
1243 } 1245 }
1244 1246
1245 - srs_assert(stsock);  
1246 - SrsStSocket* io = new SrsStSocket(stsock);  
1247 - SrsRtmpClient* client = new SrsRtmpClient(io);  
1248 -  
1249 - ret = do_token_traverse_auth(client); 1247 + SrsRtmpClient* client = new SrsRtmpClient(transport);
  1248 + SrsAutoFree(SrsRtmpClient, client);
1250 1249
1251 - srs_freep(client);  
1252 - srs_freep(io);  
1253 - srs_close_stfd(stsock);  
1254 -  
1255 - return ret; 1250 + return do_token_traverse_auth(client);
1256 } 1251 }
1257 1252
1258 -int SrsRtmpConn::connect_server(string hostport, st_netfd_t* pstsock) 1253 +int SrsRtmpConn::connect_server(string hostport, SrsTcpClient* transport)
1259 { 1254 {
1260 int ret = ERROR_SUCCESS; 1255 int ret = ERROR_SUCCESS;
1261 1256
@@ -1268,16 +1263,14 @@ int SrsRtmpConn::connect_server(string hostport, st_netfd_t* pstsock) @@ -1268,16 +1263,14 @@ int SrsRtmpConn::connect_server(string hostport, st_netfd_t* pstsock)
1268 srs_parse_hostport(hostport, server, port); 1263 srs_parse_hostport(hostport, server, port);
1269 1264
1270 // open socket. 1265 // open socket.
1271 - st_netfd_t stsock = NULL;  
1272 int64_t timeout = SRS_EDGE_TOKEN_TRAVERSE_TIMEOUT_US; 1266 int64_t timeout = SRS_EDGE_TOKEN_TRAVERSE_TIMEOUT_US;
1273 - if ((ret = srs_socket_connect(server, port, timeout, &stsock)) != ERROR_SUCCESS) { 1267 + if ((ret = transport->connect(server, port, timeout)) != ERROR_SUCCESS) {
1274 srs_warn("edge token traverse failed, tcUrl=%s to server=%s, port=%d, timeout=%"PRId64", ret=%d", 1268 srs_warn("edge token traverse failed, tcUrl=%s to server=%s, port=%d, timeout=%"PRId64", ret=%d",
1275 req->tcUrl.c_str(), server.c_str(), port, timeout, ret); 1269 req->tcUrl.c_str(), server.c_str(), port, timeout, ret);
1276 return ret; 1270 return ret;
1277 } 1271 }
1278 srs_info("edge token auth connected, url=%s/%s, server=%s:%d", req->tcUrl.c_str(), req->stream.c_str(), server.c_str(), port); 1272 srs_info("edge token auth connected, url=%s/%s, server=%s:%d", req->tcUrl.c_str(), req->stream.c_str(), server.c_str(), port);
1279 1273
1280 - *pstsock = stsock;  
1281 return ret; 1274 return ret;
1282 } 1275 }
1283 1276
@@ -134,7 +134,7 @@ private: @@ -134,7 +134,7 @@ private:
134 virtual void set_sock_options(); 134 virtual void set_sock_options();
135 private: 135 private:
136 virtual int check_edge_token_traverse_auth(); 136 virtual int check_edge_token_traverse_auth();
137 - virtual int connect_server(std::string hostport, st_netfd_t* pstsock); 137 + virtual int connect_server(std::string hostport, SrsTcpClient* transport);
138 virtual int do_token_traverse_auth(SrsRtmpClient* client); 138 virtual int do_token_traverse_auth(SrsRtmpClient* client);
139 /** 139 /**
140 * when the connection disconnect, call this method. 140 * when the connection disconnect, call this method.
@@ -195,8 +195,8 @@ SrsRtspConn::SrsRtspConn(SrsRtspCaster* c, st_netfd_t fd, std::string o) @@ -195,8 +195,8 @@ SrsRtspConn::SrsRtspConn(SrsRtspCaster* c, st_netfd_t fd, std::string o)
195 trd = new SrsOneCycleThread("rtsp", this); 195 trd = new SrsOneCycleThread("rtsp", this);
196 196
197 req = NULL; 197 req = NULL;
198 - io = NULL;  
199 client = NULL; 198 client = NULL;
  199 + transport = new SrsTcpClient();
200 stream_id = 0; 200 stream_id = 0;
201 vjitter = new SrsRtspJitter(); 201 vjitter = new SrsRtspJitter();
202 ajitter = new SrsRtspJitter(); 202 ajitter = new SrsRtspJitter();
@@ -219,7 +219,7 @@ SrsRtspConn::~SrsRtspConn() @@ -219,7 +219,7 @@ SrsRtspConn::~SrsRtspConn()
219 srs_freep(rtsp); 219 srs_freep(rtsp);
220 220
221 srs_freep(client); 221 srs_freep(client);
222 - srs_freep(io); 222 + srs_freep(transport);
223 srs_freep(req); 223 srs_freep(req);
224 224
225 srs_freep(vjitter); 225 srs_freep(vjitter);
@@ -254,7 +254,7 @@ int SrsRtspConn::do_cycle() @@ -254,7 +254,7 @@ int SrsRtspConn::do_cycle()
254 srs_info("rtsp: got rtsp request"); 254 srs_info("rtsp: got rtsp request");
255 255
256 if (req->is_options()) { 256 if (req->is_options()) {
257 - SrsRtspOptionsResponse* res = new SrsRtspOptionsResponse(req->seq); 257 + SrsRtspOptionsResponse* res = new SrsRtspOptionsResponse((int)req->seq);
258 res->session = session; 258 res->session = session;
259 if ((ret = rtsp->send_message(res)) != ERROR_SUCCESS) { 259 if ((ret = rtsp->send_message(res)) != ERROR_SUCCESS) {
260 if (!srs_is_client_gracefully_close(ret)) { 260 if (!srs_is_client_gracefully_close(ret)) {
@@ -288,7 +288,7 @@ int SrsRtspConn::do_cycle() @@ -288,7 +288,7 @@ int SrsRtspConn::do_cycle()
288 audio_sample_rate, audio_channel, rtsp_tcUrl.c_str(), rtsp_stream.c_str() 288 audio_sample_rate, audio_channel, rtsp_tcUrl.c_str(), rtsp_stream.c_str()
289 ); 289 );
290 290
291 - SrsRtspResponse* res = new SrsRtspResponse(req->seq); 291 + SrsRtspResponse* res = new SrsRtspResponse((int)req->seq);
292 res->session = session; 292 res->session = session;
293 if ((ret = rtsp->send_message(res)) != ERROR_SUCCESS) { 293 if ((ret = rtsp->send_message(res)) != ERROR_SUCCESS) {
294 if (!srs_is_client_gracefully_close(ret)) { 294 if (!srs_is_client_gracefully_close(ret)) {
@@ -328,7 +328,7 @@ int SrsRtspConn::do_cycle() @@ -328,7 +328,7 @@ int SrsRtspConn::do_cycle()
328 session = "O9EaZ4bf"; // TODO: FIXME: generate session id. 328 session = "O9EaZ4bf"; // TODO: FIXME: generate session id.
329 } 329 }
330 330
331 - SrsRtspSetupResponse* res = new SrsRtspSetupResponse(req->seq); 331 + SrsRtspSetupResponse* res = new SrsRtspSetupResponse((int)req->seq);
332 res->client_port_min = req->transport->client_port_min; 332 res->client_port_min = req->transport->client_port_min;
333 res->client_port_max = req->transport->client_port_max; 333 res->client_port_max = req->transport->client_port_max;
334 res->local_port_min = lpm; 334 res->local_port_min = lpm;
@@ -341,7 +341,7 @@ int SrsRtspConn::do_cycle() @@ -341,7 +341,7 @@ int SrsRtspConn::do_cycle()
341 return ret; 341 return ret;
342 } 342 }
343 } else if (req->is_record()) { 343 } else if (req->is_record()) {
344 - SrsRtspResponse* res = new SrsRtspResponse(req->seq); 344 + SrsRtspResponse* res = new SrsRtspResponse((int)req->seq);
345 res->session = session; 345 res->session = session;
346 if ((ret = rtsp->send_message(res)) != ERROR_SUCCESS) { 346 if ((ret = rtsp->send_message(res)) != ERROR_SUCCESS) {
347 if (!srs_is_client_gracefully_close(ret)) { 347 if (!srs_is_client_gracefully_close(ret)) {
@@ -434,7 +434,11 @@ int SrsRtspConn::on_rtp_video(SrsRtpPacket* pkt, int64_t dts, int64_t pts) @@ -434,7 +434,11 @@ int SrsRtspConn::on_rtp_video(SrsRtpPacket* pkt, int64_t dts, int64_t pts)
434 return ret; 434 return ret;
435 } 435 }
436 436
437 - if ((ret = write_h264_ipb_frame(pkt->payload->bytes(), pkt->payload->length(), dts / 90, pts / 90)) != ERROR_SUCCESS) { 437 + char* bytes = pkt->payload->bytes();
  438 + int length = pkt->payload->length();
  439 + u_int32_t fdts = (u_int32_t)(dts / 90);
  440 + u_int32_t fpts = (u_int32_t)(pts / 90);
  441 + if ((ret = write_h264_ipb_frame(bytes, length, fdts, fpts)) != ERROR_SUCCESS) {
438 return ret; 442 return ret;
439 } 443 }
440 444
@@ -476,7 +480,7 @@ int SrsRtspConn::kickoff_audio_cache(SrsRtpPacket* pkt, int64_t dts) @@ -476,7 +480,7 @@ int SrsRtspConn::kickoff_audio_cache(SrsRtpPacket* pkt, int64_t dts)
476 int nb_frame = acache->audio_samples->sample_units[i].size; 480 int nb_frame = acache->audio_samples->sample_units[i].size;
477 int64_t timestamp = (acache->dts + delta * i) / 90; 481 int64_t timestamp = (acache->dts + delta * i) / 90;
478 acodec->aac_packet_type = 1; 482 acodec->aac_packet_type = 1;
479 - if ((ret = write_audio_raw_frame(frame, nb_frame, acodec, timestamp)) != ERROR_SUCCESS) { 483 + if ((ret = write_audio_raw_frame(frame, nb_frame, acodec, (u_int32_t)timestamp)) != ERROR_SUCCESS) {
480 return ret; 484 return ret;
481 } 485 }
482 } 486 }
@@ -497,7 +501,7 @@ int SrsRtspConn::write_sequence_header() @@ -497,7 +501,7 @@ int SrsRtspConn::write_sequence_header()
497 int64_t dts = vjitter->timestamp() / 90; 501 int64_t dts = vjitter->timestamp() / 90;
498 502
499 // send video sps/pps 503 // send video sps/pps
500 - if ((ret = write_h264_sps_pps(dts, dts)) != ERROR_SUCCESS) { 504 + if ((ret = write_h264_sps_pps((u_int32_t)dts, (u_int32_t)dts)) != ERROR_SUCCESS) {
501 return ret; 505 return ret;
502 } 506 }
503 507
@@ -535,7 +539,7 @@ int SrsRtspConn::write_sequence_header() @@ -535,7 +539,7 @@ int SrsRtspConn::write_sequence_header()
535 break; 539 break;
536 }; 540 };
537 541
538 - if ((ret = write_audio_raw_frame((char*)sh.data(), (int)sh.length(), acodec, dts)) != ERROR_SUCCESS) { 542 + if ((ret = write_audio_raw_frame((char*)sh.data(), (int)sh.length(), acodec, (u_int32_t)dts)) != ERROR_SUCCESS) {
539 return ret; 543 return ret;
540 } 544 }
541 } 545 }
@@ -642,7 +646,8 @@ int SrsRtspConn::connect() @@ -642,7 +646,8 @@ int SrsRtspConn::connect()
642 int ret = ERROR_SUCCESS; 646 int ret = ERROR_SUCCESS;
643 647
644 // when ok, ignore. 648 // when ok, ignore.
645 - if (io || client) { 649 + // TODO: FIXME: support reconnect.
  650 + if (transport->connected()) {
646 return ret; 651 return ret;
647 } 652 }
648 653
@@ -663,12 +668,13 @@ int SrsRtspConn::connect() @@ -663,12 +668,13 @@ int SrsRtspConn::connect()
663 } 668 }
664 669
665 // connect host. 670 // connect host.
666 - if ((ret = srs_socket_connect(req->host, req->port, ST_UTIME_NO_TIMEOUT, &stfd)) != ERROR_SUCCESS) { 671 + if ((ret = transport->connect(req->host, req->port, ST_UTIME_NO_TIMEOUT)) != ERROR_SUCCESS) {
667 srs_error("rtsp: connect server %s:%d failed. ret=%d", req->host.c_str(), req->port, ret); 672 srs_error("rtsp: connect server %s:%d failed. ret=%d", req->host.c_str(), req->port, ret);
668 return ret; 673 return ret;
669 } 674 }
670 - io = new SrsStSocket(stfd);  
671 - client = new SrsRtmpClient(io); 675 +
  676 + srs_freep(client);
  677 + client = new SrsRtmpClient(transport);
672 678
673 client->set_recv_timeout(SRS_CONSTS_RTMP_RECV_TIMEOUT_US); 679 client->set_recv_timeout(SRS_CONSTS_RTMP_RECV_TIMEOUT_US);
674 client->set_send_timeout(SRS_CONSTS_RTMP_SEND_TIMEOUT_US); 680 client->set_send_timeout(SRS_CONSTS_RTMP_SEND_TIMEOUT_US);
@@ -139,7 +139,7 @@ private: @@ -139,7 +139,7 @@ private:
139 SrsOneCycleThread* trd; 139 SrsOneCycleThread* trd;
140 private: 140 private:
141 SrsRequest* req; 141 SrsRequest* req;
142 - SrsStSocket* io; 142 + SrsTcpClient* transport;
143 SrsRtmpClient* client; 143 SrsRtmpClient* client;
144 SrsRtspJitter* vjitter; 144 SrsRtspJitter* vjitter;
145 SrsRtspJitter* ajitter; 145 SrsRtspJitter* ajitter;
@@ -637,8 +637,7 @@ private: @@ -637,8 +637,7 @@ private:
637 int64_t raw_aac_dts; 637 int64_t raw_aac_dts;
638 private: 638 private:
639 SrsRequest* req; 639 SrsRequest* req;
640 - st_netfd_t stfd;  
641 - SrsStSocket* io; 640 + SrsTcpClient* transport;
642 SrsRtmpClient* client; 641 SrsRtmpClient* client;
643 int stream_id; 642 int stream_id;
644 private: 643 private:
@@ -658,9 +657,8 @@ public: @@ -658,9 +657,8 @@ public:
658 raw_aac_dts = srs_update_system_time_ms(); 657 raw_aac_dts = srs_update_system_time_ms();
659 658
660 req = NULL; 659 req = NULL;
661 - io = NULL;  
662 client = NULL; 660 client = NULL;
663 - stfd = NULL; 661 + transport = new SrsTcpClient();
664 stream_id = 0; 662 stream_id = 0;
665 663
666 avc = new SrsRawH264Stream(); 664 avc = new SrsRawH264Stream();
@@ -672,6 +670,7 @@ public: @@ -672,6 +670,7 @@ public:
672 virtual ~SrsIngestSrsOutput() { 670 virtual ~SrsIngestSrsOutput() {
673 close(); 671 close();
674 672
  673 + srs_freep(transport);
675 srs_freep(avc); 674 srs_freep(avc);
676 srs_freep(aac); 675 srs_freep(aac);
677 676
@@ -1211,7 +1210,7 @@ int SrsIngestSrsOutput::connect() @@ -1211,7 +1210,7 @@ int SrsIngestSrsOutput::connect()
1211 1210
1212 // when ok, ignore. 1211 // when ok, ignore.
1213 // TODO: FIXME: should reconnect when disconnected. 1212 // TODO: FIXME: should reconnect when disconnected.
1214 - if (io || client) { 1213 + if (transport->connected()) {
1215 return ret; 1214 return ret;
1216 } 1215 }
1217 1216
@@ -1235,12 +1234,13 @@ int SrsIngestSrsOutput::connect() @@ -1235,12 +1234,13 @@ int SrsIngestSrsOutput::connect()
1235 } 1234 }
1236 1235
1237 // connect host. 1236 // connect host.
1238 - if ((ret = srs_socket_connect(req->host, req->port, ST_UTIME_NO_TIMEOUT, &stfd)) != ERROR_SUCCESS) { 1237 + if ((ret = transport->connect(req->host, req->port, ST_UTIME_NO_TIMEOUT)) != ERROR_SUCCESS) {
1239 srs_error("mpegts: connect server %s:%d failed. ret=%d", req->host.c_str(), req->port, ret); 1238 srs_error("mpegts: connect server %s:%d failed. ret=%d", req->host.c_str(), req->port, ret);
1240 return ret; 1239 return ret;
1241 } 1240 }
1242 - io = new SrsStSocket(stfd);  
1243 - client = new SrsRtmpClient(io); 1241 +
  1242 + srs_freep(client);
  1243 + client = new SrsRtmpClient(transport);
1244 1244
1245 client->set_recv_timeout(SRS_CONSTS_RTMP_RECV_TIMEOUT_US); 1245 client->set_recv_timeout(SRS_CONSTS_RTMP_RECV_TIMEOUT_US);
1246 client->set_send_timeout(SRS_CONSTS_RTMP_SEND_TIMEOUT_US); 1246 client->set_send_timeout(SRS_CONSTS_RTMP_SEND_TIMEOUT_US);
@@ -1326,9 +1326,9 @@ void SrsIngestSrsOutput::close() @@ -1326,9 +1326,9 @@ void SrsIngestSrsOutput::close()
1326 h264_sps_pps_sent = false; 1326 h264_sps_pps_sent = false;
1327 1327
1328 srs_freep(client); 1328 srs_freep(client);
1329 - srs_freep(io);  
1330 srs_freep(req); 1329 srs_freep(req);
1331 - srs_close_stfd(stfd); 1330 +
  1331 + transport->close();
1332 } 1332 }
1333 1333
1334 // the context for ingest hls stream. 1334 // the context for ingest hls stream.