|
|
@@ -14,10 +14,6 @@ namespace Network {
|
|
|
|
|
|
ProxySocket::ProxySocket(RoomNetwork& room_network_) noexcept : room_network{room_network_} {}
|
|
|
|
|
|
-ProxySocket::ProxySocket(ProxySocket&& rhs) noexcept : room_network{rhs.room_network} {
|
|
|
- fd = std::exchange(rhs.fd, INVALID_SOCKET);
|
|
|
-}
|
|
|
-
|
|
|
ProxySocket::~ProxySocket() {
|
|
|
if (fd == INVALID_SOCKET) {
|
|
|
return;
|
|
|
@@ -36,7 +32,6 @@ void ProxySocket::HandleProxyPacket(const ProxyPacket& packet) {
|
|
|
|
|
|
template <typename T>
|
|
|
Errno ProxySocket::SetSockOpt(SOCKET fd_, int option, T value) {
|
|
|
- socket_options[option] = reinterpret_cast<const char*>(&value);
|
|
|
return Errno::SUCCESS;
|
|
|
}
|
|
|
|
|
|
@@ -100,27 +95,36 @@ std::pair<s32, Errno> ProxySocket::RecvFrom(int flags, std::vector<u8>& message,
|
|
|
ASSERT(flags == 0);
|
|
|
ASSERT(message.size() < static_cast<size_t>(std::numeric_limits<int>::max()));
|
|
|
|
|
|
- {
|
|
|
- std::lock_guard guard(packets_mutex);
|
|
|
- if (received_packets.size() > 0) {
|
|
|
- return ReceivePacket(flags, message, addr, message.size());
|
|
|
+ const auto timestamp = std::chrono::steady_clock::now();
|
|
|
+
|
|
|
+ while (true) {
|
|
|
+ {
|
|
|
+ std::lock_guard guard(packets_mutex);
|
|
|
+ if (received_packets.size() > 0) {
|
|
|
+ return ReceivePacket(flags, message, addr, message.size());
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- if (blocking) {
|
|
|
- if (receive_timeout > 0) {
|
|
|
- std::this_thread::sleep_for(std::chrono::milliseconds(receive_timeout));
|
|
|
+ if (!blocking) {
|
|
|
+ return {-1, Errno::AGAIN};
|
|
|
}
|
|
|
- } else {
|
|
|
- return {-1, Errno::AGAIN};
|
|
|
- }
|
|
|
|
|
|
- std::lock_guard guard(packets_mutex);
|
|
|
- if (received_packets.size() > 0) {
|
|
|
- return ReceivePacket(flags, message, addr, message.size());
|
|
|
- }
|
|
|
+ // TODO: break if socket connection is lost
|
|
|
+
|
|
|
+ std::this_thread::yield();
|
|
|
+
|
|
|
+ if (receive_timeout == 0) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
|
|
|
- return {-1, Errno::TIMEDOUT};
|
|
|
+ const auto time_diff = std::chrono::steady_clock::now() - timestamp;
|
|
|
+ const auto time_diff_ms =
|
|
|
+ std::chrono::duration_cast<std::chrono::milliseconds>(time_diff).count();
|
|
|
+
|
|
|
+ if (time_diff_ms > receive_timeout) {
|
|
|
+ return {-1, Errno::TIMEDOUT};
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
std::pair<s32, Errno> ProxySocket::ReceivePacket(int flags, std::vector<u8>& message,
|