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 c8704f8..6341913 100644 --- a/src/details/asyncsocket.cpp +++ b/src/details/asyncsocket.cpp @@ -111,7 +111,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; @@ -184,7 +185,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); } @@ -326,7 +327,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(); @@ -357,7 +358,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(); @@ -372,7 +373,7 @@ IResult vuapi AsyncSocket::do_recv(WSANETWORKEVENTS& events, SOCKET& connection) return events.iErrorCode[FD_READ_BIT]; } - Socket socket(m_socket); + Socket socket; socket.attach(connection); this->on_recv(socket); socket.detach(); @@ -387,7 +388,7 @@ IResult vuapi AsyncSocket::do_send(WSANETWORKEVENTS& events, SOCKET& connection) return events.iErrorCode[FD_WRITE_BIT]; } - Socket socket(m_socket); + Socket socket; socket.attach(connection); this->on_send(socket); socket.detach(); @@ -433,13 +434,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); @@ -499,7 +499,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); } @@ -509,7 +509,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 = "";