From dff657cc309651942d810670b087dda669fcb298 Mon Sep 17 00:00:00 2001 From: Vic P Date: Wed, 4 Sep 2024 23:52:20 +0700 Subject: [PATCH 1/3] Vutils --- src/details/asyncsocket.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/details/asyncsocket.cpp b/src/details/asyncsocket.cpp index c8704f8..c4b576a 100644 --- a/src/details/asyncsocket.cpp +++ b/src/details/asyncsocket.cpp @@ -37,6 +37,8 @@ void vuapi AsyncSocket::initialze() { m_n_events = 0; + //std::lock_guard lg(m_mutex_client_list); + memset(m_connections, int(INVALID_SOCKET), sizeof(m_connections)); memset(m_events, int(0), sizeof(m_events)); @@ -87,6 +89,8 @@ VUResult vuapi AsyncSocket::listen(const int maxcon) return 2; } + //std::lock_guard lg(m_mutex_client_list); + m_connections[m_n_events] = m_socket.handle(); m_events[m_n_events] = event; m_n_events++; @@ -133,6 +137,8 @@ VUResult vuapi AsyncSocket::connect(const Endpoint& endpoint) return 2; } + //std::lock_guard lg(m_mutex_client_list); + auto result = m_socket.connect(endpoint); if (result == VU_OK) { @@ -162,6 +168,8 @@ void vuapi AsyncSocket::get_connections(std::set& connections) return; } + //std::lock_guard lg(m_mutex_client_list); + for (auto& socket : m_connections) { if (socket == INVALID_SOCKET) // ignore invalid socket handle @@ -180,6 +188,8 @@ void vuapi AsyncSocket::get_connections(std::set& connections) VUResult vuapi AsyncSocket::disconnect_connections(const Socket::shutdowns_t flags, const bool cleanup) { + //std::lock_guard lg(m_mutex_client_list); + std::set connections; this->get_connections(connections); for (const auto& connection : connections) @@ -341,6 +351,8 @@ IResult vuapi AsyncSocket::do_open(WSANETWORKEVENTS& events, SOCKET& connection) return events.iErrorCode[FD_ACCEPT_BIT]; } + //std::lock_guard lg(m_mutex_client_list); + Socket::Handle obj = { 0 }; int n = static_cast(sizeof(obj.sai)); @@ -372,6 +384,8 @@ IResult vuapi AsyncSocket::do_recv(WSANETWORKEVENTS& events, SOCKET& connection) return events.iErrorCode[FD_READ_BIT]; } + //std::lock_guard lg(m_mutex_client_list); + Socket socket(m_socket); socket.attach(connection); this->on_recv(socket); @@ -387,6 +401,8 @@ IResult vuapi AsyncSocket::do_send(WSANETWORKEVENTS& events, SOCKET& connection) return events.iErrorCode[FD_WRITE_BIT]; } + //std::lock_guard lg(m_mutex_client_list); + Socket socket(m_socket); socket.attach(connection); this->on_send(socket); @@ -405,6 +421,8 @@ IResult vuapi AsyncSocket::do_close(WSANETWORKEVENTS& events, SOCKET& connection // return events.iErrorCode[FD_CLOSE_BIT]; // } + //std::lock_guard lg(m_mutex_client_list); + std::vector> in_used_connections; for (int i = 0; i < WSA_MAXIMUM_WAIT_EVENTS; i++) From 00208ee2c7110984fcee45d8d85671f3567fa322 Mon Sep 17 00:00:00 2001 From: Vic P Date: Mon, 9 Sep 2024 02:46:30 +0700 Subject: [PATCH 2/3] Vutils --- include/Vutils.h | 6 ++--- src/details/asyncsocket.cpp | 22 +++++++++--------- src/details/socket.cpp | 46 +++++++++++++++++-------------------- 3 files changed, 35 insertions(+), 39 deletions(-) diff --git a/include/Vutils.h b/include/Vutils.h index c91a89a..3b79314 100644 --- a/include/Vutils.h +++ b/include/Vutils.h @@ -1271,11 +1271,11 @@ class Socket : public LastError typedef int flags_t; typedef int shutdowns_t; - enum class side_type : uint + enum class side_type : int { + UNDEFINED = -1, SERVER, CLIENT, - UNDEFINED, }; struct Handle @@ -1347,7 +1347,7 @@ class Socket : public LastError IResult vuapi recv_from(Buffer& data, const Handle& socket); IResult vuapi recv_all_from(Buffer& data, const Handle& socket); - IResult vuapi close(); + IResult vuapi close(const Socket::shutdowns_t flags = SD_BOTH, const bool cleanup = false); const sockaddr_in vuapi get_local_sai(); const sockaddr_in vuapi get_remote_sai(); diff --git a/src/details/asyncsocket.cpp b/src/details/asyncsocket.cpp index c4b576a..764c1b5 100644 --- a/src/details/asyncsocket.cpp +++ b/src/details/asyncsocket.cpp @@ -115,7 +115,8 @@ IResult vuapi AsyncSocket::stop(const Socket::shutdowns_t flags, const bool clea if (m_thread != INVALID_HANDLE_VALUE) { - TerminateThread(m_thread, 0); // CloseHandle(m_thread); + // TerminateThread(m_thread, 0); // CloseHandle(m_thread); + // Using atomic for `m_running = false`. So, the thread will be closed after set `m_running = false` to exit looping } return VU_OK; @@ -194,7 +195,7 @@ VUResult vuapi AsyncSocket::disconnect_connections(const Socket::shutdowns_t fla this->get_connections(connections); for (const auto& connection : connections) { - Socket socket(m_socket); + Socket socket; socket.attach(connection); socket.disconnect(flags, cleanup); } @@ -336,7 +337,7 @@ IResult vuapi AsyncSocket::do_connect(WSANETWORKEVENTS& events, SOCKET& connecti return events.iErrorCode[FD_CONNECT_BIT]; } - Socket socket(m_socket); + Socket socket; socket.attach(connection); this->on_connect(socket); socket.detach(); @@ -369,7 +370,7 @@ IResult vuapi AsyncSocket::do_open(WSANETWORKEVENTS& events, SOCKET& connection) m_connections[m_n_events] = obj.s; m_n_events++; - Socket socket(m_socket); + Socket socket; socket.attach(obj); this->on_open(socket); socket.detach(); @@ -386,7 +387,7 @@ IResult vuapi AsyncSocket::do_recv(WSANETWORKEVENTS& events, SOCKET& connection) //std::lock_guard lg(m_mutex_client_list); - Socket socket(m_socket); + Socket socket; socket.attach(connection); this->on_recv(socket); socket.detach(); @@ -403,7 +404,7 @@ IResult vuapi AsyncSocket::do_send(WSANETWORKEVENTS& events, SOCKET& connection) //std::lock_guard lg(m_mutex_client_list); - Socket socket(m_socket); + Socket socket; socket.attach(connection); this->on_send(socket); socket.detach(); @@ -451,13 +452,12 @@ IResult vuapi AsyncSocket::do_close(WSANETWORKEVENTS& events, SOCKET& connection m_n_events++; } - Socket socket(m_socket); + Socket socket; socket.attach(connection); this->on_close(socket); + socket.close(); socket.detach(); - ::closesocket(connection); - connection = INVALID_SOCKET; // CompressArrays(m_Events, m_Sockets, &m_nEvents); @@ -517,7 +517,7 @@ IResult vuapi AsyncSocket::send( int size, const Socket::flags_t flags) { - Socket socket(m_socket); + Socket socket; socket.attach(connection); return socket.send(ptr_data, size, flags); } @@ -527,7 +527,7 @@ IResult vuapi AsyncSocket::send( const Buffer& data, const Socket::flags_t flags) { - Socket socket(m_socket); + Socket socket; socket.attach(connection); return socket.send(data, flags); } diff --git a/src/details/socket.cpp b/src/details/socket.cpp index 5e602c2..331ace6 100644 --- a/src/details/socket.cpp +++ b/src/details/socket.cpp @@ -144,12 +144,7 @@ Socket::~Socket() if (this->available()) { - if (::closesocket(m_socket) == INVALID_SOCKET) - { - assert("close socket failed."); - m_last_error_code = GetLastError(); - m_socket = INVALID_SOCKET; - } + this->close(); } if (WSACleanup() == INVALID_SOCKET) @@ -460,7 +455,7 @@ IResult vuapi Socket::recv(char* ptr_data, int size, const flags_t flags) timeval timeout = { 0 }; timeout.tv_usec = 0; - timeout.tv_sec = m_options.timeout.recv; + timeout.tv_sec = m_options.timeout.recv; int status = ::select(0, &fds_read, nullptr, nullptr, &timeout); if (status == SOCKET_ERROR) @@ -586,7 +581,7 @@ IResult vuapi Socket::recv_from(char* ptr_data, int size, const Handle& socket) } int n = sizeof(socket.sai); - IResult z = ::recvfrom(m_socket, ptr_data, size, 0, (struct sockaddr *)&socket.sai, &n); + IResult z = ::recvfrom(m_socket, ptr_data, size, 0, (struct sockaddr*)&socket.sai, &n); if (z == SOCKET_ERROR) { m_last_error_code = GetLastError(); @@ -630,21 +625,7 @@ IResult vuapi Socket::recv_all_from(Buffer& buffer, const Handle& socket) return IResult(buffer.size()); } -VUResult vuapi Socket::close() -{ - if (!this->available()) - { - return 1; - } - - ::closesocket(m_socket); - - m_socket = INVALID_SOCKET; - - return VU_OK; -} - -VUResult vuapi Socket::disconnect(const shutdowns_t flags, const bool cleanup) +VUResult vuapi Socket::close(const shutdowns_t flags, const bool cleanup) { if (!this->available()) { @@ -659,8 +640,8 @@ VUResult vuapi Socket::disconnect(const shutdowns_t flags, const bool cleanup) if (::shutdown(m_socket, flags) == SOCKET_ERROR) { - m_last_error_code = GetLastError(); - return 2; + // m_last_error_code = GetLastError(); + // return 2; } if (::closesocket(m_socket) == SOCKET_ERROR) @@ -674,6 +655,21 @@ VUResult vuapi Socket::disconnect(const shutdowns_t flags, const bool cleanup) return VU_OK; } +VUResult vuapi Socket::disconnect(const shutdowns_t flags, const bool cleanup) +{ + if (!this->available()) + { + return 1; + } + + if (this->close(flags, cleanup) != VU_OK) + { + return 2; + } + + return VU_OK; +} + std::string vuapi Socket::get_host_name() { std::string result = ""; From 1176144d1ab37b979f912011d5b4d6d5790a003c Mon Sep 17 00:00:00 2001 From: Vic P Date: Mon, 9 Sep 2024 02:49:08 +0700 Subject: [PATCH 3/3] Vutils --- src/details/asyncsocket.cpp | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/details/asyncsocket.cpp b/src/details/asyncsocket.cpp index 764c1b5..6341913 100644 --- a/src/details/asyncsocket.cpp +++ b/src/details/asyncsocket.cpp @@ -37,8 +37,6 @@ void vuapi AsyncSocket::initialze() { m_n_events = 0; - //std::lock_guard lg(m_mutex_client_list); - memset(m_connections, int(INVALID_SOCKET), sizeof(m_connections)); memset(m_events, int(0), sizeof(m_events)); @@ -89,8 +87,6 @@ VUResult vuapi AsyncSocket::listen(const int maxcon) return 2; } - //std::lock_guard lg(m_mutex_client_list); - m_connections[m_n_events] = m_socket.handle(); m_events[m_n_events] = event; m_n_events++; @@ -138,8 +134,6 @@ VUResult vuapi AsyncSocket::connect(const Endpoint& endpoint) return 2; } - //std::lock_guard lg(m_mutex_client_list); - auto result = m_socket.connect(endpoint); if (result == VU_OK) { @@ -169,8 +163,6 @@ void vuapi AsyncSocket::get_connections(std::set& connections) return; } - //std::lock_guard lg(m_mutex_client_list); - for (auto& socket : m_connections) { if (socket == INVALID_SOCKET) // ignore invalid socket handle @@ -189,8 +181,6 @@ void vuapi AsyncSocket::get_connections(std::set& connections) VUResult vuapi AsyncSocket::disconnect_connections(const Socket::shutdowns_t flags, const bool cleanup) { - //std::lock_guard lg(m_mutex_client_list); - std::set connections; this->get_connections(connections); for (const auto& connection : connections) @@ -352,8 +342,6 @@ IResult vuapi AsyncSocket::do_open(WSANETWORKEVENTS& events, SOCKET& connection) return events.iErrorCode[FD_ACCEPT_BIT]; } - //std::lock_guard lg(m_mutex_client_list); - Socket::Handle obj = { 0 }; int n = static_cast(sizeof(obj.sai)); @@ -385,8 +373,6 @@ IResult vuapi AsyncSocket::do_recv(WSANETWORKEVENTS& events, SOCKET& connection) return events.iErrorCode[FD_READ_BIT]; } - //std::lock_guard lg(m_mutex_client_list); - Socket socket; socket.attach(connection); this->on_recv(socket); @@ -402,8 +388,6 @@ IResult vuapi AsyncSocket::do_send(WSANETWORKEVENTS& events, SOCKET& connection) return events.iErrorCode[FD_WRITE_BIT]; } - //std::lock_guard lg(m_mutex_client_list); - Socket socket; socket.attach(connection); this->on_send(socket); @@ -422,8 +406,6 @@ IResult vuapi AsyncSocket::do_close(WSANETWORKEVENTS& events, SOCKET& connection // return events.iErrorCode[FD_CLOSE_BIT]; // } - //std::lock_guard lg(m_mutex_client_list); - std::vector> in_used_connections; for (int i = 0; i < WSA_MAXIMUM_WAIT_EVENTS; i++)