tanghai 15 лет назад
Родитель
Сommit
a3862ad445

+ 1 - 1
src/Experimental/chat/chat_message.cc

@@ -14,7 +14,7 @@
 #include <boost/bind.hpp>
 #include <boost/bind.hpp>
 #include <boost/asio.hpp>
 #include <boost/asio.hpp>
 #include <boost/thread.hpp>
 #include <boost/thread.hpp>
-#include "experimental/chat/chat_message.h"
+#include "Experimental/chat/chat_message.h"
 
 
 using boost::asio::ip::tcp;
 using boost::asio::ip::tcp;
 
 

+ 1 - 1
src/Experimental/chat/chat_server.cc

@@ -18,7 +18,7 @@
 #include <boost/shared_ptr.hpp>
 #include <boost/shared_ptr.hpp>
 #include <boost/enable_shared_from_this.hpp>
 #include <boost/enable_shared_from_this.hpp>
 #include <boost/asio.hpp>
 #include <boost/asio.hpp>
-#include "experimental/chat/chat_message.h"
+#include "Experimental/chat/chat_message.h"
 
 
 using boost::asio::ip::tcp;
 using boost::asio::ip::tcp;
 
 

+ 1 - 1
src/Experimental/chat/posix_chat_client.cc

@@ -14,7 +14,7 @@
 #include <boost/array.hpp>
 #include <boost/array.hpp>
 #include <boost/bind.hpp>
 #include <boost/bind.hpp>
 #include <boost/asio.hpp>
 #include <boost/asio.hpp>
-#include "experimental/chat/chat_message.h"
+#include "Experimental/chat/chat_message.h"
 
 
 #if defined(BOOST_ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
 #if defined(BOOST_ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
 
 

+ 3 - 3
src/Experimental/http_server/connection.cc

@@ -10,9 +10,9 @@
 
 
 #include <vector>
 #include <vector>
 #include <boost/bind.hpp>
 #include <boost/bind.hpp>
