diff --git a/trunk/configure b/trunk/configure index cd76eb2db..ec2872b0b 100755 --- a/trunk/configure +++ b/trunk/configure @@ -84,7 +84,8 @@ MODULE_DEPENDS=() ModuleLibIncs=(${LibSTRoot}) MODULE_FILES=("srs_core" "srs_core_log" "srs_core_server" "srs_core_error" "srs_core_conn" "srs_core_client" - "srs_core_rtmp" "srs_core_socket" "srs_core_buffer") + "srs_core_rtmp" "srs_core_socket" "srs_core_buffer" + "srs_core_auto_free") MODULE_DIR="src/core" . auto/modules.sh CORE_OBJS="${MODULE_OBJS[@]}" diff --git a/trunk/src/core/srs_core_auto_free.cpp b/trunk/src/core/srs_core_auto_free.cpp new file mode 100755 index 000000000..6e2b42276 --- /dev/null +++ b/trunk/src/core/srs_core_auto_free.cpp @@ -0,0 +1,24 @@ +/* +The MIT License (MIT) + +Copyright (c) 2013 winlin + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#include diff --git a/trunk/src/core/srs_core_auto_free.hpp b/trunk/src/core/srs_core_auto_free.hpp new file mode 100755 index 000000000..e11f83c6b --- /dev/null +++ b/trunk/src/core/srs_core_auto_free.hpp @@ -0,0 +1,73 @@ +/* +The MIT License (MIT) + +Copyright (c) 2013 winlin + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#ifndef SRS_CORE_AUTO_FREE_HPP +#define SRS_CORE_AUTO_FREE_HPP + +/* +#include +*/ + +#include + +#include + +/** +* auto free the instance in the current scope. +*/ +#define SrsAutoFree(className, instance, is_array) \ + c__SrsAutoFree _auto_free_##instance(&instance, is_array) + +template +class c__SrsAutoFree +{ +private: + T** ptr; + bool is_array; +public: + /** + * auto delete the ptr. + * @is_array a bool value indicates whether the ptr is a array. + */ + c__SrsAutoFree(T** _ptr, bool _is_array){ + ptr = _ptr; + is_array = _is_array; + } + + virtual ~c__SrsAutoFree(){ + if (ptr == NULL || *ptr == NULL) { + return; + } + + if (is_array) { + delete[] *ptr; + } else { + delete *ptr; + } + + *ptr = NULL; + } +}; + + +#endif \ No newline at end of file diff --git a/trunk/src/core/srs_core_client.cpp b/trunk/src/core/srs_core_client.cpp index e319975f3..4efa04848 100755 --- a/trunk/src/core/srs_core_client.cpp +++ b/trunk/src/core/srs_core_client.cpp @@ -54,13 +54,13 @@ int SrsClient::do_cycle() int ret = ERROR_SUCCESS; if ((ret = get_peer_ip()) != ERROR_SUCCESS) { - srs_error("get peer ip failed. ret=%d", ret); + srs_warn("get peer ip failed. ret=%d", ret); return ret; } srs_verbose("get peer ip success. ip=%s", ip); if ((ret = rtmp->handshake()) != ERROR_SUCCESS) { - srs_error("rtmp handshake failed. ret=%d", ret); + srs_warn("rtmp handshake failed. ret=%d", ret); return ret; } srs_verbose("rtmp handshake success"); diff --git a/trunk/src/core/srs_core_conn.cpp b/trunk/src/core/srs_core_conn.cpp index 1a2e04acd..ba0e4d3f4 100755 --- a/trunk/src/core/srs_core_conn.cpp +++ b/trunk/src/core/srs_core_conn.cpp @@ -61,6 +61,11 @@ void SrsConnection::cycle() log_context->generate_id(); ret = do_cycle(); + + // if socket io error, set to closed. + if (ret == ERROR_SOCKET_READ || ret == ERROR_SOCKET_READ_FULLY || ret == ERROR_SOCKET_WRITE) { + ret = ERROR_SOCKET_CLOSED; + } // success. if (ret == ERROR_SUCCESS) { diff --git a/trunk/src/core/srs_core_error.hpp b/trunk/src/core/srs_core_error.hpp index 951acb985..115eb7d24 100755 --- a/trunk/src/core/srs_core_error.hpp +++ b/trunk/src/core/srs_core_error.hpp @@ -49,4 +49,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define ERROR_SOCKET_READ_FULLY 208 #define ERROR_SOCKET_WRITE 209 +#define ERROR_RTMP_PLAIN_REQUIRED 300 + #endif \ No newline at end of file diff --git a/trunk/src/core/srs_core_rtmp.cpp b/trunk/src/core/srs_core_rtmp.cpp index f8f0bf48a..f575d8797 100755 --- a/trunk/src/core/srs_core_rtmp.cpp +++ b/trunk/src/core/srs_core_rtmp.cpp @@ -25,8 +25,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include #include -#include #include +#include +#include SrsRtmp::SrsRtmp(st_netfd_t client_stfd) { @@ -44,14 +45,19 @@ int SrsRtmp::handshake() ssize_t nsize; Socket skt(stfd); - char buf[1537]; - buf[0] = 0x03; // plain text. - - char* c0c1 = buf; + char* c0c1 = new char[1537]; + SrsAutoFree(char, c0c1, true); if ((ret = skt.read_fully(c0c1, 1537, &nsize)) != ERROR_SUCCESS) { - srs_error("read c0c1 failed. ret=%d", ret); + srs_warn("read c0c1 failed. ret=%d", ret); return ret; } + + // plain text required. + if (c0c1[0] != 0x03) { + ret = ERROR_RTMP_PLAIN_REQUIRED; + srs_warn("only support rtmp plain text. ret=%d", ret); + return ret; + } return ret; } diff --git a/trunk/src/srs/srs.upp b/trunk/src/srs/srs.upp index 75b4f1b36..8ee01992e 100755 --- a/trunk/src/srs/srs.upp +++ b/trunk/src/srs/srs.upp @@ -6,6 +6,8 @@ file ..\core\srs_core.cpp, ..\core\srs_core_error.hpp, ..\core\srs_core_error.cpp, + ..\core\srs_core_auto_free.hpp, + ..\core\srs_core_auto_free.cpp, ..\core\srs_core_server.hpp, ..\core\srs_core_server.cpp, ..\core\srs_core_conn.hpp,