diff --git a/CHANGELOG.md b/CHANGELOG.md index c2b06c0..1ef32d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # history +* Revision 601 + * [changed] test/udpserver2 (udp server on network_server, epoll/iocp) + * [changed] server_socket (recvfrom, sendto) + * Revision 600 * [changed] test/udpserver2 (udp server on network_server, epoll) * [changed] rename tostring, tobin to bin2str, strtobin diff --git a/make.sh b/make.sh index 4bf141d..c130063 100755 --- a/make.sh +++ b/make.sh @@ -73,7 +73,7 @@ if [ ${#args[@]} -ne 0 ]; then elif [ $arg = 'format' ]; then do_clangformat=1 elif [ $arg = 'leaks' ]; then - CXXFLAGS="${CXXFLAGS} -fsanitize=address" + CXXFLAGS="${CXXFLAGS} -fsanitize=leak" elif [ $arg = 'odbc' ]; then export SUPPORT_ODBC=1 elif [ $arg = 'opt' ]; then diff --git a/sdk/net/basic/server_socket.hpp b/sdk/net/basic/server_socket.hpp index 70b7838..b868ee4 100644 --- a/sdk/net/basic/server_socket.hpp +++ b/sdk/net/basic/server_socket.hpp @@ -91,14 +91,26 @@ class server_socket { * @param char* ptr_data [OUT] * @param size_t size_data [IN] * @param size_t* cbread [OUT] - * @param struct sockaddr* addr [outopt] - * @param socklen_t* addrlen [inopt] * @return error code (see error.hpp) * @remarks * ERROR_CONNECTION_CLOSED */ - virtual return_t read(socket_t sock, tls_context_t* tls_handle, int mode, char* ptr_data, size_t size_data, size_t* cbread, struct sockaddr* addr = nullptr, - socklen_t* addrlen = nullptr) { + virtual return_t read(socket_t sock, tls_context_t* tls_handle, int mode, char* ptr_data, size_t size_data, size_t* cbread) { return errorcode_t::success; } + /** + * @brief recvfrom + * @param socket_t sock [IN] + * @param tls_context_t* tls_handle [IN] nullptr + * @param int mode [IN] ignore, it defines operation mode. see also transport_layer_security_server. + * @param char* ptr_data [OUT] + * @param size_t size_data [IN] + * @param size_t* cbread [OUT] + * @param struct sockaddr* addr [out] + * @param socklen_t* addrlen [in] + * @return error code (see error.hpp) + * @remarks + */ + virtual return_t recvfrom(socket_t sock, tls_context_t* tls_handle, int mode, char* ptr_data, size_t size_data, size_t* cbread, struct sockaddr* addr, + socklen_t* addrlen) { return errorcode_t::success; } /** @@ -111,6 +123,21 @@ class server_socket { * @return error code (see error.hpp) */ virtual return_t send(socket_t sock, tls_context_t* tls_handle, const char* ptr_data, size_t size_data, size_t* cbsent) { return errorcode_t::success; } + /** + * @brief send + * @param socket_t sock [IN] + * @param tls_context_t* tls_handle [IN] + * @param const char* ptr_data [IN] + * @param size_t size_data [IN] + * @param size_t* cbsent [OUT] + * @param const struct sockaddr* addr [in] + * @param socklen_t addrlen [in] + * @return error code (see error.hpp) + */ + virtual return_t sendto(socket_t sock, tls_context_t* tls_handle, const char* ptr_data, size_t size_data, size_t* cbsent, const struct sockaddr* addr, + socklen_t addrlen) { + return errorcode_t::success; + } virtual bool support_tls() { return false; } virtual int socket_type() { return 0; } /* override */ diff --git a/sdk/net/basic/tcp_server_socket.cpp b/sdk/net/basic/tcp_server_socket.cpp index 8a54dad..acd1a11 100644 --- a/sdk/net/basic/tcp_server_socket.cpp +++ b/sdk/net/basic/tcp_server_socket.cpp @@ -64,8 +64,7 @@ return_t tcp_server_socket::accept(socket_t sock, socket_t* clisock, struct sock return ret; } -return_t tcp_server_socket::read(socket_t sock, tls_context_t* tls_handle, int mode, char* ptr_data, size_t size_data, size_t* cbread, struct sockaddr* addr, - socklen_t* addrlen) { +return_t tcp_server_socket::read(socket_t sock, tls_context_t* tls_handle, int mode, char* ptr_data, size_t size_data, size_t* cbread) { return_t ret = errorcode_t::success; __try2 { diff --git a/sdk/net/basic/tcp_server_socket.hpp b/sdk/net/basic/tcp_server_socket.hpp index a71f74a..6e6621d 100644 --- a/sdk/net/basic/tcp_server_socket.hpp +++ b/sdk/net/basic/tcp_server_socket.hpp @@ -50,14 +50,11 @@ class tcp_server_socket : public server_socket { * @param char* ptr_data [OUT] * @param size_t size_data [IN] * @param size_t* cbread [OUT] - * @param struct sockaddr* addr [outopt] - * @param socklen_t* addrlen [inopt] - * @return error code (see error.hpp) + * @param struct sockaddr* addr [out] * @remarks * ERROR_CONNECTION_CLOSED */ - virtual return_t read(socket_t sock, tls_context_t* tls_handle, int mode, char* ptr_data, size_t size_data, size_t* cbread, struct sockaddr* addr = nullptr, - socklen_t* addrlen = nullptr); + virtual return_t read(socket_t sock, tls_context_t* tls_handle, int mode, char* ptr_data, size_t size_data, size_t* cbread); /** * @brief send * @param socket_t sock [IN] diff --git a/sdk/net/basic/udp_server_socket.cpp b/sdk/net/basic/udp_server_socket.cpp index 93e9069..ce092a1 100644 --- a/sdk/net/basic/udp_server_socket.cpp +++ b/sdk/net/basic/udp_server_socket.cpp @@ -51,8 +51,8 @@ return_t udp_server_socket::close(socket_t sock, tls_context_t* tls_handle) { return ret; } -return_t udp_server_socket::read(socket_t sock, tls_context_t* tls_handle, int mode, char* ptr_data, size_t size_data, size_t* size_read, struct sockaddr* addr, - socklen_t* addrlen) { +return_t udp_server_socket::recvfrom(socket_t sock, tls_context_t* tls_handle, int mode, char* ptr_data, size_t size_data, size_t* size_read, + struct sockaddr* addr, socklen_t* addrlen) { return_t ret = errorcode_t::success; __try2 { #if 0 @@ -64,9 +64,9 @@ return_t udp_server_socket::read(socket_t sock, tls_context_t* tls_handle, int m #endif #if defined __linux__ - int ret_recv = recvfrom(sock, ptr_data, size_data, 0, addr, addrlen); + int ret_recv = ::recvfrom(sock, ptr_data, size_data, 0, addr, addrlen); #elif defined _WIN32 || defined _WIN64 - int ret_recv = recvfrom(sock, ptr_data, (int)size_data, 0, addr, addrlen); + int ret_recv = ::recvfrom(sock, ptr_data, (int)size_data, 0, addr, addrlen); #endif if (-1 == ret_recv) { ret = get_lasterror(ret_recv); @@ -87,8 +87,8 @@ return_t udp_server_socket::read(socket_t sock, tls_context_t* tls_handle, int m return ret; } -return_t udp_server_socket::send(socket_t sock, tls_context_t* tls_handle, const struct sockaddr* addr, socklen_t addrlen, const char* ptr_data, - size_t size_data, size_t* cbsent) { +return_t udp_server_socket::sendto(socket_t sock, tls_context_t* tls_handle, const char* ptr_data, size_t size_data, size_t* cbsent, + const struct sockaddr* addr, socklen_t addrlen) { return_t ret = errorcode_t::success; __try2 { #if defined __linux__ diff --git a/sdk/net/basic/udp_server_socket.hpp b/sdk/net/basic/udp_server_socket.hpp index 8f9151c..11789a3 100644 --- a/sdk/net/basic/udp_server_socket.hpp +++ b/sdk/net/basic/udp_server_socket.hpp @@ -55,27 +55,27 @@ class udp_server_socket : public server_socket { * @param char* ptr_data [OUT] * @param size_t size_data [IN] * @param size_t* cbread [OUT] - * @param struct sockaddr* addr [in] + * @param struct sockaddr* addr [out] * @param socklen_t* addrlen [in] * @return error code (see error.hpp) * @remarks * ERROR_CONNECTION_CLOSED */ - virtual return_t read(socket_t sock, tls_context_t* tls_handle, int mode, char* ptr_data, size_t size_data, size_t* cbread, struct sockaddr* addr, - socklen_t* addrlen); + virtual return_t recvfrom(socket_t sock, tls_context_t* tls_handle, int mode, char* ptr_data, size_t size_data, size_t* cbread, struct sockaddr* addr, + socklen_t* addrlen); /** * @brief send * @param socket_t sock [IN] * @param tls_context_t* tls_handle [IN] - * @param const struct sockaddr* addr [in] - * @param socklen_t* addrlen [in] * @param const char* ptr_data [IN] * @param size_t size_data [IN] * @param size_t* cbsent [OUT] + * @param const struct sockaddr* addr [in] + * @param socklen_t addrlen [in] * @return error code (see error.hpp) */ - virtual return_t send(socket_t sock, tls_context_t* tls_handle, const struct sockaddr* addr, socklen_t addrlen, const char* ptr_data, size_t size_data, - size_t* cbsent); + virtual return_t sendto(socket_t sock, tls_context_t* tls_handle, const char* ptr_data, size_t size_data, size_t* cbsent, const struct sockaddr* addr, + socklen_t addrlen); virtual int socket_type(); }; diff --git a/sdk/net/server/network_server.cpp b/sdk/net/server/network_server.cpp index 18c0daa..b4be466 100644 --- a/sdk/net/server/network_server.cpp +++ b/sdk/net/server/network_server.cpp @@ -706,14 +706,6 @@ return_t network_server::tls_accept_routine(network_multiplexer_context_t* handl return_t test = errorcode_t::success; - // if (is_dgram) { - // test = svr_socket->dtls_listen(listen_sock, (sockaddr*)&accpt_ctx.client_addr, sizeof(accpt_ctx.client_addr), &tls_handle); - // if (errorcode_t::success == test) { - // svr.try_connect(handle, listen_sock, &accpt_ctx.client_addr); - // svr.session_accepted(handle, tls_handle, (handle_t)listen_sock, &accpt_ctx.client_addr); - // } - // } - test = svr_socket->tls_accept(accpt_ctx.cli_socket, &tls_handle); if (errorcode_t::success == test) { svr.session_accepted(handle, tls_handle, (handle_t)accpt_ctx.cli_socket, &accpt_ctx.client_addr); diff --git a/sdk/net/server/network_session.cpp b/sdk/net/server/network_session.cpp index d3ef710..b31f512 100644 --- a/sdk/net/server/network_session.cpp +++ b/sdk/net/server/network_session.cpp @@ -75,6 +75,26 @@ return_t network_session::send(const char* data_ptr, size_t size_data) { return_t network_session::send(const byte_t* data_ptr, size_t size_data) { return send((char*)data_ptr, size_data); } +return_t network_session::sendto(const char* data_ptr, size_t size_data, sockaddr_storage_t* addr) { + return_t ret = errorcode_t::success; + + __try2 { + if (nullptr == data_ptr) { + ret = errorcode_t::invalid_parameter; + __leave2; + } + size_t cbsent = 0; + ret = get_server_socket()->sendto((socket_t)_session.netsock.event_socket, _session.tls_handle, data_ptr, size_data, &cbsent, (sockaddr*)addr, + sizeof(sockaddr_storage_t)); + } + __finally2 { + // do nothing + } + return ret; +} + +return_t network_session::sendto(const byte_t* data_ptr, size_t size_data, sockaddr_storage_t* addr) { return sendto((char*)data_ptr, size_data, addr); } + net_session_socket_t* network_session::socket_info() { return &_session.netsock; } #if defined _WIN32 || defined _WIN64 @@ -94,6 +114,9 @@ int network_session::addref() { return _shared.addref(); } int network_session::release() { return _shared.delref(); } return_t network_session::produce(t_mlfq* q, byte_t* buf_read, size_t size_buf_read, const sockaddr_storage_t* addr) { + // const sockaddr_storage_t* addr + // (epoll) nullptr + // (iocp) valid return_t ret = errorcode_t::success; critical_section_guard guard(_lock); @@ -111,7 +134,40 @@ return_t network_session::produce(t_mlfq* q, byte_t* buf_read, buf_read = (byte_t*)_session.buffer; #endif - // int socktype = get_server_socket()->socket_type(); + int socktype = get_server_socket()->socket_type(); + bool is_stream = (SOCK_STREAM == socktype); + if (is_stream) { + ret = produce_stream(q, buf_read, size_buf_read, addr); + } else { + ret = produce_dgram(q, buf_read, size_buf_read, addr); + } + } + __finally2 { + // do nothing + } + return ret; +} + +return_t network_session::produce_stream(t_mlfq* q, byte_t* buf_read, size_t size_buf_read, const sockaddr_storage_t* addr) { + // const sockaddr_storage_t* addr + // (epoll) nullptr + // (iocp) valid + return_t ret = errorcode_t::success; + critical_section_guard guard(_lock); + + __try2 { + if (nullptr == q) { + ret = errorcode_t::invalid_parameter; + __leave2; + } + +#if defined _WIN32 || defined _WIN64 + // buf_read, size_buf_read transmitted +#elif defined __linux__ + // read + size_buf_read = RTL_NUMBER_OF(_session.buffer); + buf_read = (byte_t*)_session.buffer; +#endif return_t result = errorcode_t::success; @@ -132,6 +188,110 @@ return_t network_session::produce(t_mlfq* q, byte_t* buf_read, while (true) { result = get_server_socket()->read((socket_t)_session.netsock.event_socket, _session.tls_handle, tls_io_flag_t::read_ssl_read, (char*)buf_read, size_buf_read, &cbread); /*SSL_read */ + if (errorcode_t::success == result || errorcode_t::more_data == result) { + getstream()->produce(buf_read, cbread); + + data_ready = true; + + if (_df) { + basic_stream bs; + datetime dt; + datetime_t t; + dt.getlocaltime(&t); + + bs.printf("%04d-%02d-%02d %02d:%02d:%02d.%03d ", t.year, t.month, t.day, t.hour, t.minute, t.second, t.milliseconds); + bs << "[ns] read " << (socket_t)_session.netsock.event_socket << "\n"; + dump_memory(buf_read, cbread, &bs, 16, 2, 0, dump_notrunc); + bs << "\n"; + _df(&bs); + } + + } else { + break; + } + } + + if (data_ready) { + q->push(get_priority(), this); + } + } else { /* wo TLS */ + size_t cbread = 0; +#if defined __linux__ + ret = get_server_socket()->read((socket_t)_session.netsock.event_socket, _session.tls_handle, 0, (char*)buf_read, size_buf_read, &cbread); + if (errorcode_t::success == ret) { + getstream()->produce(buf_read, cbread); + q->push(get_priority(), this); + } +#elif defined _WIN32 || defined _WIN64 + // udp client address + cbread = size_buf_read; + getstream()->produce(buf_read, size_buf_read); + q->push(get_priority(), this); +#endif + + if (_df && (errorcode_t::success == ret)) { + basic_stream bs; + datetime dt; + datetime_t t; + dt.getlocaltime(&t); + + bs.printf("%04d-%02d-%02d %02d:%02d:%02d.%03d ", t.year, t.month, t.day, t.hour, t.minute, t.second, t.milliseconds); + bs << "[ns] read " << (socket_t)_session.netsock.event_socket << "\n"; + dump_memory(buf_read, cbread, &bs, 16, 2, 0, dump_notrunc); + bs << "\n"; + _df(&bs); + } + } + } + __finally2 { + // do nothing + } + return ret; +} + +return_t network_session::produce_dgram(t_mlfq* q, byte_t* buf_read, size_t size_buf_read, const sockaddr_storage_t* addr) { + // const sockaddr_storage_t* addr + // (epoll) nullptr + // (iocp) valid + return_t ret = errorcode_t::success; + critical_section_guard guard(_lock); + + __try2 { + if (nullptr == q) { + ret = errorcode_t::invalid_parameter; + __leave2; + } + +#if defined _WIN32 || defined _WIN64 + // buf_read, size_buf_read transmitted +#elif defined __linux__ + // read + size_buf_read = RTL_NUMBER_OF(_session.buffer); + buf_read = (byte_t*)_session.buffer; +#endif + + return_t result = errorcode_t::success; + + if (_session.tls_handle) { /* TLS */ + size_t cbread = 0; + bool data_ready = false; + int mode = 0; +#if defined __linux__ + mode = tls_io_flag_t::read_epoll; +#elif defined _WIN32 || defined _WIN64 + mode = tls_io_flag_t::read_iocp; +#endif + sockaddr_storage_t sa; + socklen_t sa_size = sizeof(sa); + ret = get_server_socket()->recvfrom((socket_t)_session.netsock.event_socket, _session.tls_handle, mode, (char*)buf_read, size_buf_read, nullptr, + (sockaddr*)&sa, &sa_size); + if (errorcode_t::success != ret) { + __leave2; + } + + while (true) { + result = get_server_socket()->recvfrom((socket_t)_session.netsock.event_socket, _session.tls_handle, tls_io_flag_t::read_ssl_read, + (char*)buf_read, size_buf_read, &cbread, (sockaddr*)&sa, &sa_size); /*SSL_read */ if (errorcode_t::success == result || errorcode_t::more_data == result) { getstream()->produce(buf_read, cbread, addr); @@ -163,8 +323,8 @@ return_t network_session::produce(t_mlfq* q, byte_t* buf_read, #if defined __linux__ sockaddr_storage_t sa; socklen_t sa_size = sizeof(sa); - ret = get_server_socket()->read((socket_t)_session.netsock.event_socket, _session.tls_handle, 0, (char*)buf_read, size_buf_read, &cbread, - (sockaddr*)&sa, &sa_size); + ret = get_server_socket()->recvfrom((socket_t)_session.netsock.event_socket, _session.tls_handle, 0, (char*)buf_read, size_buf_read, &cbread, + (sockaddr*)&sa, &sa_size); if (errorcode_t::success == ret) { getstream()->produce(buf_read, cbread, &sa); q->push(get_priority(), this); diff --git a/sdk/net/server/network_session.hpp b/sdk/net/server/network_session.hpp index b754fb5..6ccc5e0 100644 --- a/sdk/net/server/network_session.hpp +++ b/sdk/net/server/network_session.hpp @@ -118,6 +118,8 @@ class network_session { */ return_t send(const char* data_ptr, size_t size_data); return_t send(const byte_t* data_ptr, size_t size_data); + return_t sendto(const char* data_ptr, size_t size_data, sockaddr_storage_t* addr); + return_t sendto(const byte_t* data_ptr, size_t size_data, sockaddr_storage_t* addr); /** * @brief return socket information @@ -176,6 +178,9 @@ class network_session { network_session& trace(std::function f); protected: + return_t produce_stream(t_mlfq* q, byte_t* buf_read, size_t size_buf_read, const sockaddr_storage_t* addr = nullptr); + return_t produce_dgram(t_mlfq* q, byte_t* buf_read, size_t size_buf_read, const sockaddr_storage_t* addr = nullptr); + net_session_t _session; network_stream _stream; network_stream _request; diff --git a/sdk/net/tls/dtls_server_socket.cpp b/sdk/net/tls/dtls_server_socket.cpp index 3300904..7dc32d7 100644 --- a/sdk/net/tls/dtls_server_socket.cpp +++ b/sdk/net/tls/dtls_server_socket.cpp @@ -76,8 +76,8 @@ return_t dtls_server_socket::tls_stop_accept() { return ret; } -return_t dtls_server_socket::read(socket_t sock, tls_context_t* tls_handle, int mode, char* ptr_data, size_t size_data, size_t* cbread, struct sockaddr* addr, - socklen_t* addrlen) { +return_t dtls_server_socket::recvfrom(socket_t sock, tls_context_t* tls_handle, int mode, char* ptr_data, size_t size_data, size_t* cbread, + struct sockaddr* addr, socklen_t* addrlen) { return_t ret = errorcode_t::success; __try2 { ret = _tls->read(tls_handle, mode, ptr_data, size_data, cbread); } @@ -87,7 +87,8 @@ return_t dtls_server_socket::read(socket_t sock, tls_context_t* tls_handle, int return ret; } -return_t dtls_server_socket::send(socket_t sock, tls_context_t* tls_handle, const char* ptr_data, size_t size_data, size_t* cbsent) { +return_t dtls_server_socket::sendto(socket_t sock, tls_context_t* tls_handle, const char* ptr_data, size_t size_data, size_t* cbsent, + const struct sockaddr* addr, socklen_t addrlen) { return_t ret = errorcode_t::success; __try2 { ret = _tls->send(tls_handle, tls_io_flag_t::send_all, ptr_data, size_data, cbsent); } diff --git a/sdk/net/tls/dtls_server_socket.hpp b/sdk/net/tls/dtls_server_socket.hpp index cff82d2..7f5964c 100644 --- a/sdk/net/tls/dtls_server_socket.hpp +++ b/sdk/net/tls/dtls_server_socket.hpp @@ -57,12 +57,12 @@ class dtls_server_socket : public udp_server_socket { * @param char* ptr_data [IN] * @param size_t size_data [IN] * @param size_t* cbread [OUT] - * @param struct sockaddr* addr [outopt] - * @param socklen_t* addrlen [inopt] + * @param struct sockaddr* addr [out] + * @param socklen_t* addrlen [in] * @return error code (see error.hpp) */ - virtual return_t read(socket_t sock, tls_context_t* tls_handle, int mode, char* ptr_data, size_t size_data, size_t* cbread, struct sockaddr* addr = nullptr, - socklen_t* addrlen = nullptr); + virtual return_t recvfrom(socket_t sock, tls_context_t* tls_handle, int mode, char* ptr_data, size_t size_data, size_t* cbread, struct sockaddr* addr, + socklen_t* addrlen); /** * @brief send * @param socket_t sock [IN] @@ -70,9 +70,12 @@ class dtls_server_socket : public udp_server_socket { * @param const char* ptr_data [IN] * @param size_t size_data [IN] * @param size_t* cbsent [OUT] + * @param const struct sockaddr* addr [in] + * @param socklen_t addrlen [in] * @return error code (see error.hpp) */ - virtual return_t send(socket_t sock, tls_context_t* tls_handle, const char* ptr_data, size_t size_data, size_t* cbsent); + virtual return_t sendto(socket_t sock, tls_context_t* tls_handle, const char* ptr_data, size_t size_data, size_t* cbsent, const struct sockaddr* addr, + socklen_t addrlen); virtual bool support_tls(); diff --git a/sdk/net/tls/tls.cpp b/sdk/net/tls/tls.cpp index 7790f2e..80e8fcd 100644 --- a/sdk/net/tls/tls.cpp +++ b/sdk/net/tls/tls.cpp @@ -441,6 +441,78 @@ return_t transport_layer_security::read(tls_context_t* handle, int mode, void* b return ret; } +return_t transport_layer_security::recvfrom(tls_context_t* handle, int mode, void* buffer, size_t buffer_size, size_t* cbread, struct sockaddr* addr, + socklen_t* addrlen) { + return_t ret = errorcode_t::success; + + int ret_recv = 0; + + __try2 { + if (nullptr == handle || nullptr == buffer) { + ret = errorcode_t::invalid_parameter; + __leave2; + } + + if (TLS_CONTEXT_SIGNATURE != handle->_signature) { + ret = errorcode_t::invalid_context; + __leave2; + } + + if (nullptr != cbread) { + *cbread = 0; + } + + size_t size_read = buffer_size; + if (tls_io_flag_t::read_socket_recv & mode) { + ret_recv = ::recvfrom(handle->_socket, (char*)buffer, buffer_size, 0, addr, addrlen); + if (0 == ret_recv) { /* gracefully closed */ + ret = errorcode_t::disconnect; + __leave2; + } + if (-1 == ret_recv) { + ret = get_lasterror(ret_recv); + __leave2; + } + + size_read = ret_recv; + if (nullptr != cbread) { + *cbread = ret_recv; + } + } + if (tls_io_flag_t::read_bio_write & mode) { + BIO_write(handle->_sbio_read, buffer, (int)size_read); + } + if (tls_io_flag_t::read_ssl_read & mode) { + int written = BIO_number_written(handle->_sbio_read); + ret_recv = SSL_read(handle->_ssl, buffer, (int)buffer_size); + if (ret_recv <= 0) { + int ssl_error = SSL_get_error(handle->_ssl, ret_recv); + if (SSL_ERROR_WANT_READ == ssl_error) { + ret = errorcode_t::pending; + } else { + ret = errorcode_t::internal_error; + } + __leave2; + } else { + if (buffer_size < (size_t)written) { + ret = errorcode_t::more_data; + if (nullptr != cbread) { + *cbread = buffer_size; + } + } + if (nullptr != cbread) { + *cbread = ret_recv; + } + } + } + } + __finally2 { + // do nothing + } + + return ret; +} + return_t transport_layer_security::send(tls_context_t* handle, int mode, const char* data, size_t size_data, size_t* size_sent) { return_t ret = errorcode_t::success; @@ -495,6 +567,61 @@ return_t transport_layer_security::send(tls_context_t* handle, int mode, const c return ret; } +return_t transport_layer_security::sendto(tls_context_t* handle, int mode, const char* data, size_t size_data, size_t* size_sent, const struct sockaddr* addr, + socklen_t addrlen) { + return_t ret = errorcode_t::success; + + __try2 { + if (nullptr == handle) { + ret = errorcode_t::invalid_parameter; + __leave2; + } + + if (size_sent) { + *size_sent = 0; + } + + if (TLS_CONTEXT_SIGNATURE != handle->_signature) { + ret = errorcode_t::invalid_context; + __leave2; + } + + if (tls_io_flag_t::send_ssl_write & mode) { + int ret_write = SSL_write(handle->_ssl, data, (int)size_data); + + if (ret_write < 1) { + ret = errorcode_t::internal_error; + __leave2; + } + if (size_sent) { + *size_sent = ret_write; + } + } + + int written = BIO_number_written(handle->_sbio_write); + + int ret_read = 0; + std::vector buf; + buf.resize(written); + + if (tls_io_flag_t::send_bio_read & mode) { + ret_read = BIO_read(handle->_sbio_write, &buf[0], buf.size()); + if (ret_read < 1) { + ret = errorcode_t::internal_error; + __leave2; /* too many traces here */ + } + + if (tls_io_flag_t::send_socket_send & mode) { + ::sendto(handle->_socket, &buf[0], ret_read, 0, addr, addrlen); + } + } + } + __finally2 { + // do nothing + } + return ret; +} + socket_t transport_layer_security::get_socket(tls_context_t* handle) { socket_t sock = INVALID_SOCKET; diff --git a/sdk/net/tls/tls.hpp b/sdk/net/tls/tls.hpp index a36cdda..9cee986 100644 --- a/sdk/net/tls/tls.hpp +++ b/sdk/net/tls/tls.hpp @@ -89,6 +89,7 @@ class transport_layer_security { * @param size_t* size_read [OUT] */ return_t read(tls_context_t* handle, int mode, void* buffer, size_t buffer_size, size_t* size_read); + return_t recvfrom(tls_context_t* handle, int mode, void* buffer, size_t buffer_size, size_t* size_read, struct sockaddr* addr, socklen_t* addrlen); /** * @brief send @@ -99,6 +100,7 @@ class transport_layer_security { * @remarks send 를 SSL_write 로 대체 */ return_t send(tls_context_t* handle, int mode, const char* data, size_t size_data, size_t* size_sent); + return_t sendto(tls_context_t* handle, int mode, const char* data, size_t size_data, size_t* size_sent, const struct sockaddr* addr, socklen_t addrlen); socket_t get_socket(tls_context_t* handle); diff --git a/sdk/net/tls/tls_server_socket.cpp b/sdk/net/tls/tls_server_socket.cpp index 0a82f0a..0cef6b2 100644 --- a/sdk/net/tls/tls_server_socket.cpp +++ b/sdk/net/tls/tls_server_socket.cpp @@ -58,8 +58,7 @@ return_t tls_server_socket::tls_stop_accept() { return ret; } -return_t tls_server_socket::read(socket_t sock, tls_context_t* tls_handle, int mode, char* ptr_data, size_t size_data, size_t* cbread, struct sockaddr* addr, - socklen_t* addrlen) { +return_t tls_server_socket::read(socket_t sock, tls_context_t* tls_handle, int mode, char* ptr_data, size_t size_data, size_t* cbread) { return_t ret = errorcode_t::success; __try2 { ret = _tls->read(tls_handle, mode, ptr_data, size_data, cbread); } __finally2 { diff --git a/sdk/net/tls/tls_server_socket.hpp b/sdk/net/tls/tls_server_socket.hpp index 1d6dad7..6ee19cd 100644 --- a/sdk/net/tls/tls_server_socket.hpp +++ b/sdk/net/tls/tls_server_socket.hpp @@ -59,12 +59,9 @@ class tls_server_socket : public tcp_server_socket { * @param char* ptr_data [IN] * @param size_t size_data [IN] * @param size_t* cbread [OUT] - * @param struct sockaddr* addr [outopt] - * @param socklen_t* addrlen [inopt] * @return error code (see error.hpp) */ - virtual return_t read(socket_t sock, tls_context_t* tls_handle, int mode, char* ptr_data, size_t size_data, size_t* cbread, struct sockaddr* addr = nullptr, - socklen_t* addrlen = nullptr); + virtual return_t read(socket_t sock, tls_context_t* tls_handle, int mode, char* ptr_data, size_t size_data, size_t* cbread); /** * @brief send * @param socket_t sock [IN] diff --git a/test/dtlsserver/sample.cpp b/test/dtlsserver/sample.cpp index 67711a7..7a6dbd2 100644 --- a/test/dtlsserver/sample.cpp +++ b/test/dtlsserver/sample.cpp @@ -38,26 +38,20 @@ t_shared_instance> _cmdline; return_t consume_routine(uint32 type, uint32 data_count, void* data_array[], CALLBACK_CONTROL* callback_control, void* user_context) { return_t ret = errorcode_t::success; net_session_socket_t* session_socket = (net_session_socket_t*)data_array[0]; - network_session* session = (network_session*)data_array[3]; byte_t* buf = (byte_t*)data_array[1]; size_t bufsize = (size_t)data_array[2]; + network_session* session = (network_session*)data_array[3]; + sockaddr_storage_t* addr = (sockaddr_storage_t*)data_array[5]; basic_stream bs; std::string message; switch (type) { - case mux_connect: - _logger->writeln("connect %d", session_socket->event_socket); - break; - case mux_read: case mux_dgram: _logger->writeln("read %d msg [%.*s]", session_socket->event_socket, (unsigned)bufsize, buf); // dump_memory (buf, bufsize, &bs, 16, 4); // std::cout << bs << std::endl; - session->send((char*)buf, bufsize); - break; - case mux_disconnect: - _logger->writeln("disconnect %d", session_socket->event_socket); + session->sendto(buf, bufsize, addr); break; } return ret; @@ -151,7 +145,7 @@ void run_server() { return_t ret = errorcode_t::success; __try2 { - _test_case.begin("tls server"); + _test_case.begin("dtls server"); thread1.start(); } diff --git a/test/udpserver2/sample.cpp b/test/udpserver2/sample.cpp index b9dbfd8..f2a5a26 100644 --- a/test/udpserver2/sample.cpp +++ b/test/udpserver2/sample.cpp @@ -33,30 +33,23 @@ t_shared_instance> _cmdline; #define FILENAME_RUN _T (".run") -ipaddr_acl acl; - -return_t accept_handler(socket_t socket, sockaddr_storage_t* client_addr, CALLBACK_CONTROL* control, void* parameter) { - return_t ret = errorcode_t::success; - bool result = false; - - acl.determine(client_addr, result); - if (control) { - *control = result ? CONTINUE_CONTROL : STOP_CONTROL; - } - return ret; -} - return_t consume_routine(uint32 type, uint32 data_count, void* data_array[], CALLBACK_CONTROL* callback_control, void* user_context) { return_t ret = errorcode_t::success; - net_session_socket_t* network_session = (net_session_socket_t*)data_array[0]; - - char* buf = (char*)data_array[1]; + net_session_socket_t* session_socket = (net_session_socket_t*)data_array[0]; + byte_t* buf = (byte_t*)data_array[1]; size_t bufsize = (size_t)data_array[2]; + network_session* session = (network_session*)data_array[3]; sockaddr_storage_t* addr = (sockaddr_storage_t*)data_array[5]; + + basic_stream bs; + std::string message; + switch (type) { - case multiplexer_event_type_t::mux_dgram: - _logger->writeln("read %d msg [%.*s]", network_session->event_socket, (unsigned)bufsize, buf); - sendto((socket_t)network_session->event_socket, buf, bufsize, 0, (sockaddr*)addr, sizeof(sockaddr_storage_t)); + case mux_dgram: + _logger->writeln("read %d msg [%.*s]", session_socket->event_socket, (unsigned)bufsize, buf); + // dump_memory (buf, bufsize, &bs, 16, 4); + // std::cout << bs << std::endl; + session->sendto((char*)buf, bufsize, addr); break; } return ret; @@ -77,10 +70,6 @@ return_t echo_server(void* param) { fclose(fp); __try2 { - acl.add_rule("127.0.0.1", true); - acl.add_rule("::1", true); - acl.setmode(ipaddr_acl_t::whitelist); - server_conf conf; conf.set(netserver_config_t::serverconf_concurrent_event, 1024) // concurrent (linux epoll concerns, windows ignore) .set(netserver_config_t::serverconf_concurrent_tls_accept, 1) @@ -90,9 +79,6 @@ return_t echo_server(void* param) { network_server.open(&handle_ipv4, AF_INET, port, &svr_sock, &conf, consume_routine, nullptr); network_server.open(&handle_ipv6, AF_INET6, port, &svr_sock, &conf, consume_routine, nullptr); - network_server.set_accept_control_handler(handle_ipv4, accept_handler); - network_server.set_accept_control_handler(handle_ipv6, accept_handler); - network_server.consumer_loop_run(handle_ipv4, 2); network_server.consumer_loop_run(handle_ipv6, 2); network_server.event_loop_run(handle_ipv4, 1);