-#include "experimental/http_server/connection.h"
-#include "experimental/http_server/connection_manager.h"
-#include "experimental/http_server/request_handler.h"
+#include "Experimental/http_server/connection.h"
+#include "Experimental/http_server/connection_manager.h"
+#include "Experimental/http_server/request_handler.h"
 
 
 namespace http_server {
 namespace http_server {
 
 

+ 4 - 4
src/Experimental/http_server/connection.h

@@ -16,10 +16,10 @@
 #include <boost/noncopyable.hpp>
 #include <boost/noncopyable.hpp>
 #include <boost/shared_ptr.hpp>
 #include <boost/shared_ptr.hpp>
 #include <boost/enable_shared_from_this.hpp>
 #include <boost/enable_shared_from_this.hpp>
-#include "experimental/http_server/reply.h"
-#include "experimental/http_server/request.h"
-#include "experimental/http_server/request_handler.h"
-#include "experimental/http_server/request_parser.h"
+#include "Experimental/http_server/reply.h"
+#include "Experimental/http_server/request.h"
+#include "Experimental/http_server/request_handler.h"
+#include "Experimental/http_server/request_parser.h"
 
 
 namespace http_server {
 namespace http_server {
 
 

+ 1 - 1
src/Experimental/http_server/connection_manager.cc

@@ -10,7 +10,7 @@
 
 
 #include <algorithm>
 #include <algorithm>
 #include <boost/bind.hpp>
 #include <boost/bind.hpp>
-#include "experimental/http_server/connection_manager.h"
+#include "Experimental/http_server/connection_manager.h"
 
 
 namespace http_server {
 namespace http_server {
 
 

+ 1 - 1
src/Experimental/http_server/connection_manager.h

@@ -13,7 +13,7 @@
 
 
 #include <set>
 #include <set>
 #include <boost/noncopyable.hpp>
 #include <boost/noncopyable.hpp>
-#include "experimental/http_server/connection.h"
+#include "Experimental/http_server/connection.h"
 
 
 namespace http_server {
 namespace http_server {
 
 

+ 1 - 1
src/Experimental/http_server/mime_types.cc

@@ -8,7 +8,7 @@
 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 //
 //
 
 
-#include "experimental/http_server/mime_types.h"
+#include "Experimental/http_server/mime_types.h"
 
 
 namespace http_server {
 namespace http_server {
 namespace mime_types {
 namespace mime_types {

+ 1 - 1
src/Experimental/http_server/posix_main.cc

@@ -13,7 +13,7 @@
 #include <boost/asio.hpp>
 #include <boost/asio.hpp>
 #include <boost/thread.hpp>
 #include <boost/thread.hpp>
 #include <boost/bind.hpp>
 #include <boost/bind.hpp>
-#include "experimental/http_server/server.h"
+#include "Experimental/http_server/server.h"
 
 
 #include <pthread.h>
 #include <pthread.h>
 #include <signal.h>
 #include <signal.h>

+ 1 - 1
src/Experimental/http_server/reply.cc

@@ -10,7 +10,7 @@
 
 
 #include <string>
 #include <string>
 #include <boost/lexical_cast.hpp>
 #include <boost/lexical_cast.hpp>
-#include "experimental/http_server/reply.h"
+#include "Experimental/http_server/reply.h"
 
 
 namespace http_server {
 namespace http_server {
 
 

+ 1 - 1
src/Experimental/http_server/reply.h

@@ -14,7 +14,7 @@
 #include <string>
 #include <string>
 #include <vector>
 #include <vector>
 #include <boost/asio.hpp>
 #include <boost/asio.hpp>
-#include "experimental/http_server/header.h"
+#include "Experimental/http_server/header.h"
 
 
 namespace http_server {
 namespace http_server {
 
 

+ 1 - 1
src/Experimental/http_server/request.h

@@ -13,7 +13,7 @@
 
 
 #include <string>
 #include <string>
 #include <vector>
 #include <vector>
-#include "experimental/http_server/header.h"
+#include "Experimental/http_server/header.h"
 
 
 namespace http_server {
 namespace http_server {
 
 

+ 4 - 4
src/Experimental/http_server/request_handler.cc

@@ -12,10 +12,10 @@
 #include <sstream>
 #include <sstream>
 #include <string>
 #include <string>
 #include <boost/lexical_cast.hpp>
 #include <boost/lexical_cast.hpp>
-#include "experimental/http_server/request_handler.h"
-#include "experimental/http_server/mime_types.h"
-#include "experimental/http_server/reply.h"
-#include "experimental/http_server/request.h"
+#include "Experimental/http_server/request_handler.h"
+#include "Experimental/http_server/mime_types.h"
+#include "Experimental/http_server/reply.h"
+#include "Experimental/http_server/request.h"
 
 
 namespace http_server {
 namespace http_server {
 
 

+ 2 - 2
src/Experimental/http_server/request_parser.cc

@@ -8,8 +8,8 @@
 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 //
 //
 
 
-#include "experimental/http_server/request_parser.h"
-#include "experimental/http_server/request.h"
+#include "Experimental/http_server/request_parser.h"
+#include "Experimental/http_server/request.h"
 
 
 namespace http_server {
 namespace http_server {
 
 

+ 1 - 1
src/Experimental/http_server/server.cc

@@ -9,7 +9,7 @@
 //
 //
 
 
 #include <boost/bind.hpp>
 #include <boost/bind.hpp>
-#include "experimental/http_server/server.h"
+#include "Experimental/http_server/server.h"
 
 
 namespace http_server {
 namespace http_server {
 
 

+ 3 - 3
src/Experimental/http_server/server.h

@@ -14,9 +14,9 @@
 #include <boost/asio.hpp>
 #include <boost/asio.hpp>
 #include <string>
 #include <string>
 #include <boost/noncopyable.hpp>
 #include <boost/noncopyable.hpp>
-#include "experimental/http_server/connection.h"
-#include "experimental/http_server/connection_manager.h"
-#include "experimental/http_server/request_handler.h"
+#include "Experimental/http_server/connection.h"
+#include "Experimental/http_server/connection_manager.h"
+#include "Experimental/http_server/request_handler.h"
 
 
 namespace http_server {
 namespace http_server {
 
 

+ 72 - 0
src/Net/RpcServer.cc

@@ -0,0 +1,72 @@
+#include <boost/asio.hpp>
+#include "Net/RpcServer.h"
+#include "Net/RpcSession.h"
+
+namespace Hainan {
+
+typedef boost::unordered_set<RpcSessionPtr> RpcSessionSet;
+
+struct RpcServer::RpcServerFeild
+{
+	boost::asio::io_service io_service;
+	boost::asio::ip::tcp::acceptor acceptor;
+	RpcSessionSet sessions;
+
+	RpcServerFeild();
+	~RpcServerFeild();
+};
+
+RpcServer::RpcServerFeild::RpcServerFeild():
+		io_service(), acceptor(io_service)
+{
+}
+
+RpcServer::RpcServerFeild::~RpcServerFeild()
+{
+}
+
+RpcServer::RpcServer(std::string& host, int port):
+		rpc_server(new RpcServer::RpcServerFeild())
+{
+	boost::asio::ip::address address;
+	address.from_string(host);
+	boost::asio::ip::tcp::endpoint endpoint(address, port);
+	rpc_server->acceptor.open(endpoint.protocol());
+	rpc_server->acceptor.set_option(
+			boost::asio::ip::tcp::acceptor::reuse_address(true));
+	rpc_server->acceptor.bind(endpoint);
+	rpc_server->acceptor.listen();
+	RpcSessionPtr session(new RpcSession(
+			rpc_server->io_service,
+			rpc_server->sessions));
+	rpc_server->acceptor.async_accept(session->socket(),
+			boost::bind(&RpcServer::HandleAsyncAccept, this,
+					boost::asio::placeholders::error));
+}
+
+void RpcServer::HandleAsyncAccept(RpcSessionSet session,
+		const boost::system::error_code& err)
+{
+	if (err)
+	{
+		return;
+	}
+	session->Start();
+	rpc_server->sessions.insert(session);
+	RpcSessionPtr session(new RpcSession(
+			rpc_server->io_service,
+			rpc_server->sessions));
+	rpc_server->acceptor.async_accept(session->socket(),
+			boost::bind(&RpcServer::HandleAsyncAccept, this,
+					boost::asio::placeholders::error));
+}
+
+void RpcServer::AsyncConnect()
+{
+}
+
+void RpcServer::Stop()
+{
+}
+
+} // namespace Hainan

+ 20 - 0
src/Net/RpcServer.h

@@ -0,0 +1,20 @@
+#ifndef NET_RPC_SERVER_H
+#define NET_RPC_SERVER_H
+
+namespace Hainan {
+
+class RpcServer
+{
+private:
+	struct RpcServerFeild;
+	boost::scoped_ptr<RpcServerFeild> rpc_server;
+public:
+	RpcServer();
+	~RpcServer();
+	void Start();
+	void Stop();
+};
+
+} // namespace Hainan
+
+#endif // NET_RPC_SERVER_H

+ 65 - 0
src/Net/RpcSession.cc

@@ -0,0 +1,65 @@
+#include "Net/RpcSession.h"
+
+namespace Hainan {
+
+typedef boost::unordered_set<RpcSessionPtr> RpcSessionSet;
+
+struct RpcSession::RpcSessionFeild
+{
+	boost::array<char, 8192> buffer;
+	boost::asio::ip::tcp::socket socket;
+	RpcSessionSet& sessions;
+
+	RpcSessionFeild();
+	~RpcSessionFeild();
+};
+
+RpcSession::RpcSession(): rpc_session(new RpcSessionFeild())
+{
+}
+
+boost::asio::ip::tcp::socket& RpcSession::Socket()
+{
+	return rpc_session->socket;
+}
+
+void RpcSession::Start()
+{
+	boost::asio::async_read(boost::asio::buffer(rpc_session->buffer),
+			boost::bind(&RpcSession::HandleAsyncRead, shared_from_this(),
+					boost::asio::placeholders::bytes_transferred,
+					boost::asio::placeholders::error));
+}
+
+void RpcSession::HandleAsyncRead(std::size_t bytes_transferred,
+		const boost::system::error_code& err)
+{
+	if (!err)
+	{
+		bool result;
+		result = request_parser.parse();
+
+		if (result)
+		{
+
+		}
+		else
+		{
+			boost::asio::async_read(boost::asio::buffer(buffer),
+					boost::bind(&RpcSession::HandleAsyncRead, shared_from_this(),
+							boost::asio::placeholders::bytes_transferred,
+							boost::asio::placeholders::error));
+		}
+	}
+	else if (err != boost::asio::error::operation_aborted)
+	{
+		rpc_session->sessions.erase(shared_from_this());
+	}
+}
+
+void RpcSession::Stop()
+{
+	rpc_session->socket.close();
+}
+
+}

+ 32 - 0
src/Net/RpcSession.h

@@ -0,0 +1,32 @@
+#ifndef NET_RPC_SESSION_H
+#define NET_RPC_SESSION_H
+
+#include <boost/asio.hpp>
+#include <boost/array.hpp>
+#include <boost/noncopyable.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/enable_shared_from_this.hpp>
+
+namespace Hainan {
+
+class RpcSession:
+		public boost::enable_shared_from_this<RpcSession>,
+		private boost::noncopyable
+{
+private:
+	struct RpcSessionFeild;
+	boost::scoped_ptr<RpcSessionFeild> rpc_session;
+
+public:
+	RpcSession();
+	~RpcSession();
+	boost::asio::ip::tcp::socket& Socket();
+	void Start();
+	void Stop();
+};
+
+typedef boost::shared_ptr<RpcSession> RpcSessionPtr;
+
+}
+
+#endif // NET_RPC_SESSION_H

+ 7 - 3
src/Thread/ThreadPool.cc

@@ -5,9 +5,12 @@
 namespace Hainan {
 namespace Hainan {
 
 
 ThreadPool::ThreadPool(int num) :
 ThreadPool::ThreadPool(int num) :
-	thread_num(num? num : boost::thread::hardware_concurrency()),
-	work_num(thread_num), running(false), work_num(0)
+	thread_num(num), running(false), work_num(0)
 {
 {
+	if (num == 0)
+	{
+		thread_num = boost::thread::hardware_concurrency();
+	}
 }
 }
 
 
 ThreadPool::~ThreadPool()
 ThreadPool::~ThreadPool()
@@ -19,10 +22,11 @@ void ThreadPool::Start()
 	running = true;
 	running = true;
 	for (int i = 0; i < thread_num; ++i)
 	for (int i = 0; i < thread_num; ++i)
 	{
 	{
-		thread_ptr t(new boost::thread(
+		ThreadPtr t(new boost::thread(
 				boost::bind(&ThreadPool::Runner, this)));
 				boost::bind(&ThreadPool::Runner, this)));
 		threads.push_back(t);
 		threads.push_back(t);
 		t->detach();
 		t->detach();
+		++work_num;
 	}
 	}
 }
 }