From 654e225093db165e0c38a658103025dd7233bc71 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Tue, 6 Sep 2022 03:25:24 -0400 Subject: try to fix shutdown with select --- src/discord/voiceclient.cpp | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) (limited to 'src/discord/voiceclient.cpp') diff --git a/src/discord/voiceclient.cpp b/src/discord/voiceclient.cpp index 3f38eea..b899638 100644 --- a/src/discord/voiceclient.cpp +++ b/src/discord/voiceclient.cpp @@ -92,22 +92,28 @@ std::vector UDPSocket::Receive() { void UDPSocket::Stop() { m_running = false; - #ifdef _WIN32 - shutdown(m_socket, SD_BOTH); - #else - shutdown(m_socket, SHUT_RDWR); - #endif if (m_thread.joinable()) m_thread.join(); } void UDPSocket::ReadThread() { + timeval tv; while (m_running) { static std::array buf; sockaddr_in from; socklen_t addrlen = sizeof(from); - int n = recvfrom(m_socket, reinterpret_cast(buf.data()), sizeof(buf), 0, reinterpret_cast(&from), &addrlen); - if (n > 0 && S_ADDR(from) == S_ADDR(m_server) && from.sin_port == m_server.sin_port) { - m_signal_data.emit({ buf.begin(), buf.begin() + n }); + + tv.tv_sec = 0; + tv.tv_usec = 1000000; + + fd_set read_fds; + FD_ZERO(&read_fds); + FD_SET(m_socket, &read_fds); + + if (select(m_socket + 1, &read_fds, nullptr, nullptr, &tv) > 0) { + int n = recvfrom(m_socket, reinterpret_cast(buf.data()), sizeof(buf), 0, reinterpret_cast(&from), &addrlen); + if (n > 0 && S_ADDR(from) == S_ADDR(m_server) && from.sin_port == m_server.sin_port) { + m_signal_data.emit({ buf.begin(), buf.begin() + n }); + } } } } -- cgit v1.2.3