summaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authorGluzskiy Alexandr <sss@sss.chaoslab.ru>2011-10-21 00:52:02 +0300
committerGluzskiy Alexandr <sss@sss.chaoslab.ru>2011-10-21 00:52:02 +0300
commit1c2b5be3f0deb7f46405087d8903d2c26cfc6eda (patch)
tree0590d4d6964fa829f70ce35da45fe9968720f6fb /server
parenta3fb8e2a714e4f0758019d1ce4853d65649a8a57 (diff)
подготовка протокола обмена данными
Diffstat (limited to 'server')
-rw-r--r--server/proxy_ui_server.workspace4
-rw-r--r--server/server/main.cpp139
-rw-r--r--server/server/main.h26
3 files changed, 57 insertions, 112 deletions
diff --git a/server/proxy_ui_server.workspace b/server/proxy_ui_server.workspace
index 075d714..6c4621d 100644
--- a/server/proxy_ui_server.workspace
+++ b/server/proxy_ui_server.workspace
@@ -10,8 +10,6 @@
</WorkspaceConfiguration>
</BuildMatrix>
<Environment>
- <![CDATA[
-
- ]]>
+ <![CDATA[]]>
</Environment>
</CodeLite_Workspace>
diff --git a/server/server/main.cpp b/server/server/main.cpp
index c7e69f7..a85efd6 100644
--- a/server/server/main.cpp
+++ b/server/server/main.cpp
@@ -12,8 +12,6 @@ config *cfg;
session::session(boost::asio::io_service& io_service, boost::asio::ssl::context& context, server *serv) : socket_(io_service, context), io_service_(io_service)
{
this_sid = get_random(8);
- recv_data_[0] = 0;
- snd_data_[0] = 0;
server_ = serv;
blacklisted = canceled = false;
}
@@ -92,7 +90,7 @@ void session::handle_handshake(const boost::system::error_code& error)
logger->unlock();
}
if (!error)
- socket_.async_read_some(boost::asio::buffer(recv_data_, max_length), boost::bind(&session::handle_read, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
+ socket_.async_read_some(boost::asio::buffer(recv_data_, 1024), boost::bind(&session::handle_read, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
else
delete this;
}
@@ -105,9 +103,16 @@ void session::handle_write(const boost::system::error_code& error, size_t bytes_
logger->unlock();
}
if(!error)
- socket_.async_read_some(boost::asio::buffer(recv_data_, max_length), boost::bind(&session::handle_read, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
+ {
+ recv_data_ = new byte[64];
+ socket_.async_read_some(boost::asio::buffer(recv_data_, 64), boost::bind(&session::handle_read, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
+ delete [] snd_data_;
+ }
else
+ {
+ delete [] snd_data_;
delete this;
+ }
}
void session::handle_write_close(const boost::system::error_code& error, size_t bytes_transferred)
{
@@ -117,6 +122,7 @@ void session::handle_write(const boost::system::error_code& error, size_t bytes_
*logger << time_str() << ": following write error occured: " << error.message() << " for client " << remote_ip << " session " << this_sid << "\n";
logger->unlock();
}
+ delete [] snd_data_;
delete this;
}
void session::handle_auth_server_reply(const boost::system::error_code& error, size_t bytes_transferred)
@@ -142,106 +148,52 @@ void session::proto_parser(std::vector<byte>& data)
if(begin != data.end())
{
std::vector<byte> local_data(begin, end);
- std::vector<byte>::iterator it = std::find(local_data.begin(), local_data.end(), data_type_begin);
+ std::vector<byte>::iterator it = begin + 2;
if(it != local_data.end())
{
++it;
switch(*it)
{
- case 0xa0: //login request
+ case 0x01: //request type 1
{
+ if(canceled)
+ {
+ delete this;
+ break;
+ }
logger->lock();
- *logger<< time_str() << ": recieved login request from "<<remote_ip << " session " << this_sid <<"\n";
+ *logger<< time_str() << ": recieved request type 1 "<<remote_ip << " session " << this_sid <<"\n";
logger->unlock();
- //fill snd_data_
if(!blacklisted)
{
logger->lock();
- *logger<< time_str() << ": login request from "<<remote_ip<< " session " << this_sid << " are permited \n";
+ *logger<< time_str() << ": request type 1 from "<<remote_ip<< " session " << this_sid << " are permited \n";
logger->unlock();
- std::vector<byte>::iterator p1 = std::search(local_data.begin(), local_data.end(), delim, delim + 2);
- if(p1 != local_data.end())
- {
- p1 +=2;
- std::vector<byte>::iterator p2 = std::find(local_data.begin(), local_data.end(),data_c_end);
- if(p2 == local_data.end())
- delete this;
- std::vector<byte> tmp_vec(p1, p2);
- if(tmp_vec[0] < proto_version)
- {
- logger->lock();
- *logger<< time_str() << ": old client version, login denied " << remote_ip <<" session " << this_sid << "\n";
- logger->unlock();
- const unsigned char buf [] = {0x83, 0x83, 0xDA, 0xB0, 0xDB, 0xAA, 0xAB, 0x15, 0x15, 0xAC, 0x84, 0x84}; //login not permited
- memset(snd_data_, 0, 1024);
- for(int i = 0; i < sizeof(buf); i++)
- snd_data_[i] = buf[i];
- socket_.async_write_some(boost::asio::buffer(snd_data_, max_length), boost::bind(&session::handle_write_close, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
- }
- else
- {
- const unsigned char buf [] = {0x83, 0x83, 0xDA, 0xB0, 0xDB, 0xAA, 0xAB, 0x13, 0x13, 0xAC, 0x84, 0x84}; //login permited
- memset(snd_data_, 0, 1024);
- for(int i = 0; i < sizeof(buf); i++)
- snd_data_[i] = buf[i];
- socket_.async_write_some(boost::asio::buffer(snd_data_, max_length), boost::bind(&session::handle_write, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
- }
- }
- else
- {
- logger->lock();
- *logger<< time_str() << ": WARNING old client version, allowed old clients for now " << remote_ip <<" session " << this_sid << "\n";
- logger->unlock();
- const unsigned char buf [] = {0x83, 0x83, 0xDA, 0xB0, 0xDB, 0xAA, 0xAB, 0x13, 0x13, 0xAC, 0x84, 0x84}; //login permited
- memset(snd_data_, 0, 1024);
- for(int i = 0; i < sizeof(buf); i++)
- snd_data_[i] = buf[i];
- socket_.async_write_some(boost::asio::buffer(snd_data_, max_length), boost::bind(&session::handle_write, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
- }
+ std::vector<byte> data;
+ data.push_back(0x13);
+ data.push_back(0x13);
+ data.push_back(0x01);
+ //TODO: add data here
+ data.push_back(0x14);
+ data.push_back(0x14);
+ write_w_close(data);
}
else
{
logger->lock();
- *logger<< time_str() << ": login request from "<<remote_ip << " session " << this_sid <<" are denied \n";
+ *logger<< time_str() << ": request type 1 from "<<remote_ip << " session " << this_sid <<" are denied \n";
logger->unlock();
- const unsigned char buf [] = {0x83, 0x83, 0xDA, 0xB0, 0xDB, 0xAA, 0xAB, 0x66, 0x66, 0xAC, 0x84, 0x84}; //login denied
- memset(snd_data_, 0, 1024);
- for(int i = 0; i < sizeof(buf); i++)
- snd_data_[i] = buf[i];
- socket_.async_write_some(boost::asio::buffer(snd_data_, max_length), boost::bind(&session::handle_write_close, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
- }
- }
- break;
- case 0xa1: //main acc login request
- {
- logger->lock();
- *logger<< time_str() << ": recieved main account login info from " << remote_ip <<" session " << this_sid << "\n";
- logger->unlock();
- delete this;
- }
- break;
- case 0xa2: //subacc login request
- {
- if(canceled)
- {
- delete this;
- break;
- }
- delete this;
- }
- break;
- case 0xa3:
- {
- if(canceled)
- {
- delete this;
- break;
+ std::vector<byte> data;
+ data.push_back(0x13);
+ data.push_back(0x13);
+ data.push_back(0x66);
+ data.push_back(0x14);
+ data.push_back(0x14);
+ write_w_close(data);
}
- delete this;
}
break;
default:
- socket_.async_read_some(boost::asio::buffer(recv_data_, max_length), boost::bind(&session::handle_read, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
break;
}
}
@@ -256,7 +208,8 @@ void session::set_sid(std::string _sid)
}
void session::write_w_close(std::vector<byte>& data)
{
- memset(snd_data_, 0, 1024);
+ snd_data_ = new byte[data.size() + 1];
+ memset(snd_data_, 0, data.size() + 1);
for(int i = 0; i < data.size(); i++)
snd_data_[i] = data[i];
if(cfg->debug())
@@ -265,12 +218,13 @@ void session::write_w_close(std::vector<byte>& data)
*logger<< time_str() << ": Requested data write with socket close for " << remote_ip << " session " << this_sid << "\n";
logger->unlock();
}
- socket_.async_write_some(boost::asio::buffer(snd_data_, max_length), boost::bind(&session::handle_write_close, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
+ socket_.async_write_some(boost::asio::buffer(snd_data_, data.size() + 1), boost::bind(&session::handle_write_close, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
}
void session::write_w_response(std::vector<byte>& data)
{
- memset(snd_data_, 0, 1024);
+ snd_data_ = new byte[data.size()+1];
+ memset(snd_data_, 0, data.size()+1);
for(int i = 0; i < data.size(); i++)
snd_data_[i] = data[i];
if(cfg->debug())
@@ -279,12 +233,13 @@ void session::write_w_response(std::vector<byte>& data)
*logger<< time_str() << ": Requested data write with response for " << remote_ip << " session " << this_sid << "\n";
logger->unlock();
}
- socket_.async_write_some(boost::asio::buffer(snd_data_, max_length), boost::bind(&session::handle_write, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
+ socket_.async_write_some(boost::asio::buffer(snd_data_, data.size()+1), boost::bind(&session::handle_write, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
}
void session::write_wo_response(std::vector<byte>& data)
{
- memset(snd_data_, 0, 1024);
+ snd_data_ = new byte[data.size()+1];
+ memset(snd_data_, 0, data.size()+1);
for(int i = 0; i < data.size(); i++)
snd_data_[i] = data[i];
if(cfg->debug())
@@ -293,13 +248,13 @@ void session::write_wo_response(std::vector<byte>& data)
*logger<< time_str() << ": Requested data write with out response for " << remote_ip << " session " << this_sid << "\n";
logger->unlock();
}
- socket_.async_write_some(boost::asio::buffer(snd_data_, max_length), boost::bind(&session::handle_operation, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
+ socket_.async_write_some(boost::asio::buffer(snd_data_, data.size() +1), boost::bind(&session::handle_operation, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
}
void session::handle_operation(const boost::system::error_code& error, size_t bytes_transferred)
{
-
+ delete [] snd_data_;
}
void session::handle_read(const boost::system::error_code& error, size_t bytes_transferred)
@@ -321,9 +276,13 @@ void session::handle_read(const boost::system::error_code& error, size_t bytes_t
}
std::vector<byte> copy(recv_data_, recv_data_ + bytes_transferred);
proto_parser(copy);
+ delete [] recv_data_;
}
else
+ {
+ delete [] recv_data_;
delete this;
+ }
}
catch (std::exception& e)
{
diff --git a/server/server/main.h b/server/server/main.h
index 655aeff..c7eb853 100644
--- a/server/server/main.h
+++ b/server/server/main.h
@@ -7,21 +7,10 @@ typedef boost::asio::ssl::stream<boost::asio::ip::tcp::socket> ssl_socket;
using boost::asio::ip::tcp;
typedef unsigned char byte;
-const byte proto_version = 0x01;
+const byte proto_version = 0x02;
-const byte data_begin [] = {0x83, 0x83};
-const byte data_end [] = {0x84, 0x84};
-const byte data_type_begin = 0xda;
-const byte data_type_end = 0xdb;
-const byte _eq = 0xaa;
-const byte data_c_begin = 0xab;
-const byte delim [] = {0xaa, 0xab};
-const byte data_c_delim = 0xad;
-const byte data_c_end = 0xac;
-const byte sid_begin = 0xca;
-const byte sid_end = 0xcb;
-const byte reply_success [] = {0x13, 0x13};
-const byte reply_failure [] = {0x66, 0x66};
+const byte data_begin [] = {0x13, 0x13};
+const byte data_end [] = {0x14, 0x14};
class session;
class server;
@@ -53,9 +42,8 @@ public:
void handle_read(const boost::system::error_code& error, size_t bytes_transferred);
private:
ssl_socket socket_;
- enum { max_length = 2048 };
- unsigned char recv_data_[max_length];
- unsigned char snd_data_[max_length];
+ unsigned char *recv_data_;
+ unsigned char *snd_data_;
boost::asio::io_service& io_service_;
std::string sid, remote_ip, this_sid;
server *server_;
@@ -80,11 +68,11 @@ struct conn_count
}
const bool operator==(const conn_count& c)
{
- return this->ip == c.ip;
+ return ip == c.ip;
}
const bool operator==(const std::string& c)
{
- return this->ip == c;
+ return ip == c;
}
};