From f2c3b2b723031fa1234cbeea777000f800228053 Mon Sep 17 00:00:00 2001 From: lotodore Date: Sun, 25 Jan 2009 21:56:43 +0000 Subject: [PATCH] Fixed boost asio stuff. Now working but probably some polishing required. --- src/net/clientcontext.h | 1 + src/net/common/clientcontext.cpp | 4 ++-- src/net/common/senderthread.cpp | 18 ++++++++++-------- src/net/common/serverlobbythread.cpp | 4 ++-- src/net/common/sessiondata.cpp | 18 +++++++++++++----- src/net/senderthread.h | 11 +++-------- src/net/serverlobbythread.h | 3 ++- src/net/sessiondata.h | 8 +++++--- 8 files changed, 38 insertions(+), 29 deletions(-) diff --git a/src/net/clientcontext.h b/src/net/clientcontext.h index 966ba707..012ce59f 100644 --- a/src/net/clientcontext.h +++ b/src/net/clientcontext.h @@ -111,6 +111,7 @@ private: ReceiveBuffer m_receiveBuffer; boost::shared_ptr m_senderCallback; boost::shared_ptr m_senderThread; + boost::asio::io_service m_ioService; }; #endif diff --git a/src/net/common/clientcontext.cpp b/src/net/common/clientcontext.cpp index 15f4c14d..2fdcbd70 100644 --- a/src/net/common/clientcontext.cpp +++ b/src/net/common/clientcontext.cpp @@ -44,7 +44,7 @@ ClientContext::ClientContext() { bzero(&m_clientSockaddr, sizeof(m_clientSockaddr)); m_senderCallback.reset(new ClientSenderCallback()); - m_senderThread.reset(new SenderThread(*m_senderCallback)); + m_senderThread.reset(new SenderThread(*m_senderCallback, m_ioService)); m_senderThread->Start(); } @@ -65,7 +65,7 @@ ClientContext::GetSocket() const void ClientContext::SetSocket(SOCKET sockfd) { - m_sessionData.reset(new SessionData(sockfd, SESSION_ID_GENERIC, m_senderThread, *m_senderCallback)); + m_sessionData.reset(new SessionData(sockfd, SESSION_ID_GENERIC, m_senderThread, *m_senderCallback, m_ioService)); } boost::shared_ptr diff --git a/src/net/common/senderthread.cpp b/src/net/common/senderthread.cpp index f2dd3a7a..7a90fc5c 100644 --- a/src/net/common/senderthread.cpp +++ b/src/net/common/senderthread.cpp @@ -26,7 +26,6 @@ #include #include -#include using namespace std; using boost::asio::ip::tcp; @@ -46,8 +45,8 @@ SenderThread::SendDataManager::HandleWrite(const boost::system::error_code& erro SetCompleted(true); } -SenderThread::SenderThread(SenderCallback &cb) -: m_callback(cb) +SenderThread::SenderThread(SenderCallback &cb, boost::asio::io_service& ioService) +: m_callback(cb), m_ioService(ioService) { } @@ -81,7 +80,7 @@ SenderThread::Send(boost::shared_ptr session, boost::shared_ptrGetId()); if (pos == m_sendQueueMap.end()) - pos = m_sendQueueMap.insert(SendQueueMap::value_type(session->GetId(), boost::shared_ptr(new SendDataManager(session, m_ioService)))).first; + pos = m_sendQueueMap.insert(SendQueueMap::value_type(session->GetId(), boost::shared_ptr(new SendDataManager(session)))).first; if (pos->second->list.size() < SEND_QUEUE_SIZE) pos->second->list.push_back(packet); } @@ -95,7 +94,7 @@ SenderThread::Send(boost::shared_ptr session, const NetPacketList & boost::mutex::scoped_lock lock(m_sendQueueMapMutex); SendQueueMap::iterator pos = m_sendQueueMap.find(session->GetId()); if (pos == m_sendQueueMap.end()) - pos = m_sendQueueMap.insert(SendQueueMap::value_type(session->GetId(), boost::shared_ptr(new SendDataManager(session, m_ioService)))).first; + pos = m_sendQueueMap.insert(SendQueueMap::value_type(session->GetId(), boost::shared_ptr(new SendDataManager(session)))).first; if (pos->second->list.size() + packetList.size() <= SEND_QUEUE_SIZE) { NetPacketList::const_iterator i = packetList.begin(); @@ -130,12 +129,15 @@ SenderThread::Main() if (!tmpManager->IsWriteInProgress()) { if (tmpManager->IsCompleted()) + { tmpManager->list.pop_front(); + tmpManager->SetCompleted(false); + } else { boost::shared_ptr tmpPacket = tmpManager->list.front(); boost::asio::async_write( - *tmpManager->socket, + *tmpManager->session->GetAsioSocket(), boost::asio::buffer(tmpPacket->GetRawData(), tmpPacket->GetLen()), boost::bind(&SendDataManager::HandleWrite, tmpManager, @@ -146,9 +148,9 @@ SenderThread::Main() } i = next; } - m_ioService.run_one(); - Msleep(SEND_TIMEOUT_MSEC); } + m_ioService.run_one(); + Msleep(SEND_TIMEOUT_MSEC); } } diff --git a/src/net/common/serverlobbythread.cpp b/src/net/common/serverlobbythread.cpp index 2f395121..3b9540b0 100644 --- a/src/net/common/serverlobbythread.cpp +++ b/src/net/common/serverlobbythread.cpp @@ -84,7 +84,7 @@ ServerLobbyThread::ServerLobbyThread(GuiInterface &gui, ConfigFile *playerConfig m_statDataChanged(false), m_startTime(boost::posix_time::second_clock::local_time()) { m_senderCallback.reset(new ServerSenderCallback(*this)); - m_sender.reset(new SenderThread(*m_senderCallback)); + m_sender.reset(new SenderThread(*m_senderCallback, m_ioService)); m_receiver.reset(new ReceiverHelper); } @@ -1055,7 +1055,7 @@ ServerLobbyThread::HandleNewConnection(boost::shared_ptr connData) //} // Create a new session. - boost::shared_ptr sessionData(new SessionData(connData->ReleaseSocket(), m_curSessionId++, m_sender, *m_senderCallback)); + boost::shared_ptr sessionData(new SessionData(connData->ReleaseSocket(), m_curSessionId++, m_sender, *m_senderCallback, m_ioService)); m_sessionManager.AddSession(sessionData); LOG_VERBOSE("Accepted connection - session #" << sessionData->GetId() << "."); diff --git a/src/net/common/sessiondata.cpp b/src/net/common/sessiondata.cpp index ddb05c63..a0989862 100644 --- a/src/net/common/sessiondata.cpp +++ b/src/net/common/sessiondata.cpp @@ -20,16 +20,19 @@ #include #include -SessionData::SessionData(SOCKET sockfd, SessionId id, boost::shared_ptr sender, SessionDataCallback &cb) -: m_sockfd(sockfd), m_id(id), m_state(SessionData::Init), m_readyFlag(false), +SessionData::SessionData(SOCKET sockfd, SessionId id, boost::shared_ptr sender, SessionDataCallback &cb, boost::asio::io_service &ioService) +: m_id(id), m_state(SessionData::Init), m_readyFlag(false), m_wantsLobbyMsg(true), m_activityTimeoutNoticeSent(false), m_callback(cb) { + m_socket.reset(new boost::asio::ip::tcp::socket( + ioService, boost::asio::ip::tcp::v6(), sockfd)); m_sender = sender; } SessionData::~SessionData() { m_callback.SignalSessionTerminated(m_id); + m_socket->cancel(); } SessionId @@ -54,10 +57,15 @@ SessionData::SetState(SessionData::State state) } SOCKET -SessionData::GetSocket() const +SessionData::GetSocket() { - // value never modified - no mutex needed. - return m_sockfd; + return m_socket->native(); +} + +boost::shared_ptr +SessionData::GetAsioSocket() +{ + return m_socket; } void diff --git a/src/net/senderthread.h b/src/net/senderthread.h index ce592c95..a1ff0c43 100644 --- a/src/net/senderthread.h +++ b/src/net/senderthread.h @@ -28,7 +28,6 @@ #include #include -#include class SessionData; #define SENDER_THREAD_TERMINATE_TIMEOUT THREAD_WAIT_INFINITE @@ -36,7 +35,7 @@ class SessionData; class SenderThread : public Thread, public SenderInterface { public: - SenderThread(SenderCallback &cb); + SenderThread(SenderCallback &cb, boost::asio::io_service& ioService); virtual ~SenderThread(); virtual void Start(); @@ -52,11 +51,9 @@ protected: class SendDataManager { public: - SendDataManager(boost::shared_ptr s, boost::asio::io_service &ioService) + SendDataManager(boost::shared_ptr s) : session(s), m_writeInProgress(false), m_completed(false) { - socket.reset(new boost::asio::ip::tcp::socket( - ioService, boost::asio::ip::tcp::v6(), s->GetSocket())); } void HandleWrite(const boost::system::error_code& error); @@ -86,7 +83,6 @@ protected: } boost::shared_ptr session; - boost::shared_ptr socket; SendDataList list; private: @@ -101,12 +97,11 @@ protected: private: - boost::asio::io_service m_ioService; - SendQueueMap m_sendQueueMap; mutable boost::mutex m_sendQueueMapMutex; SenderCallback &m_callback; + boost::asio::io_service &m_ioService; }; #endif diff --git a/src/net/serverlobbythread.h b/src/net/serverlobbythread.h index 7612d925..c8d45fbd 100644 --- a/src/net/serverlobbythread.h +++ b/src/net/serverlobbythread.h @@ -202,7 +202,6 @@ private: u_int32_t m_curSessionId; mutable boost::mutex m_curUniquePlayerIdMutex; - ServerStats m_statData; bool m_statDataChanged; mutable boost::mutex m_statMutex; @@ -212,6 +211,8 @@ private: boost::timers::portable::microsec_timer m_checkSessionTimeoutsTimer; const boost::posix_time::ptime m_startTime; + + boost::asio::io_service m_ioService; }; #endif diff --git a/src/net/sessiondata.h b/src/net/sessiondata.h index 63702924..c4dba413 100644 --- a/src/net/sessiondata.h +++ b/src/net/sessiondata.h @@ -29,6 +29,7 @@ typedef unsigned SessionId; #include #include #include +#include #define INVALID_SESSION 0 #define SESSION_ID_INIT INVALID_SESSION @@ -41,14 +42,15 @@ class SessionData public: enum State { Init, ReceivingAvatar, Established, Game }; - SessionData(SOCKET sockfd, SessionId id, boost::shared_ptr sender, SessionDataCallback &cb); + SessionData(SOCKET sockfd, SessionId id, boost::shared_ptr sender, SessionDataCallback &cb, boost::asio::io_service &ioService); ~SessionData(); SessionId GetId() const; State GetState() const; void SetState(State state); - SOCKET GetSocket() const; + SOCKET GetSocket(); + boost::shared_ptr GetAsioSocket(); void SetReadyFlag(); void ResetReadyFlag(); @@ -70,7 +72,7 @@ public: unsigned GetAutoDisconnectTimerElapsedSec() const; private: - SOCKET m_sockfd; + boost::shared_ptr m_socket; const SessionId m_id; State m_state; std::string m_clientAddr;