Improvements to sockets for thread safety

This commit is contained in:
HikikoMarmy
2025-06-15 00:17:38 +01:00
parent 904722b74c
commit cb1daf15a6
2 changed files with 27 additions and 26 deletions

View File

@@ -1,16 +1,18 @@
#include "../global_define.h" #include "RealmSocket.h"
#include "../Common/Utility.h"
RealmSocket::RealmSocket() RealmSocket::RealmSocket()
{ {
fd = INVALID_SOCKET; fd = INVALID_SOCKET;
memset( &local_addr, 0, sizeof( local_addr ) ); std::memset( &local_addr, 0, sizeof( local_addr ) );
memset( &remote_addr, 0, sizeof( remote_addr ) ); std::memset( &remote_addr, 0, sizeof( remote_addr ) );
remote_ip = ""; remote_ip = "";
remote_port = 0; remote_port = 0;
flag.disconnected = 0; flag.disconnected_wait = 0;
flag.disconnected_forced = 0;
flag.is_listener = 0; flag.is_listener = 0;
flag.want_more_read_data = 0; flag.want_more_read_data = 0;
flag.want_more_write_data = 0; flag.want_more_write_data = 0;
@@ -32,13 +34,14 @@ RealmSocket::~RealmSocket()
fd = INVALID_SOCKET; fd = INVALID_SOCKET;
memset( &local_addr, 0, sizeof( local_addr ) ); std::memset( &local_addr, 0, sizeof( local_addr ) );
memset( &remote_addr, 0, sizeof( remote_addr ) ); std::memset( &remote_addr, 0, sizeof( remote_addr ) );
remote_ip = ""; remote_ip = "";
remote_port = 0; remote_port = 0;
flag.disconnected = 0; flag.disconnected_wait = 0;
flag.disconnected_forced = 0;
flag.is_listener = 0; flag.is_listener = 0;
flag.want_more_read_data = 0; flag.want_more_read_data = 0;
flag.want_more_write_data = 0; flag.want_more_write_data = 0;
@@ -48,27 +51,26 @@ RealmSocket::~RealmSocket()
latency = 0; latency = 0;
m_pendingWriteBuffer.reserve( WRITE_BUFFER_SIZE ); m_pendingWriteBuffer.reserve( WRITE_BUFFER_SIZE );
} }
void RealmSocket::send( const sptr_generic_response response ) void RealmSocket::send( const sptr_generic_response response )
{ {
auto &stream = response->Serialize(); auto &stream = response->Serialize();
auto netSize = htonl( static_cast< uint32_t >( stream.get_position() ) + 4 ); auto netSize = Util::ByteSwap( static_cast< uint32_t >( stream.get_position() ) + 4 );
std::lock_guard< std::mutex > lock( write_mutex );
m_pendingWriteBuffer.insert( m_pendingWriteBuffer.end(), ( uint8_t * )&netSize, ( uint8_t * )&netSize + 4 ); m_pendingWriteBuffer.insert( m_pendingWriteBuffer.end(), ( uint8_t * )&netSize, ( uint8_t * )&netSize + 4 );
m_pendingWriteBuffer.insert( m_pendingWriteBuffer.end(), stream.data.begin(), stream.data.end() ); m_pendingWriteBuffer.insert( m_pendingWriteBuffer.end(), stream.m_buffer.begin(), stream.m_buffer.end() );
Log::Packet( response->m_stream.data, response->m_stream.get_length(), true);
} }
void RealmSocket::send( GenericMessage &message ) void RealmSocket::send( GenericMessage &message )
{ {
auto &stream = message.Serialize(); auto &stream = message.Serialize();
auto netSize = htonl( static_cast< uint32_t >( stream.get_position() ) + 4 ); auto netSize = Util::ByteSwap( static_cast< uint32_t >( stream.get_position() ) + 4 );
std::lock_guard< std::mutex > lock( write_mutex );
m_pendingWriteBuffer.insert( m_pendingWriteBuffer.end(), ( uint8_t * )&netSize, ( uint8_t * )&netSize + 4 ); m_pendingWriteBuffer.insert( m_pendingWriteBuffer.end(), ( uint8_t * )&netSize, ( uint8_t * )&netSize + 4 );
m_pendingWriteBuffer.insert( m_pendingWriteBuffer.end(), stream.data.begin(), stream.data.end() ); m_pendingWriteBuffer.insert( m_pendingWriteBuffer.end(), stream.m_buffer.begin(), stream.m_buffer.end() );
Log::Packet( stream.data, stream.get_length(), true );
} }

View File

@@ -1,14 +1,13 @@
#pragma once #pragma once
#include <memory>
#include <vector> #include <vector>
#include <mutex> #include <mutex>
#include <winsock2.h>
// Forward Declare GenericResponse #include "GenericNetRequest.h"
class GenericResponse; #include "GenericNetResponse.h"
typedef std::shared_ptr< GenericResponse > sptr_generic_response; #include "GenericNetMessage.h"
// Forward Declare Generic Message
class GenericMessage;
class RealmSocket class RealmSocket
{ {
@@ -37,7 +36,8 @@ public:
SOCKET fd; SOCKET fd;
struct s_flag { struct s_flag {
bool disconnected; bool disconnected_wait;
bool disconnected_forced;
bool is_listener; bool is_listener;
bool want_more_read_data; bool want_more_read_data;
bool want_more_write_data; bool want_more_write_data;
@@ -47,8 +47,7 @@ public:
sockaddr_in remote_addr; sockaddr_in remote_addr;
std::string remote_ip; std::string remote_ip;
int32_t remote_port; uint32_t remote_port;
uint32_t last_write_position; uint32_t last_write_position;
uint64_t latency; uint64_t latency;
@@ -64,4 +63,4 @@ public:
std::vector< uint8_t > m_pendingReadBuffer; std::vector< uint8_t > m_pendingReadBuffer;
}; };
typedef std::shared_ptr< RealmSocket > sptr_socket; using sptr_socket = std::shared_ptr< RealmSocket >;