Improvements to sockets for thread safety
This commit is contained in:
@@ -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 );
|
|
||||||
}
|
}
|
||||||
@@ -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 >;
|
||||||
|
|||||||
Reference in New Issue
Block a user