update network part
This commit is contained in:
parent
74149c46ac
commit
dca2fb7a9a
22 changed files with 1273 additions and 282 deletions
|
@ -22,11 +22,11 @@ var _networkconnection = NetworkConnection.new()
|
||||||
func _ready():
|
func _ready():
|
||||||
pass
|
pass
|
||||||
|
|
||||||
func send_system_login(host, port, user_addr, user_key, user_id, lang):
|
#func send_system_login(host, port, user_addr, user_key, user_id, lang):
|
||||||
_networkconnection.define_server(host, port)
|
# _networkconnection.define_server(host, port)
|
||||||
_networkconnection.define_user(user_addr, user_key, user_id)
|
# _networkconnection.define_user(user_addr, user_key, user_id)
|
||||||
_networkconnection.define_lang(lang)
|
# _networkconnection.define_lang(lang)
|
||||||
_networkconnection.send_system_login()
|
# _networkconnection.connect_to_server()
|
||||||
|
|
||||||
func send_system_quit():
|
func send_system_quit():
|
||||||
_networkconnection.send_system_quit()
|
_networkconnection.send_system_quit()
|
||||||
|
@ -38,7 +38,11 @@ func disconnect_server():
|
||||||
_networkconnection.disconnect_server()
|
_networkconnection.disconnect_server()
|
||||||
|
|
||||||
func connect_to_server(host, port, user_addr, user_key, user_id, lang):
|
func connect_to_server(host, port, user_addr, user_key, user_id, lang):
|
||||||
send_system_login(host, port, user_addr, user_key, user_id, lang)
|
_networkconnection.define_server(host, port)
|
||||||
|
_networkconnection.define_user(user_addr, user_key, user_id)
|
||||||
|
_networkconnection.define_lang(lang)
|
||||||
|
_networkconnection.connect_to_server()
|
||||||
|
#send_system_login(host, port, user_addr, user_key, user_id, lang)
|
||||||
|
|
||||||
func _process(delta):
|
func _process(delta):
|
||||||
_networkconnection.process(delta)
|
_networkconnection.process(delta)
|
||||||
|
|
|
@ -18,12 +18,12 @@ func test_init():
|
||||||
assert(res == 0)
|
assert(res == 0)
|
||||||
bitstreamqueue.clear()
|
bitstreamqueue.clear()
|
||||||
|
|
||||||
res = bitstreamqueue.get_received_number(0)
|
res = bitstreamqueue.length()
|
||||||
assert(res == 0)
|
assert(res == 0)
|
||||||
|
|
||||||
func test_msg_1():
|
func test_msg_1():
|
||||||
var bitstreamqueue = BitStreamQueue.new()
|
var bitstreamqueue = BitStreamQueue.new()
|
||||||
var pos
|
var index
|
||||||
var res
|
var res
|
||||||
var tmp = PoolByteArray()
|
var tmp = PoolByteArray()
|
||||||
tmp.append(0)
|
tmp.append(0)
|
||||||
|
@ -32,29 +32,39 @@ func test_msg_1():
|
||||||
tmp.append(3)
|
tmp.append(3)
|
||||||
tmp.append(2)
|
tmp.append(2)
|
||||||
|
|
||||||
res = bitstreamqueue.length()
|
var data = BitStream.new()
|
||||||
assert(res == 0)
|
assert(bitstreamqueue.length() == 0)
|
||||||
|
|
||||||
pos = bitstreamqueue.put_msgbytes(tmp)
|
data.put_data(tmp)
|
||||||
|
var id = data.get_uint32()
|
||||||
|
assert(id == 3)
|
||||||
|
|
||||||
res = bitstreamqueue.get_received_number(pos)
|
var bitstreamfield = BitStreamField.new()
|
||||||
assert(res == 3)
|
bitstreamfield.put_id(id)
|
||||||
|
bitstreamfield.put_msgin(data)
|
||||||
|
|
||||||
res = bitstreamqueue.get_msg(pos)
|
index = bitstreamqueue.put_bitstreamfield(bitstreamfield)
|
||||||
|
assert(index == 0)
|
||||||
|
|
||||||
|
assert(bitstreamqueue.length() == 1)
|
||||||
|
#res = bitstreamqueue.get_received_number(pos)
|
||||||
|
#assert(res == 3)
|
||||||
|
|
||||||
|
res = bitstreamqueue.get_msg(index)
|
||||||
#print(res.show())
|
#print(res.show())
|
||||||
assert(res.show() == "0000000000000000000000000000001100000010")
|
assert(res.get_msgin().show() == "0000000000000000000000000000001100000010")
|
||||||
|
|
||||||
res = bitstreamqueue.get_received_number(pos)
|
#res = bitstreamqueue.get_msg_withid(id)
|
||||||
assert(res == 3)
|
#assert(res == 3)
|
||||||
res = bitstreamqueue.length()
|
res = bitstreamqueue.length()
|
||||||
assert(res == 1)
|
assert(res == 1)
|
||||||
bitstreamqueue.erase(pos)
|
bitstreamqueue.erase_index(index)
|
||||||
res = bitstreamqueue.length()
|
res = bitstreamqueue.length()
|
||||||
assert(res == 0)
|
assert(res == 0)
|
||||||
|
|
||||||
func test_msg_2():
|
func test_msg_2():
|
||||||
var bitstreamqueue = BitStreamQueue.new()
|
var bitstreamqueue = BitStreamQueue.new()
|
||||||
var pos
|
var index
|
||||||
var res
|
var res
|
||||||
var tmp = PoolByteArray()
|
var tmp = PoolByteArray()
|
||||||
tmp.append(0)
|
tmp.append(0)
|
||||||
|
@ -63,17 +73,151 @@ func test_msg_2():
|
||||||
tmp.append(2)
|
tmp.append(2)
|
||||||
tmp.append(7)
|
tmp.append(7)
|
||||||
|
|
||||||
pos = bitstreamqueue.put_msgbytes(tmp)
|
|
||||||
|
|
||||||
res = bitstreamqueue.get_received_number(pos)
|
var data = BitStream.new()
|
||||||
assert(res == 2)
|
assert(bitstreamqueue.length() == 0)
|
||||||
|
|
||||||
res = bitstreamqueue.get_msg(pos)
|
data.put_data(tmp)
|
||||||
|
var id = data.get_uint32()
|
||||||
|
assert(id == 2)
|
||||||
|
|
||||||
|
var bitstreamfield = BitStreamField.new()
|
||||||
|
bitstreamfield.put_id(id)
|
||||||
|
bitstreamfield.put_msgin(data)
|
||||||
|
|
||||||
|
index = bitstreamqueue.put_bitstreamfield(bitstreamfield)
|
||||||
|
assert(index == 0)
|
||||||
|
|
||||||
|
assert(bitstreamqueue.length() == 1)
|
||||||
|
|
||||||
|
res = bitstreamqueue.get_msg(index)
|
||||||
#print(res.show())
|
#print(res.show())
|
||||||
assert(res.show() == "0000000000000000000000000000001000000111")
|
assert(res.get_msgin().show() == "0000000000000000000000000000001000000111")
|
||||||
|
assert(res.get_id() == 2)
|
||||||
|
|
||||||
|
func test_msg_3():
|
||||||
|
var bitstreamqueue = BitStreamQueue.new()
|
||||||
|
var index
|
||||||
|
var res
|
||||||
|
var tmp = PoolByteArray()
|
||||||
|
tmp.append(0)
|
||||||
|
tmp.append(0)
|
||||||
|
tmp.append(0)
|
||||||
|
tmp.append(2)
|
||||||
|
tmp.append(7)
|
||||||
|
|
||||||
|
var data = BitStream.new()
|
||||||
|
assert(bitstreamqueue.length() == 0)
|
||||||
|
|
||||||
|
data.put_data(tmp)
|
||||||
|
var id = data.get_uint32()
|
||||||
|
assert(id == 2)
|
||||||
|
|
||||||
|
var bitstreamfield = BitStreamField.new()
|
||||||
|
bitstreamfield.put_id(id)
|
||||||
|
bitstreamfield.put_msgin(data)
|
||||||
|
|
||||||
|
index = bitstreamqueue.put_bitstreamfield(bitstreamfield)
|
||||||
|
assert(index == 0)
|
||||||
|
|
||||||
|
assert(bitstreamqueue.length() == 1)
|
||||||
|
|
||||||
|
res = bitstreamqueue.get_msg(index)
|
||||||
|
#print(res.show())
|
||||||
|
assert(res.get_msgin().show() == "0000000000000000000000000000001000000111")
|
||||||
|
assert(res.get_id() == 2)
|
||||||
|
|
||||||
|
tmp = PoolByteArray()
|
||||||
|
tmp.append(0)
|
||||||
|
tmp.append(0)
|
||||||
|
tmp.append(0)
|
||||||
|
tmp.append(3)
|
||||||
|
tmp.append(2)
|
||||||
|
|
||||||
|
data = BitStream.new()
|
||||||
|
assert(bitstreamqueue.length() == 1)
|
||||||
|
data.put_data(tmp)
|
||||||
|
id = data.get_uint32()
|
||||||
|
assert(id == 3)
|
||||||
|
bitstreamfield = BitStreamField.new()
|
||||||
|
bitstreamfield.put_id(id)
|
||||||
|
bitstreamfield.put_msgin(data)
|
||||||
|
index = bitstreamqueue.put_bitstreamfield(bitstreamfield)
|
||||||
|
assert(index == 1)
|
||||||
|
assert(bitstreamqueue.length() == 2)
|
||||||
|
res = bitstreamqueue.get_msg(index)
|
||||||
|
#print(res.show())
|
||||||
|
assert(res.get_msgin().show() == "0000000000000000000000000000001100000010")
|
||||||
|
assert(res.get_id() == 3)
|
||||||
|
|
||||||
|
tmp = PoolByteArray()
|
||||||
|
tmp.append(0)
|
||||||
|
tmp.append(0)
|
||||||
|
tmp.append(0)
|
||||||
|
tmp.append(1)
|
||||||
|
tmp.append(2)
|
||||||
|
|
||||||
|
data = BitStream.new()
|
||||||
|
assert(bitstreamqueue.length() == 2)
|
||||||
|
data.put_data(tmp)
|
||||||
|
id = data.get_uint32()
|
||||||
|
assert(id == 1)
|
||||||
|
bitstreamfield = BitStreamField.new()
|
||||||
|
bitstreamfield.put_id(id)
|
||||||
|
bitstreamfield.put_msgin(data)
|
||||||
|
index = bitstreamqueue.put_bitstreamfield(bitstreamfield)
|
||||||
|
assert(index == 2)
|
||||||
|
assert(bitstreamqueue.length() == 3)
|
||||||
|
res = bitstreamqueue.get_msg(index)
|
||||||
|
#print(res.show())
|
||||||
|
assert(res.get_msgin().show() == "0000000000000000000000000000000100000010")
|
||||||
|
assert(res.get_id() == 1)
|
||||||
|
|
||||||
|
assert(bitstreamqueue.length() == 3)
|
||||||
|
|
||||||
|
bitstreamqueue.erase_id(1)
|
||||||
|
assert(bitstreamqueue.length() == 2)
|
||||||
|
|
||||||
|
|
||||||
|
func step(id, data, bitstreamqueue):
|
||||||
|
var tmp = PoolByteArray()
|
||||||
|
tmp.append(0)
|
||||||
|
tmp.append(0)
|
||||||
|
tmp.append(0)
|
||||||
|
tmp.append(id)
|
||||||
|
tmp.append(data)
|
||||||
|
|
||||||
|
data = BitStream.new()
|
||||||
|
data.put_data(tmp)
|
||||||
|
var lid = data.get_uint32()
|
||||||
|
assert(lid == id)
|
||||||
|
var bitstreamfield = BitStreamField.new()
|
||||||
|
bitstreamfield.put_id(id)
|
||||||
|
bitstreamfield.put_msgin(data)
|
||||||
|
return bitstreamqueue.put_bitstreamfield(bitstreamfield)
|
||||||
|
|
||||||
|
func test_msg_4():
|
||||||
|
var bitstreamqueue = BitStreamQueue.new()
|
||||||
|
var index1
|
||||||
|
var index2
|
||||||
|
var index3
|
||||||
|
var index4
|
||||||
|
|
||||||
|
assert(bitstreamqueue.length() == 0)
|
||||||
|
index1 = step(1,1,bitstreamqueue)
|
||||||
|
assert(bitstreamqueue.length() == 1)
|
||||||
|
index2 = step(2,2,bitstreamqueue)
|
||||||
|
assert(bitstreamqueue.length() == 2)
|
||||||
|
index3 = step(3,3,bitstreamqueue)
|
||||||
|
assert(bitstreamqueue.length() == 3)
|
||||||
|
bitstreamqueue.erase_id(2)
|
||||||
|
assert(bitstreamqueue.length() == 2)
|
||||||
|
index4 = step(4,4,bitstreamqueue)
|
||||||
|
assert(bitstreamqueue.length() == 3)
|
||||||
|
|
||||||
|
index3 = step(5,5,bitstreamqueue)
|
||||||
|
assert(bitstreamqueue.length() == 4)
|
||||||
|
|
||||||
res = bitstreamqueue.get_received_number(pos)
|
|
||||||
assert(res == 2)
|
|
||||||
|
|
||||||
|
|
||||||
func test():
|
func test():
|
||||||
|
@ -81,4 +225,6 @@ func test():
|
||||||
test_init()
|
test_init()
|
||||||
test_msg_1()
|
test_msg_1()
|
||||||
test_msg_2()
|
test_msg_2()
|
||||||
|
test_msg_3()
|
||||||
|
test_msg_4()
|
||||||
print("[bitstreamqueue] Start check -> end")
|
print("[bitstreamqueue] Start check -> end")
|
||||||
|
|
|
@ -147,7 +147,6 @@ margin_right = 627.0
|
||||||
margin_bottom = 188.0
|
margin_bottom = 188.0
|
||||||
|
|
||||||
[node name="checkboxs_box" type="VBoxContainer" parent="h_box_container/v_box_container/margin_container/login_box/h_box_container"]
|
[node name="checkboxs_box" type="VBoxContainer" parent="h_box_container/v_box_container/margin_container/login_box/h_box_container"]
|
||||||
editor/display_folded = true
|
|
||||||
margin_right = 228.0
|
margin_right = 228.0
|
||||||
margin_bottom = 40.0
|
margin_bottom = 40.0
|
||||||
|
|
||||||
|
|
|
@ -336,6 +336,14 @@ void BitStream::put_data(PoolByteArray value)
|
||||||
this->_pos = value.size() * 8;
|
this->_pos = value.size() * 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void BitStream::put_bitstream(Ref<BitStream> value)
|
||||||
|
{
|
||||||
|
this->_data = value->_data; //*value.ptr();
|
||||||
|
this->_pos = value->_pos; // ->size() * 8;
|
||||||
|
this->_read = value->_read;
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t BitStream::get_serial(uint32_t nbits)
|
uint32_t BitStream::get_serial(uint32_t nbits)
|
||||||
{
|
{
|
||||||
uint32_t value;
|
uint32_t value;
|
||||||
|
|
|
@ -65,6 +65,8 @@ public:
|
||||||
PoolByteArray get_data();
|
PoolByteArray get_data();
|
||||||
void put_data(PoolByteArray value);
|
void put_data(PoolByteArray value);
|
||||||
|
|
||||||
|
void put_bitstream(Ref<BitStream> value);
|
||||||
|
|
||||||
uint32_t get_serial(uint32_t nbits);
|
uint32_t get_serial(uint32_t nbits);
|
||||||
bool get_bool();
|
bool get_bool();
|
||||||
int8_t get_sint8();
|
int8_t get_sint8();
|
||||||
|
|
|
@ -23,130 +23,116 @@
|
||||||
#include "bitstreamqueue.h"
|
#include "bitstreamqueue.h"
|
||||||
#include "core/os/os.h"
|
#include "core/os/os.h"
|
||||||
|
|
||||||
|
void BitStreamField::_bind_methods()
|
||||||
|
{
|
||||||
|
ClassDB::bind_method(D_METHOD("get_id"), &BitStreamField::get_id);
|
||||||
|
ClassDB::bind_method(D_METHOD("get_msgin"), &BitStreamField::get_msgin);
|
||||||
|
ClassDB::bind_method(D_METHOD("put_id", "id"), &BitStreamField::put_id);
|
||||||
|
ClassDB::bind_method(D_METHOD("put_msgin", "msgin"), &BitStreamField::put_msgin);
|
||||||
|
}
|
||||||
|
|
||||||
void BitStreamQueue::_bind_methods()
|
void BitStreamQueue::_bind_methods()
|
||||||
{
|
{
|
||||||
ClassDB::bind_method(D_METHOD("clear"), &BitStreamQueue::clear);
|
ClassDB::bind_method(D_METHOD("clear"), &BitStreamQueue::clear);
|
||||||
ClassDB::bind_method(D_METHOD("length"), &BitStreamQueue::length);
|
ClassDB::bind_method(D_METHOD("length"), &BitStreamQueue::length);
|
||||||
ClassDB::bind_method(D_METHOD("put_msgbytes", "msgbytes"), &BitStreamQueue::put_msgbytes);
|
// ClassDB::bind_method(D_METHOD("put_msgbytes", "msgbytes"), &BitStreamQueue::put_msgbytes);
|
||||||
ClassDB::bind_method(D_METHOD("get_msg", "pos"), &BitStreamQueue::get_msg);
|
ClassDB::bind_method(D_METHOD("get_msg", "index"), &BitStreamQueue::get_msg);
|
||||||
ClassDB::bind_method(D_METHOD("get_received_number", "pos"), &BitStreamQueue::get_received_number);
|
ClassDB::bind_method(D_METHOD("get_msg_withid", "id"), &BitStreamQueue::get_msg_withid);
|
||||||
ClassDB::bind_method(D_METHOD("erase", "pos"), &BitStreamQueue::erase);
|
ClassDB::bind_method(D_METHOD("put_bitstreamfield", "data"), &BitStreamQueue::put_bitstreamfield);
|
||||||
|
ClassDB::bind_method(D_METHOD("erase_index", "index"), &BitStreamQueue::erase_index);
|
||||||
|
ClassDB::bind_method(D_METHOD("erase_id", "id"), &BitStreamQueue::erase_id);
|
||||||
|
ClassDB::bind_method(D_METHOD("get_index", "id"), &BitStreamQueue::get_index);
|
||||||
|
ClassDB::bind_method(D_METHOD("is_index", "id"), &BitStreamQueue::is_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
BitStreamQueue::BitStreamQueue()
|
BitStreamQueue::BitStreamQueue()
|
||||||
{
|
{
|
||||||
OS::get_singleton()->print("[%s:%d] new BitStreamQueue\n", __FILE__, __LINE__);
|
OS::get_singleton()->print("[%s:%d] new BitStreamQueue\n", __FILE__, __LINE__);
|
||||||
for(int i = 0 ; i < SIZE_QUEUE_MESSAGE ; ++i )
|
|
||||||
this->_msgin[i].instance();
|
|
||||||
//this->_msgin.resize(SIZE_QUEUE_MESSAGE);
|
|
||||||
this->clear();
|
this->clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
BitStreamQueue::~BitStreamQueue()
|
BitStreamQueue::~BitStreamQueue()
|
||||||
{
|
{
|
||||||
OS::get_singleton()->print("[%s:%d] delete BitStreamQueue\n", __FILE__, __LINE__);
|
OS::get_singleton()->print("[%s:%d] delete BitStreamQueue\n", __FILE__, __LINE__);
|
||||||
|
|
||||||
this->clear();
|
this->clear();
|
||||||
//for(int i = 0 ; i < SIZE_QUEUE_MESSAGE ; ++i ) this->_msgin[i].unref();
|
|
||||||
|
|
||||||
for(int i = 0 ; i < SIZE_QUEUE_MESSAGE ; ++i )
|
|
||||||
{
|
|
||||||
//OS::get_singleton()->print("[%s:%d] delete BitStreamQueue %d\n", __FILE__, __LINE__, i);
|
|
||||||
this->_msgin[i].unref();
|
|
||||||
if (this->_msgin[i] != nullptr)
|
|
||||||
{
|
|
||||||
OS::get_singleton()->print("[%s:%d] delete BitStreamQueue %d : KO\n", __FILE__, __LINE__, i);
|
|
||||||
//memdelete(this->_msgin[i]);
|
|
||||||
//this->_msgin[i] = nullptr;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
OS::get_singleton()->print("[%s:%d] delete BitStreamQueue %d : ok\n", __FILE__, __LINE__, i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void BitStreamQueue::clear()
|
void BitStreamQueue::clear()
|
||||||
{
|
{
|
||||||
for(int i = 0 ; i < SIZE_QUEUE_MESSAGE ; ++i )
|
this->_msg.clear();
|
||||||
{
|
|
||||||
this->_received_number[i] = 0;
|
|
||||||
//this->_msgin[i].nref();
|
|
||||||
this->_msgin[i]->clear();
|
|
||||||
}
|
|
||||||
this->_size = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int BitStreamQueue::length()
|
int BitStreamQueue::length()
|
||||||
{
|
{
|
||||||
return this->_size;
|
return this->_msg.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
int BitStreamQueue::put_msgbytes(PoolByteArray msgbytes)
|
int BitStreamQueue::get_index(uint32_t id)
|
||||||
{
|
{
|
||||||
int i = 0;
|
for (int i = 0; i < this->_msg.size(); i++)
|
||||||
int ii ;
|
|
||||||
|
|
||||||
while((i < SIZE_QUEUE_MESSAGE)&&(this->_msgin[i]->size_data() != 0))
|
|
||||||
++i;
|
|
||||||
|
|
||||||
if(i >= SIZE_QUEUE_MESSAGE) // Out of memory
|
|
||||||
{
|
{
|
||||||
ERR_PRINTS("Network queue is full (" + itos(i) + " / " + itos(SIZE_QUEUE_MESSAGE) + ")");
|
if (this->_msg[i]->get_id() == id)
|
||||||
throw "Out of memory";
|
{
|
||||||
}
|
return i;
|
||||||
this->_msgin[i]->put_data(msgbytes);
|
};
|
||||||
uint32_t current_received_number = this->_msgin[i]->get_uint32();
|
};
|
||||||
this->_received_number[i] = current_received_number;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
// Check we don't have other message with same _received_number (also remove it)
|
bool BitStreamQueue::is_index(uint32_t id)
|
||||||
ii = i + 1;
|
{
|
||||||
while(ii < SIZE_QUEUE_MESSAGE)
|
for (int i = 0; i < this->_msg.size(); i++)
|
||||||
{
|
{
|
||||||
if ( this->_received_number[ii] == current_received_number)
|
if (this->_msg[i]->get_id() == id)
|
||||||
this->erase(ii);
|
{
|
||||||
++ii;
|
return true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int BitStreamQueue::put_bitstreamfield(Ref<BitStreamField> data)
|
||||||
|
{
|
||||||
|
int i = this->get_index(data->get_id());
|
||||||
|
if (i == -1)
|
||||||
|
{
|
||||||
|
this->_msg.push_back(data);
|
||||||
|
i = this->get_index(data->get_id());
|
||||||
}
|
}
|
||||||
this->_size ++;
|
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ref<BitStream> BitStreamQueue::get_msg(int pos)
|
Ref<BitStreamField> BitStreamQueue::get_msg_withid(uint32_t id)
|
||||||
{
|
{
|
||||||
//Ref<BitStream> ret;
|
for (int i = 0; i < this->_msg.size(); i++)
|
||||||
if ( pos >= SIZE_QUEUE_MESSAGE )
|
|
||||||
{
|
{
|
||||||
ERR_PRINT("Try to get data out of memory");
|
if (this->_msg[i]->get_id() == id)
|
||||||
throw "Out of memory";
|
{
|
||||||
}
|
return this->_msg[i];
|
||||||
//ret.instance();
|
};
|
||||||
//*ret = &(this->_msgin[pos]);
|
};
|
||||||
//return ret;
|
return NULL;
|
||||||
//return Ref<BitStream>(this->_msgin[pos]);
|
|
||||||
|
|
||||||
//return & (this->_msgin[pos]);
|
|
||||||
return this->_msgin[pos];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t BitStreamQueue::get_received_number(int pos)
|
Ref<BitStreamField> BitStreamQueue::get_msg(int index)
|
||||||
{
|
{
|
||||||
if ( pos >= SIZE_QUEUE_MESSAGE )
|
ERR_FAIL_INDEX_V(index, this->_msg.size(), NULL);
|
||||||
{
|
return this->_msg[index];
|
||||||
ERR_PRINT("Try to get data out of memory");
|
|
||||||
throw "Out of memory";
|
|
||||||
}
|
|
||||||
return this->_received_number[pos];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void BitStreamQueue::erase(int pos)
|
void BitStreamQueue::erase_index(int index)
|
||||||
{
|
{
|
||||||
if ( pos >= SIZE_QUEUE_MESSAGE )
|
ERR_FAIL_INDEX(index, this->_msg.size());
|
||||||
{
|
this->_msg.remove(index);
|
||||||
ERR_PRINT("Try to erase data out of memory");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this->_received_number[pos] = 0;
|
|
||||||
this->_msgin[pos]->clear();
|
|
||||||
this->_size -- ;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BitStreamQueue::erase_id(uint32_t id)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < this->_msg.size(); i++)
|
||||||
|
{
|
||||||
|
if (this->_msg[i]->get_id() == id) {
|
||||||
|
this->_msg.remove(i);
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -26,25 +26,41 @@
|
||||||
#include "core/reference.h"
|
#include "core/reference.h"
|
||||||
#include "modules/bitstream/bitstream.h"
|
#include "modules/bitstream/bitstream.h"
|
||||||
|
|
||||||
class BitStreamQueue : public Reference {
|
class BitStreamField : public Reference
|
||||||
|
{
|
||||||
|
GDCLASS(BitStreamField, Reference)
|
||||||
|
protected:
|
||||||
|
static void _bind_methods();
|
||||||
|
private:
|
||||||
|
uint32_t _id;
|
||||||
|
Ref<BitStream> _msgin;
|
||||||
|
public:
|
||||||
|
uint32_t get_id() const { return this->_id; }
|
||||||
|
Ref<BitStream> get_msgin() { return this->_msgin; }
|
||||||
|
void put_id(uint32_t id) { this->_id = id; }
|
||||||
|
void put_msgin(const Ref<BitStream> & msgin) { this->_msgin = msgin; }
|
||||||
|
};
|
||||||
|
|
||||||
|
class BitStreamQueue : public Reference
|
||||||
|
{
|
||||||
GDCLASS(BitStreamQueue, Reference)
|
GDCLASS(BitStreamQueue, Reference)
|
||||||
protected:
|
protected:
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
private:
|
private:
|
||||||
int _size;
|
Vector<Ref<BitStreamField> > _msg;
|
||||||
uint32_t _received_number[SIZE_QUEUE_MESSAGE];
|
|
||||||
Ref<BitStream> _msgin[SIZE_QUEUE_MESSAGE];
|
|
||||||
//Vector<BitStream> _msgin;
|
|
||||||
public:
|
public:
|
||||||
BitStreamQueue();
|
BitStreamQueue();
|
||||||
~BitStreamQueue();
|
~BitStreamQueue();
|
||||||
|
|
||||||
void clear();
|
void clear();
|
||||||
int length();
|
int length();
|
||||||
int put_msgbytes(PoolByteArray msgbytes);
|
bool is_index(uint32_t id);
|
||||||
Ref<BitStream> get_msg(int pos);
|
int get_index(uint32_t id);
|
||||||
uint32_t get_received_number(int pos);
|
int put_bitstreamfield(Ref<BitStreamField> data);
|
||||||
void erase(int pos);
|
Ref<BitStreamField> get_msg(int index);
|
||||||
|
Ref<BitStreamField> get_msg_withid(uint32_t id);
|
||||||
|
void erase_index(int index);
|
||||||
|
void erase_id(uint32_t id);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // BIT_STREAM_QUEUE_H
|
#endif // BIT_STREAM_QUEUE_H
|
||||||
|
|
|
@ -8,7 +8,7 @@ def configure(env):
|
||||||
|
|
||||||
def get_doc_classes():
|
def get_doc_classes():
|
||||||
return [
|
return [
|
||||||
"BitStreamQueue",
|
"BitStreamQueue", "BitStreamField"
|
||||||
]
|
]
|
||||||
|
|
||||||
def get_doc_path():
|
def get_doc_path():
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#include "bitstreamqueue.h"
|
#include "bitstreamqueue.h"
|
||||||
|
|
||||||
void register_bitstreamqueue_types() {
|
void register_bitstreamqueue_types() {
|
||||||
|
ClassDB::register_class<BitStreamField>();
|
||||||
ClassDB::register_class<BitStreamQueue>();
|
ClassDB::register_class<BitStreamQueue>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
40
modules/networkconnection/check_memory.cpp
Normal file
40
modules/networkconnection/check_memory.cpp
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
/*
|
||||||
|
Check Memory
|
||||||
|
|
||||||
|
Copyright (C) 2019 AleaJactaEst
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "check_memory.h"
|
||||||
|
#include "core/os/os.h"
|
||||||
|
|
||||||
|
uint64_t memstaticold = 0;
|
||||||
|
uint64_t memdynamicold = 0;
|
||||||
|
uint64_t mempeakold = 0;
|
||||||
|
|
||||||
|
void show_memory_usage()
|
||||||
|
{
|
||||||
|
uint64_t memstatic = OS::get_singleton()->get_static_memory_usage();
|
||||||
|
uint64_t memdynamic = OS::get_singleton()->get_dynamic_memory_usage();
|
||||||
|
uint64_t mempeak = OS::get_singleton()->get_static_memory_peak_usage();
|
||||||
|
OS::get_singleton()->print("[%s:%d] Usage Memory - Current [Static:%ld, Dynamic:%ld, Peak:%ld] Delta [Static:%ld, Dynamic:%ld, Peak:%ld]\n",
|
||||||
|
__FILE__, __LINE__,
|
||||||
|
memstatic, memdynamic, mempeak,
|
||||||
|
memstatic - memstaticold, memdynamic - memdynamicold, mempeak - mempeakold);
|
||||||
|
memstaticold = memstatic;
|
||||||
|
memdynamicold = memdynamic;
|
||||||
|
mempeakold = mempeak;
|
||||||
|
}
|
32
modules/networkconnection/check_memory.h
Normal file
32
modules/networkconnection/check_memory.h
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
/*
|
||||||
|
Check Memory
|
||||||
|
|
||||||
|
Copyright (C) 2019 AleaJactaEst
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MEMORY_CHECK_H
|
||||||
|
#define MEMORY_CHECK_H
|
||||||
|
|
||||||
|
void show_memory_usage();
|
||||||
|
|
||||||
|
#ifdef ENABLE_CHECK_MEMORY_USAGE
|
||||||
|
#define SHOW_USAGE_MEMORY show_memory_usage();
|
||||||
|
#else
|
||||||
|
#define SHOW_USAGE_MEMORY
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
19
modules/networkconnection/messagequeue.cpp
Normal file
19
modules/networkconnection/messagequeue.cpp
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
/*
|
||||||
|
Library to manage message received from server
|
||||||
|
|
||||||
|
Copyright (C) 2019 AleaJactaEst
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
*/
|
46
modules/networkconnection/messagequeue.h
Normal file
46
modules/networkconnection/messagequeue.h
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
Header MessageQueue
|
||||||
|
|
||||||
|
Copyright (C) 2019 AleaJactaEst
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef MESSAGEQUEUE_H
|
||||||
|
#define MESSAGEQUEUE_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
class Message
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual void send_message(PoolByteArray & msgbytes);
|
||||||
|
};
|
||||||
|
|
||||||
|
class MessageDirect : public Message
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void send_message(uint32_t msgid, PoolByteArray & msgbytes);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Class store message and execute if is correct ID
|
||||||
|
class MessageQueue : public Message
|
||||||
|
{
|
||||||
|
BitStreamQueue queue;
|
||||||
|
public:
|
||||||
|
void send_message(uint32_t msgid, PoolByteArray & msgbytes);
|
||||||
|
};
|
||||||
|
*/
|
||||||
|
#endif // MESSAGEQUEUE_H
|
|
@ -27,12 +27,10 @@ void NetworkConnection::_bind_methods()
|
||||||
ClassDB::bind_method(D_METHOD("define_server", "host", "port"), &NetworkConnection::define_server);
|
ClassDB::bind_method(D_METHOD("define_server", "host", "port"), &NetworkConnection::define_server);
|
||||||
ClassDB::bind_method(D_METHOD("define_user", "user_addr", "user_key", "user_id"), &NetworkConnection::define_user);
|
ClassDB::bind_method(D_METHOD("define_user", "user_addr", "user_key", "user_id"), &NetworkConnection::define_user);
|
||||||
ClassDB::bind_method(D_METHOD("define_lang", "lang"), &NetworkConnection::define_lang);
|
ClassDB::bind_method(D_METHOD("define_lang", "lang"), &NetworkConnection::define_lang);
|
||||||
ClassDB::bind_method(D_METHOD("send_system_login"), &NetworkConnection::send_system_login);
|
|
||||||
ClassDB::bind_method(D_METHOD("send_system_disconnect"), &NetworkConnection::send_system_disconnect);
|
|
||||||
ClassDB::bind_method(D_METHOD("send_system_quit"), &NetworkConnection::send_system_quit);
|
|
||||||
ClassDB::bind_method(D_METHOD("disconnect_server"), &NetworkConnection::disconnect_server);
|
ClassDB::bind_method(D_METHOD("disconnect_server"), &NetworkConnection::disconnect_server);
|
||||||
ClassDB::bind_method(D_METHOD("process", "delta"), &NetworkConnection::process);
|
ClassDB::bind_method(D_METHOD("process", "delta"), &NetworkConnection::process);
|
||||||
ClassDB::bind_method(D_METHOD("get_state"), &NetworkConnection::get_state);
|
ClassDB::bind_method(D_METHOD("get_state"), &NetworkConnection::get_state);
|
||||||
|
ClassDB::bind_method(D_METHOD("connect_to_server"), &NetworkConnection::connect_to_server);
|
||||||
ClassDB::bind_method(D_METHOD("terminate_network_connection"), &NetworkConnection::terminate_network_connection);
|
ClassDB::bind_method(D_METHOD("terminate_network_connection"), &NetworkConnection::terminate_network_connection);
|
||||||
//ClassDB::bind_method(D_METHOD("get_master_message_description_node"), &NetworkConnection::get_master_message_description_node);
|
//ClassDB::bind_method(D_METHOD("get_master_message_description_node"), &NetworkConnection::get_master_message_description_node);
|
||||||
}
|
}
|
||||||
|
@ -70,21 +68,11 @@ void NetworkConnection::define_lang(String lang)
|
||||||
NetworkConnectionCore::get_singleton()->define_lang(lang);
|
NetworkConnectionCore::get_singleton()->define_lang(lang);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetworkConnection::send_system_login()
|
void NetworkConnection::connect_to_server()
|
||||||
{
|
{
|
||||||
NetworkConnectionCore::get_singleton()->send_system_login();
|
NetworkConnectionCore::get_singleton()->connect_to_server();
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetworkConnection::send_system_disconnect()
|
|
||||||
{
|
|
||||||
NetworkConnectionCore::get_singleton()->send_system_disconnect();
|
|
||||||
}
|
|
||||||
|
|
||||||
void NetworkConnection::send_system_quit()
|
|
||||||
{
|
|
||||||
NetworkConnectionCore::get_singleton()->send_system_quit();
|
|
||||||
}
|
|
||||||
|
|
||||||
void NetworkConnection::disconnect_server()
|
void NetworkConnection::disconnect_server()
|
||||||
{
|
{
|
||||||
NetworkConnectionCore::get_singleton()->disconnect_server();
|
NetworkConnectionCore::get_singleton()->disconnect_server();
|
||||||
|
|
|
@ -40,9 +40,7 @@ public:
|
||||||
void define_server(String host, int64_t port);
|
void define_server(String host, int64_t port);
|
||||||
void define_user(String user_addr, String user_key, String user_id);
|
void define_user(String user_addr, String user_key, String user_id);
|
||||||
void define_lang(String lang);
|
void define_lang(String lang);
|
||||||
void send_system_login();
|
void connect_to_server();
|
||||||
void send_system_disconnect();
|
|
||||||
void send_system_quit();
|
|
||||||
void disconnect_server();
|
void disconnect_server();
|
||||||
void process(int delta);
|
void process(int delta);
|
||||||
int get_state();
|
int get_state();
|
||||||
|
|
|
@ -18,6 +18,9 @@
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define ENABLE_CHECK_MEMORY_USAGE
|
||||||
|
|
||||||
|
#include "check_memory.h"
|
||||||
#include "network_connection_core.h"
|
#include "network_connection_core.h"
|
||||||
|
|
||||||
NetworkConnectionCore *NetworkConnectionCore::singleton = nullptr;
|
NetworkConnectionCore *NetworkConnectionCore::singleton = nullptr;
|
||||||
|
@ -38,10 +41,9 @@ void NetworkConnectionCore::cleanup()
|
||||||
OS::get_singleton()->print("NetworkConnectionCore::cleanup\n");
|
OS::get_singleton()->print("NetworkConnectionCore::cleanup\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
NetworkConnectionCore::NetworkConnectionCore()
|
NetworkConnectionCore::NetworkConnectionCore() : _state_not_initialized(this), _state_login(this), _state_synchronize(this), _state_connected(this), _state_quit(this)
|
||||||
{
|
{
|
||||||
//this->_socketUDP = nullptr;
|
this->_state_connexion = & this->_state_not_initialized;
|
||||||
this->_state = STATE::NotInitialised;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NetworkConnectionCore::~NetworkConnectionCore()
|
NetworkConnectionCore::~NetworkConnectionCore()
|
||||||
|
@ -59,12 +61,15 @@ NetworkConnectionCore::~NetworkConnectionCore()
|
||||||
}
|
}
|
||||||
|
|
||||||
NetworkConnectionCore::singleton = nullptr;
|
NetworkConnectionCore::singleton = nullptr;
|
||||||
this->_state = STATE::NotInitialised;
|
|
||||||
|
this->_state_connexion = & this->_state_not_initialized;
|
||||||
|
|
||||||
|
//this->_state = STATE::NotInitialised;
|
||||||
}
|
}
|
||||||
|
|
||||||
int NetworkConnectionCore::get_state()
|
int NetworkConnectionCore::get_state()
|
||||||
{
|
{
|
||||||
return this->_state;
|
return this->_state_connexion->get_state();
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetworkConnectionCore::autodefine_socket_udp()
|
void NetworkConnectionCore::autodefine_socket_udp()
|
||||||
|
@ -81,10 +86,23 @@ void NetworkConnectionCore::autodefine_socket_udp()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NetworkConnectionCore::open_network()
|
||||||
|
{
|
||||||
|
this->autodefine_socket_udp();
|
||||||
|
OS::get_singleton()->print("Connect to %s:%ld\n", this->_host.ascii().get_data(), this->_port);
|
||||||
|
this->_socketUDP->set_dest_address(this->_host, this->_port);
|
||||||
|
}
|
||||||
|
void NetworkConnectionCore::close_network()
|
||||||
|
{
|
||||||
|
this->_socketUDP->close();
|
||||||
|
this->_socketUDP.unref();
|
||||||
|
}
|
||||||
|
|
||||||
void NetworkConnectionCore::define_checksum_msg_xml(Array & checksum_msg_xml)
|
void NetworkConnectionCore::define_checksum_msg_xml(Array & checksum_msg_xml)
|
||||||
{
|
{
|
||||||
|
this->_network_data.define_checksum_msg_xml(checksum_msg_xml);
|
||||||
//DEBUG_PRINT("Received msg.xml checksum");
|
//DEBUG_PRINT("Received msg.xml checksum");
|
||||||
this->_checksum_msg_xml = checksum_msg_xml;
|
//this->_checksum_msg_xml = checksum_msg_xml;
|
||||||
//DEBUG_PRINT("Received msg.xml checksum " + itos(checksum_msg_xml.size()));
|
//DEBUG_PRINT("Received msg.xml checksum " + itos(checksum_msg_xml.size()));
|
||||||
//DEBUG_PRINT("Received msg.xml checksum " + itos(this->_checksum_msg_xml.size()));
|
//DEBUG_PRINT("Received msg.xml checksum " + itos(this->_checksum_msg_xml.size()));
|
||||||
}
|
}
|
||||||
|
@ -97,77 +115,22 @@ void NetworkConnectionCore::define_server(String host, int64_t port)
|
||||||
|
|
||||||
void NetworkConnectionCore::define_user(String user_addr, String user_key, String user_id)
|
void NetworkConnectionCore::define_user(String user_addr, String user_key, String user_id)
|
||||||
{
|
{
|
||||||
this->_user_addr = user_addr;
|
this->_network_data.define_user(user_addr, user_key, user_id);
|
||||||
this->_user_key = user_key;
|
|
||||||
this->_user_id = user_id;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetworkConnectionCore::define_lang(String lang)
|
void NetworkConnectionCore::define_lang(String lang)
|
||||||
{
|
{
|
||||||
this->_lang = lang;
|
this->_network_data.define_lang(lang);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetworkConnectionCore::initialize()
|
void NetworkConnectionCore::initialize()
|
||||||
{
|
{
|
||||||
// Initialize counter
|
this->_network_data.initialize();
|
||||||
this->_current_received_number = 0;
|
|
||||||
this->_last_received_number = 0;
|
|
||||||
this->_quit_id = 0;
|
|
||||||
this->_long_ack_bit_field.resize(NUM_BITS_IN_LONG_ACK);
|
|
||||||
this->_latest_probes.clear();
|
|
||||||
this->_ack_bit_mask = 0;
|
|
||||||
this->_last_ack_bit = 0;
|
|
||||||
this->_last_ack_in_long_ack = 0;
|
|
||||||
this->_current_server_tick = 0;
|
|
||||||
this->_current_client_tick = 0;
|
|
||||||
this->_ms_per_tick = 100;
|
|
||||||
this->_current_client_time = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
void NetworkConnectionCore::connect_to_server()
|
||||||
* Login
|
|
||||||
*/
|
|
||||||
|
|
||||||
void NetworkConnectionCore::send_system_login()
|
|
||||||
{
|
{
|
||||||
// Configure socket UDP
|
this->_state_connexion->connect_to_server();
|
||||||
this->autodefine_socket_udp();
|
|
||||||
if ( this->_state != STATE::NotInitialised )
|
|
||||||
{
|
|
||||||
// DEBUG_PRINT("Close old network socket");
|
|
||||||
this->_socketUDP->close();
|
|
||||||
}
|
|
||||||
|
|
||||||
OS::get_singleton()->print("Connect to %s:%ld\n", this->_host.ascii().get_data(), this->_port);
|
|
||||||
this->_socketUDP->set_dest_address(this->_host, this->_port);
|
|
||||||
// Open connection and send ID
|
|
||||||
|
|
||||||
BitStream msgout;
|
|
||||||
msgout.put_uint32(_current_received_number);
|
|
||||||
msgout.put_bool(true);
|
|
||||||
msgout.put_uint8(CLFECOMMON::SYSTEM_LOGIN_CODE);
|
|
||||||
msgout.put_string_hexa32(this->_user_addr);
|
|
||||||
msgout.put_string_hexa32(this->_user_key);
|
|
||||||
msgout.put_string_hexa32(this->_user_id);
|
|
||||||
msgout.put_string(this->_lang);
|
|
||||||
Error ret;
|
|
||||||
ret = this->_socketUDP->put_packet_buffer(msgout.get_data()); // , msgout.get_data().size()
|
|
||||||
if ( ret != Error::OK)
|
|
||||||
{
|
|
||||||
this->_socketUDP->close();
|
|
||||||
switch(ret)
|
|
||||||
{
|
|
||||||
case Error::ERR_CANT_CONNECT:
|
|
||||||
ERR_PRINT("network connexion - Can't connect");
|
|
||||||
default:
|
|
||||||
ERR_PRINT("network connexion - Unknown error");
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
OS::get_singleton()->print("Connected to khganat\n");
|
|
||||||
this->_state = STATE::Login;
|
|
||||||
// Initialize counter
|
|
||||||
this->initialize();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -176,6 +139,8 @@ void NetworkConnectionCore::send_system_login()
|
||||||
|
|
||||||
void NetworkConnectionCore::send_system_quit()
|
void NetworkConnectionCore::send_system_quit()
|
||||||
{
|
{
|
||||||
|
this->_state_connexion->send_system_quit();
|
||||||
|
/*
|
||||||
// TODO - check why we send quit_id
|
// TODO - check why we send quit_id
|
||||||
if ( this->_state != STATE::Connected && this->_state != STATE::ForceSynchronize )
|
if ( this->_state != STATE::Connected && this->_state != STATE::ForceSynchronize )
|
||||||
return;
|
return;
|
||||||
|
@ -190,7 +155,8 @@ void NetworkConnectionCore::send_system_quit()
|
||||||
{
|
{
|
||||||
ERR_PRINT("Error to send disconnect");
|
ERR_PRINT("Error to send disconnect");
|
||||||
}
|
}
|
||||||
this->_state = STATE::Quit;
|
//this->_state = STATE::Quit;
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -199,6 +165,8 @@ void NetworkConnectionCore::send_system_quit()
|
||||||
|
|
||||||
void NetworkConnectionCore::send_system_disconnect()
|
void NetworkConnectionCore::send_system_disconnect()
|
||||||
{
|
{
|
||||||
|
this->_state_connexion->send_system_disconnect();
|
||||||
|
/*
|
||||||
if ( this->_state != STATE::Connected && this->_state != STATE::ForceSynchronize )
|
if ( this->_state != STATE::Connected && this->_state != STATE::ForceSynchronize )
|
||||||
return;
|
return;
|
||||||
OS::get_singleton()->print("[%s:%d] send disconnect to server\n", __FILE__, __LINE__);
|
OS::get_singleton()->print("[%s:%d] send disconnect to server\n", __FILE__, __LINE__);
|
||||||
|
@ -213,6 +181,7 @@ void NetworkConnectionCore::send_system_disconnect()
|
||||||
}
|
}
|
||||||
this->_socketUDP->close();
|
this->_socketUDP->close();
|
||||||
this->_state = STATE::Disconnect;
|
this->_state = STATE::Disconnect;
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -221,17 +190,18 @@ void NetworkConnectionCore::send_system_disconnect()
|
||||||
|
|
||||||
void NetworkConnectionCore::disconnect_server()
|
void NetworkConnectionCore::disconnect_server()
|
||||||
{
|
{
|
||||||
if (this->_state != STATE::Connected && this->_state != STATE::ForceSynchronize)
|
// if (this->_state != STATE::Connected && this->_state != STATE::ForceSynchronize) return;
|
||||||
return;
|
|
||||||
send_system_disconnect();
|
send_system_disconnect();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Synchronize
|
* Synchronize
|
||||||
*/
|
*/
|
||||||
|
/*
|
||||||
void NetworkConnectionCore::send_system_ack_sync()
|
void NetworkConnectionCore::send_system_ack_sync()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
this->_state_connexion->send_system_ack_sync();
|
||||||
// khanat-opennel-code/code/ryzom/server/src/frontend_service/fe_receive_sub.cpp:1121 void CFeReceiveSub::handleReceivedMsg( CClientHost *clienthost )
|
// khanat-opennel-code/code/ryzom/server/src/frontend_service/fe_receive_sub.cpp:1121 void CFeReceiveSub::handleReceivedMsg( CClientHost *clienthost )
|
||||||
OS::get_singleton()->print("[%s:%d] Send system ACK sync\n", __FILE__, __LINE__);
|
OS::get_singleton()->print("[%s:%d] Send system ACK sync\n", __FILE__, __LINE__);
|
||||||
|
|
||||||
|
@ -257,9 +227,11 @@ void NetworkConnectionCore::send_system_ack_sync()
|
||||||
msgout.unref();
|
msgout.unref();
|
||||||
this->_state = STATE::Connected;
|
this->_state = STATE::Connected;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
void NetworkConnectionCore::receive_system_sync(Ref<BitStream> msgin)
|
void NetworkConnectionCore::receive_system_sync(Ref<BitStream> msgin)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
int i;
|
int i;
|
||||||
bool valide = true;
|
bool valide = true;
|
||||||
|
|
||||||
|
@ -301,6 +273,7 @@ void NetworkConnectionCore::receive_system_sync(Ref<BitStream> msgin)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
ERR_PRINTS("MSG.XML is wrong");
|
ERR_PRINTS("MSG.XML is wrong");
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -309,12 +282,15 @@ void NetworkConnectionCore::receive_system_sync(Ref<BitStream> msgin)
|
||||||
|
|
||||||
void NetworkConnectionCore::receive_system_probe(Ref<BitStream> msgin)
|
void NetworkConnectionCore::receive_system_probe(Ref<BitStream> msgin)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
OS::get_singleton()->print("[%s:%d] SYSTEM_PROBE_CODE size:%d\n", __FILE__, __LINE__, this->_latest_probes.size());
|
OS::get_singleton()->print("[%s:%d] SYSTEM_PROBE_CODE size:%d\n", __FILE__, __LINE__, this->_latest_probes.size());
|
||||||
this->_latest_probes.append(msgin->get_sint32());
|
this->_latest_probes.append(msgin->get_sint32());
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetworkConnectionCore::send_system_ack_probe()
|
void NetworkConnectionCore::send_system_ack_probe()
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
OS::get_singleton()->print("[%s:%d] Send system ACK probe\n", __FILE__, __LINE__);
|
OS::get_singleton()->print("[%s:%d] Send system ACK probe\n", __FILE__, __LINE__);
|
||||||
// khanat-opennel-code/code/ryzom/server/src/frontend_service/fe_receive_sub.cpp:1121 void CFeReceiveSub::handleReceivedMsg( CClientHost *clienthost )
|
// khanat-opennel-code/code/ryzom/server/src/frontend_service/fe_receive_sub.cpp:1121 void CFeReceiveSub::handleReceivedMsg( CClientHost *clienthost )
|
||||||
if (this->_state != STATE::Connected && this->_state != STATE::ForceSynchronize)
|
if (this->_state != STATE::Connected && this->_state != STATE::ForceSynchronize)
|
||||||
|
@ -347,9 +323,10 @@ void NetworkConnectionCore::send_system_ack_probe()
|
||||||
if (this->_state == STATE::ForceSynchronize && max >= 5)
|
if (this->_state == STATE::ForceSynchronize && max >= 5)
|
||||||
{
|
{
|
||||||
// We have send ACK, so now we clean all queue and received all message to synchronize
|
// We have send ACK, so now we clean all queue and received all message to synchronize
|
||||||
this->queue.clear();
|
this->_queue.clear();
|
||||||
this->_state = STATE::Connected;
|
this->_state = STATE::Connected;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -358,6 +335,7 @@ void NetworkConnectionCore::send_system_ack_probe()
|
||||||
|
|
||||||
void NetworkConnectionCore::wait_resynchronize(uint32_t current_received_number, Ref<BitStream> msgin)
|
void NetworkConnectionCore::wait_resynchronize(uint32_t current_received_number, Ref<BitStream> msgin)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
bool system_mode;
|
bool system_mode;
|
||||||
this->_current_received_number = current_received_number;
|
this->_current_received_number = current_received_number;
|
||||||
system_mode = msgin->get_bool();
|
system_mode = msgin->get_bool();
|
||||||
|
@ -387,6 +365,7 @@ void NetworkConnectionCore::wait_resynchronize(uint32_t current_received_number,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this->_last_received_number = current_received_number;
|
this->_last_received_number = current_received_number;
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -395,6 +374,7 @@ void NetworkConnectionCore::wait_resynchronize(uint32_t current_received_number,
|
||||||
|
|
||||||
void NetworkConnectionCore::decode_system_message(Ref<BitStream> msgin)
|
void NetworkConnectionCore::decode_system_message(Ref<BitStream> msgin)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
int message = msgin->get_uint8();
|
int message = msgin->get_uint8();
|
||||||
switch (message)
|
switch (message)
|
||||||
{
|
{
|
||||||
|
@ -419,6 +399,7 @@ void NetworkConnectionCore::decode_system_message(Ref<BitStream> msgin)
|
||||||
ERR_PRINTS("Received unknown message [" + itos(message) + "]");
|
ERR_PRINTS("Received unknown message [" + itos(message) + "]");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetworkConnectionCore::decode_normal_message(Ref<BitStream> msgin)
|
void NetworkConnectionCore::decode_normal_message(Ref<BitStream> msgin)
|
||||||
|
@ -432,6 +413,7 @@ void NetworkConnectionCore::decode_normal_message(Ref<BitStream> msgin)
|
||||||
|
|
||||||
void NetworkConnectionCore::analyze_message_received(uint32_t current_received_number, Ref<BitStream> msgin)
|
void NetworkConnectionCore::analyze_message_received(uint32_t current_received_number, Ref<BitStream> msgin)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
bool system_mode;
|
bool system_mode;
|
||||||
bool ackBool = false;
|
bool ackBool = false;
|
||||||
int ackBit = 0;
|
int ackBit = 0;
|
||||||
|
@ -501,66 +483,109 @@ void NetworkConnectionCore::analyze_message_received(uint32_t current_received_n
|
||||||
this->decode_system_message(msgin);
|
this->decode_system_message(msgin);
|
||||||
else
|
else
|
||||||
this->decode_normal_message(msgin);
|
this->decode_normal_message(msgin);
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetworkConnectionCore::store_message_received(PoolByteArray & msgbytes)
|
void NetworkConnectionCore::store_message_received(PoolByteArray msgbytes)
|
||||||
{
|
{
|
||||||
int pos = this->queue.put_msgbytes(msgbytes);
|
/*
|
||||||
|
Ref<BitStream> msgin;
|
||||||
|
msgin.instance();
|
||||||
|
msgin->put_data(msgbytes);
|
||||||
|
uint32_t current_received_number = msgin->get_uint32();
|
||||||
|
|
||||||
Ref<BitStream> msgin = this->queue.get_msg(pos);
|
//msgin.put_data(msgbytes);
|
||||||
uint32_t current_received_number = this->queue.get_received_number(pos);
|
//uint32_t current_received_number = msgin.get_uint32();
|
||||||
|
|
||||||
|
OS::get_singleton()->print("[%s:%d] store message (%d)\n", __FILE__, __LINE__, (int)current_received_number);
|
||||||
|
SHOW_USAGE_MEMORY
|
||||||
|
|
||||||
|
show_memory_usage();
|
||||||
|
|
||||||
|
Ref<BitStreamField> msg;
|
||||||
|
msg.instance();
|
||||||
|
msg->put_id(current_received_number);
|
||||||
|
msg->put_msgin(msgin);
|
||||||
|
int index = this->_queue.put_bitstreamfield(msg);
|
||||||
|
msg.unref();
|
||||||
/// TODO - check if max int execeded current_received_number < 1000 this->_last_received_number > 0x80000000
|
/// TODO - check if max int execeded current_received_number < 1000 this->_last_received_number > 0x80000000
|
||||||
if ( this->_state == STATE::ForceSynchronize )
|
if ( this->_state == STATE::ForceSynchronize )
|
||||||
{
|
{
|
||||||
// We have detected a problem of synchro, we wait message ack probe and after server launch a re-sync
|
// We have detected a problem of synchro, we wait message ack probe and after server launch a re-sync
|
||||||
wait_resynchronize(current_received_number, msgin);
|
//wait_resynchronize(current_received_number, msgin);
|
||||||
|
this->_queue.erase_index(index);
|
||||||
}
|
}
|
||||||
else if ( current_received_number - this->_last_received_number <= 0 ) // Received old message
|
else if ( current_received_number - this->_last_received_number <= 0 ) // Received old message
|
||||||
{
|
{
|
||||||
OS::get_singleton()->print("[%s:%d] current_received_number:%d / queue size:%d\n", __FILE__, __LINE__, current_received_number, this->queue.length());
|
OS::get_singleton()->print("[%s:%d] current_received_number:%d / queue size:%d\n", __FILE__, __LINE__, current_received_number, this->_queue.length());
|
||||||
this->queue.erase(pos);
|
this->_queue.erase_index(index);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if ( this->_last_received_number + 1 == current_received_number ) // Received next message
|
else if ( this->_last_received_number + 1 == current_received_number ) // Received next message
|
||||||
{
|
{
|
||||||
OS::get_singleton()->print("[%s:%d] current_received_number:%u / queue size:%d\n", __FILE__, __LINE__, current_received_number, this->queue.length());
|
OS::get_singleton()->print("[%s:%d] current_received_number:%u / queue size:%d\n", __FILE__, __LINE__, current_received_number, this->_queue.length());
|
||||||
analyze_message_received(current_received_number, msgin);
|
//analyze_message_received(current_received_number, msgin);
|
||||||
this->queue.erase(pos);
|
this->_queue.erase_index(index);
|
||||||
}
|
}
|
||||||
else // Received new message (but missing some message between) -> go to queue and cross finger to received the next message (for _last_received_number)
|
else // Received new message (but missing some message between) -> go to queue and cross finger to received the next message (for _last_received_number)
|
||||||
{
|
{
|
||||||
OS::get_singleton()->print("[%s:%d] current_received_number:%d / queue size:%d\n", __FILE__, __LINE__, current_received_number, this->queue.length());
|
OS::get_singleton()->print("[%s:%d] current_received_number:%d / queue size:%d\n", __FILE__, __LINE__, current_received_number, this->_queue.length());
|
||||||
if (this->queue.length() >= SIZE_QUEUE_MESSAGE)
|
if (this->_queue.length() >= SIZE_QUEUE_MESSAGE)
|
||||||
{
|
{
|
||||||
ERR_PRINT("Network queue is full / wait re-synchronize");
|
ERR_PRINT("Network queue is full / wait re-synchronize");
|
||||||
this->_state = STATE::ForceSynchronize ;
|
this->_state = STATE::ForceSynchronize ;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetworkConnectionCore::send_message()
|
void NetworkConnectionCore::send_message()
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
if (this->_latest_probes.size() > 0)
|
if (this->_latest_probes.size() > 0)
|
||||||
send_system_ack_probe();
|
send_system_ack_probe();
|
||||||
else if (this->_state == STATE::Synchronize)
|
else if (this->_state == STATE::Synchronize)
|
||||||
send_system_ack_sync();
|
send_system_ack_sync();
|
||||||
|
*/
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetworkConnectionCore::process(int delta)
|
void NetworkConnectionCore::process(int delta)
|
||||||
{
|
{
|
||||||
if (this->_state == STATE::Disconnect || this->_state == STATE::NotInitialised)
|
// this->_state_connexion->process(delta);
|
||||||
|
if ( this->_socketUDP.is_null() )
|
||||||
return;
|
return;
|
||||||
OS::get_singleton()->print( "[%s:%d] Process - delta : %d\n", __FILE__, __LINE__, delta);
|
//OS::get_singleton()->print("[%s:%d] process ...\n", __FILE__, __LINE__);
|
||||||
|
|
||||||
|
// if (this->_state == STATE::Disconnect || this->_state == STATE::NotInitialised) return;
|
||||||
|
//OS::get_singleton()->print( "[%s:%d] Process - delta : %d\n", __FILE__, __LINE__, delta);
|
||||||
|
|
||||||
for(int i = 0; (this->_socketUDP->get_available_packet_count() > 0) && (i < MAX_LOOP_READ_BY_STEP) ; ++i)
|
for(int i = 0; (this->_socketUDP->get_available_packet_count() > 0) && (i < MAX_LOOP_READ_BY_STEP) ; ++i)
|
||||||
{
|
{
|
||||||
PoolByteArray msgbytes ;
|
PoolByteArray msgbytes ;
|
||||||
this->_socketUDP->get_packet_buffer(msgbytes);
|
this->_socketUDP->get_packet_buffer(msgbytes);
|
||||||
OS::get_singleton()->print("[%s:%d] Size msg received: %d\n", __FILE__, __LINE__, msgbytes.size());
|
OS::get_singleton()->print("[%s:%d] Size msg received: %d (i:%d, state:%d, size queue:%d)\n", __FILE__, __LINE__, msgbytes.size(), i, this->get_state(), this->_queue.length());
|
||||||
store_message_received(msgbytes);
|
|
||||||
|
SHOW_USAGE_MEMORY
|
||||||
|
|
||||||
|
// store_message_received(msgbytes);
|
||||||
|
|
||||||
|
Ref<BitStream> msgin;
|
||||||
|
msgin.instance();
|
||||||
|
msgin->put_data(msgbytes);
|
||||||
|
uint32_t current_received_number = msgin->get_uint32();
|
||||||
|
Ref<BitStreamField> msg;
|
||||||
|
msg.instance();
|
||||||
|
msg->put_id(current_received_number);
|
||||||
|
msg->put_msgin(msgin);
|
||||||
|
int index = this->_queue.put_bitstreamfield(msg);
|
||||||
|
msgin.unref();
|
||||||
|
msg.unref();
|
||||||
|
this->_state_connexion->receive_message(index);
|
||||||
}
|
}
|
||||||
send_message();
|
this->_state_connexion->send_message();
|
||||||
|
//OS::get_singleton()->print("[%s:%d] --------------------------------\n", __FILE__, __LINE__);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool NetworkConnectionCore::is_active()
|
bool NetworkConnectionCore::is_active()
|
||||||
|
|
|
@ -25,37 +25,10 @@
|
||||||
#include "core/io/packet_peer_udp.h"
|
#include "core/io/packet_peer_udp.h"
|
||||||
#include "modules/bitset/bitset.h"
|
#include "modules/bitset/bitset.h"
|
||||||
#include "modules/bitstreamqueue/bitstreamqueue.h"
|
#include "modules/bitstreamqueue/bitstreamqueue.h"
|
||||||
|
#include "state_connexion.h"
|
||||||
|
#include "network_data.h"
|
||||||
|
|
||||||
#define MAX_LOOP_READ_BY_STEP 10
|
#define MAX_LOOP_READ_BY_STEP 10
|
||||||
#define NUM_BITS_IN_LONG_ACK 512
|
|
||||||
|
|
||||||
enum STATE {
|
|
||||||
NotInitialised = 0,
|
|
||||||
//NotConnected = 1, // When received a cookie - not used here
|
|
||||||
//Authenticate = 2,
|
|
||||||
Login = 3,
|
|
||||||
Synchronize = 4,
|
|
||||||
Connected = 5, // State when we are connecte
|
|
||||||
//Probe = 6,
|
|
||||||
//Stalled = 7,
|
|
||||||
Disconnect = 8,
|
|
||||||
Quit = 9,
|
|
||||||
ForceSynchronize = 10
|
|
||||||
};
|
|
||||||
|
|
||||||
enum CLFECOMMON {
|
|
||||||
SYSTEM_LOGIN_CODE = 0,
|
|
||||||
SYSTEM_SYNC_CODE = 1,
|
|
||||||
SYSTEM_ACK_SYNC_CODE = 2,
|
|
||||||
SYSTEM_PROBE_CODE = 3,
|
|
||||||
SYSTEM_ACK_PROBE_CODE = 4,
|
|
||||||
SYSTEM_DISCONNECTION_CODE = 5,
|
|
||||||
SYSTEM_STALLED_CODE = 6,
|
|
||||||
SYSTEM_SERVER_DOWN_CODE = 7,
|
|
||||||
SYSTEM_QUIT_CODE = 8,
|
|
||||||
SYSTEM_ACK_QUIT_CODE = 9,
|
|
||||||
NUMBITSINLONGACK = 512
|
|
||||||
};
|
|
||||||
|
|
||||||
#define LCT 100
|
#define LCT 100
|
||||||
|
|
||||||
|
@ -63,35 +36,34 @@ class NetworkConnectionCore : public Reference {
|
||||||
GDCLASS(NetworkConnectionCore, Reference)
|
GDCLASS(NetworkConnectionCore, Reference)
|
||||||
private:
|
private:
|
||||||
static NetworkConnectionCore *singleton;
|
static NetworkConnectionCore *singleton;
|
||||||
|
friend class StateConnectionBase;
|
||||||
|
friend class StateConnectionNotInitialized;
|
||||||
|
friend class StateConnectionLogin;
|
||||||
|
friend class StateConnectionSynchronize;
|
||||||
|
friend class StateConnectionConnected;
|
||||||
|
friend class StateConnectionQuit;
|
||||||
|
|
||||||
STATE _state;
|
protected:
|
||||||
uint32_t _ack_bit_mask;
|
|
||||||
uint32_t _current_server_tick;
|
|
||||||
uint32_t _current_client_tick;
|
|
||||||
uint32_t _synchronize;
|
|
||||||
uint32_t _current_received_number;
|
|
||||||
uint32_t _last_received_number;
|
|
||||||
uint32_t _ms_per_tick;
|
|
||||||
uint32_t _current_client_time;
|
|
||||||
uint32_t _update_time;
|
|
||||||
int32_t _quit_id;
|
|
||||||
int32_t _last_ack_bit;
|
|
||||||
uint32_t _last_ack_in_long_ack;
|
|
||||||
int32_t _latest_sync;
|
|
||||||
int64_t _port;
|
int64_t _port;
|
||||||
|
|
||||||
String _host;
|
String _host;
|
||||||
String _lang;
|
|
||||||
String _user_addr;
|
|
||||||
String _user_key;
|
|
||||||
String _user_id;
|
|
||||||
Ref<PacketPeerUDP> _socketUDP;
|
Ref<PacketPeerUDP> _socketUDP;
|
||||||
BitSet _long_ack_bit_field;
|
BitStreamQueue _queue;
|
||||||
Array _latest_probes;
|
|
||||||
Array _checksum_msg_xml;
|
StateConnectionNotInitialized _state_not_initialized;
|
||||||
BitStreamQueue queue;
|
StateConnectionLogin _state_login;
|
||||||
|
StateConnectionSynchronize _state_synchronize;
|
||||||
|
StateConnectionConnected _state_connected;
|
||||||
|
StateConnectionQuit _state_quit;
|
||||||
|
|
||||||
|
StateConnectionBase * _state_connexion;
|
||||||
|
|
||||||
|
NetworkData _network_data;
|
||||||
|
|
||||||
//MessageDescriptionNode _message_description_node;
|
//MessageDescriptionNode _message_description_node;
|
||||||
|
|
||||||
|
void open_network();
|
||||||
|
void close_network();
|
||||||
public:
|
public:
|
||||||
static NetworkConnectionCore * get_singleton();
|
static NetworkConnectionCore * get_singleton();
|
||||||
|
|
||||||
|
@ -110,8 +82,8 @@ public:
|
||||||
void define_lang(String lang);
|
void define_lang(String lang);
|
||||||
|
|
||||||
void initialize();
|
void initialize();
|
||||||
|
void connect_to_server();
|
||||||
|
|
||||||
void send_system_login();
|
|
||||||
void send_system_disconnect();
|
void send_system_disconnect();
|
||||||
void send_system_quit();
|
void send_system_quit();
|
||||||
void disconnect_server();
|
void disconnect_server();
|
||||||
|
@ -126,7 +98,7 @@ public:
|
||||||
void decode_normal_message(Ref<BitStream> msgin);
|
void decode_normal_message(Ref<BitStream> msgin);
|
||||||
void wait_resynchronize(uint32_t current_received_number, Ref<BitStream> msgin);
|
void wait_resynchronize(uint32_t current_received_number, Ref<BitStream> msgin);
|
||||||
void analyze_message_received(uint32_t current_received_number, Ref<BitStream> msgin);
|
void analyze_message_received(uint32_t current_received_number, Ref<BitStream> msgin);
|
||||||
void store_message_received(PoolByteArray & msgbytes);
|
void store_message_received(PoolByteArray msgbytes);
|
||||||
void send_message();
|
void send_message();
|
||||||
void process(int delta);
|
void process(int delta);
|
||||||
bool connected();
|
bool connected();
|
||||||
|
@ -135,5 +107,4 @@ public:
|
||||||
//MessageDescriptionNode & get_master_message_description_node();
|
//MessageDescriptionNode & get_master_message_description_node();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
70
modules/networkconnection/network_data.cpp
Normal file
70
modules/networkconnection/network_data.cpp
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
/*
|
||||||
|
Library NetworkData
|
||||||
|
|
||||||
|
Copyright (C) 2019 AleaJactaEst
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "network_data.h"
|
||||||
|
|
||||||
|
NetworkData::NetworkData()
|
||||||
|
{
|
||||||
|
this->initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
NetworkData::~NetworkData()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void NetworkData::initialize()
|
||||||
|
{
|
||||||
|
// Initialize counter
|
||||||
|
this->_current_received_number = 0;
|
||||||
|
this->_last_received_number = 0;
|
||||||
|
this->_quit_id = 0;
|
||||||
|
this->_long_ack_bit_field.resize(NUM_BITS_IN_LONG_ACK);
|
||||||
|
this->_latest_probes.clear();
|
||||||
|
this->_ack_bit_mask = 0;
|
||||||
|
this->_last_ack_bit = 0;
|
||||||
|
this->_last_ack_in_long_ack = 0;
|
||||||
|
this->_current_server_tick = 0;
|
||||||
|
this->_current_client_tick = 0;
|
||||||
|
this->_ms_per_tick = 100;
|
||||||
|
this->_current_client_time = 0;
|
||||||
|
|
||||||
|
this->_server_sync = 0;
|
||||||
|
this->_client_sync = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void NetworkData::define_lang(String lang)
|
||||||
|
{
|
||||||
|
this->_lang = lang;
|
||||||
|
}
|
||||||
|
|
||||||
|
void NetworkData::define_user(String user_addr, String user_key, String user_id)
|
||||||
|
{
|
||||||
|
this->_user_addr = user_addr;
|
||||||
|
this->_user_key = user_key;
|
||||||
|
this->_user_id = user_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
void NetworkData::define_checksum_msg_xml(Array & checksum_msg_xml)
|
||||||
|
{
|
||||||
|
//DEBUG_PRINT("Received msg.xml checksum");
|
||||||
|
this->_checksum_msg_xml = checksum_msg_xml;
|
||||||
|
//DEBUG_PRINT("Received msg.xml checksum " + itos(checksum_msg_xml.size()));
|
||||||
|
//DEBUG_PRINT("Received msg.xml checksum " + itos(this->_checksum_msg_xml.size()));
|
||||||
|
}
|
74
modules/networkconnection/network_data.h
Normal file
74
modules/networkconnection/network_data.h
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
/*
|
||||||
|
Header NetworkData
|
||||||
|
|
||||||
|
Copyright (C) 2019 AleaJactaEst
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef NETWORK_DATA_H
|
||||||
|
#define NETWORK_DATA_H
|
||||||
|
|
||||||
|
// #include "core/reference.h"
|
||||||
|
// #include "core/io/packet_peer_udp.h"
|
||||||
|
#include "modules/bitset/bitset.h"
|
||||||
|
#include "core/ustring.h"
|
||||||
|
|
||||||
|
#define MAX_LOOP_READ_BY_STEP 10
|
||||||
|
#define NUM_BITS_IN_LONG_ACK 512
|
||||||
|
|
||||||
|
class NetworkData
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
uint32_t _ack_bit_mask;
|
||||||
|
|
||||||
|
uint32_t _current_server_tick;
|
||||||
|
uint32_t _current_client_tick;
|
||||||
|
|
||||||
|
uint32_t _synchronize;
|
||||||
|
|
||||||
|
uint32_t _current_received_number;
|
||||||
|
uint32_t _last_received_number;
|
||||||
|
|
||||||
|
uint32_t _ms_per_tick;
|
||||||
|
uint32_t _current_client_time;
|
||||||
|
uint32_t _update_time;
|
||||||
|
int32_t _quit_id;
|
||||||
|
int32_t _last_ack_bit;
|
||||||
|
uint32_t _last_ack_in_long_ack;
|
||||||
|
|
||||||
|
int32_t _client_sync;
|
||||||
|
int32_t _server_sync;
|
||||||
|
|
||||||
|
String _lang;
|
||||||
|
String _user_addr;
|
||||||
|
String _user_key;
|
||||||
|
String _user_id;
|
||||||
|
|
||||||
|
BitSet _long_ack_bit_field;
|
||||||
|
Array _latest_probes;
|
||||||
|
Array _checksum_msg_xml;
|
||||||
|
|
||||||
|
NetworkData();
|
||||||
|
~NetworkData();
|
||||||
|
|
||||||
|
void initialize();
|
||||||
|
void define_lang(String lang);
|
||||||
|
void define_user(String user_addr, String user_key, String user_id);
|
||||||
|
void define_checksum_msg_xml(Array & checksum_msg_xml);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
417
modules/networkconnection/state_connexion.cpp
Normal file
417
modules/networkconnection/state_connexion.cpp
Normal file
|
@ -0,0 +1,417 @@
|
||||||
|
/*
|
||||||
|
Library to manage state connexion
|
||||||
|
|
||||||
|
Copyright (C) 2019 AleaJactaEst
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "check_memory.h"
|
||||||
|
#include "state_connexion.h"
|
||||||
|
#include "network_connection_core.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* StateConnectionBase
|
||||||
|
*/
|
||||||
|
|
||||||
|
StateConnectionBase::StateConnectionBase(NetworkConnectionCore * network)
|
||||||
|
{
|
||||||
|
this->_network = network;
|
||||||
|
this->_data = & (network->_network_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* StateConnectionNotInitialized
|
||||||
|
*/
|
||||||
|
|
||||||
|
void StateConnectionNotInitialized::connect_to_server()
|
||||||
|
{
|
||||||
|
this->_network->_queue.clear();
|
||||||
|
this->_network->open_network();
|
||||||
|
this->_network->_state_connexion = & this->_network->_state_login;
|
||||||
|
OS::get_singleton()->print("[%s:%d] connect_to_server\n", __FILE__, __LINE__);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* StateConnectionLogin
|
||||||
|
*/
|
||||||
|
void StateConnectionLogin::send_system_quit()
|
||||||
|
{
|
||||||
|
OS::get_singleton()->print("[%s:%d] send quit to server\n", __FILE__, __LINE__);
|
||||||
|
BitStream msgout;
|
||||||
|
msgout.put_uint32(this->_data->_current_received_number);
|
||||||
|
msgout.put_bool(true);
|
||||||
|
msgout.put_uint8(CLFECOMMON::SYSTEM_QUIT_CODE);
|
||||||
|
msgout.put_sint32(this->_data->_quit_id);
|
||||||
|
|
||||||
|
if ( this->_network->_socketUDP->put_packet_buffer(msgout.get_data()) != Error::OK )
|
||||||
|
{
|
||||||
|
ERR_PRINT("Error to send disconnect");
|
||||||
|
}
|
||||||
|
this->_network->_state_connexion = & this->_network->_state_quit;
|
||||||
|
}
|
||||||
|
|
||||||
|
void StateConnectionLogin::send_message()
|
||||||
|
{
|
||||||
|
BitStream msgout;
|
||||||
|
msgout.put_uint32(this->_data->_current_received_number);
|
||||||
|
msgout.put_bool(true);
|
||||||
|
msgout.put_uint8(CLFECOMMON::SYSTEM_LOGIN_CODE);
|
||||||
|
msgout.put_string_hexa32(this->_data->_user_addr);
|
||||||
|
msgout.put_string_hexa32(this->_data->_user_key);
|
||||||
|
msgout.put_string_hexa32(this->_data->_user_id);
|
||||||
|
msgout.put_string(this->_data->_lang);
|
||||||
|
Error ret;
|
||||||
|
ret = this->_network->_socketUDP->put_packet_buffer(msgout.get_data()); // , msgout.get_data().size()
|
||||||
|
if ( ret != Error::OK)
|
||||||
|
{
|
||||||
|
this->_network->close_network();
|
||||||
|
switch(ret)
|
||||||
|
{
|
||||||
|
case Error::ERR_CANT_CONNECT:
|
||||||
|
ERR_PRINT("network connexion - Can't connect");
|
||||||
|
default:
|
||||||
|
ERR_PRINT("network connexion - Unknown error");
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
OS::get_singleton()->print("[%s:%d] Connected to khganat\n", __FILE__, __LINE__);
|
||||||
|
this->_network->_state_connexion = & this->_network->_state_synchronize;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* StateConnectionSynchronize
|
||||||
|
*/
|
||||||
|
|
||||||
|
void StateConnectionSynchronize::send_system_quit()
|
||||||
|
{
|
||||||
|
OS::get_singleton()->print("[%s:%d] send quit to server\n", __FILE__, __LINE__);
|
||||||
|
BitStream msgout;
|
||||||
|
msgout.put_uint32(this->_data->_current_received_number);
|
||||||
|
msgout.put_bool(true);
|
||||||
|
msgout.put_uint8(CLFECOMMON::SYSTEM_QUIT_CODE);
|
||||||
|
msgout.put_sint32(this->_data->_quit_id);
|
||||||
|
|
||||||
|
if ( this->_network->_socketUDP->put_packet_buffer(msgout.get_data()) != Error::OK )
|
||||||
|
{
|
||||||
|
ERR_PRINT("Error to send quit");
|
||||||
|
}
|
||||||
|
this->_network->_state_connexion = & this->_network->_state_quit;
|
||||||
|
}
|
||||||
|
|
||||||
|
void StateConnectionSynchronize::send_system_ack_sync()
|
||||||
|
{
|
||||||
|
OS::get_singleton()->print("[%s:%d] send system ACK Sync to server\n", __FILE__, __LINE__);
|
||||||
|
Ref<BitStream> msgout;
|
||||||
|
msgout.instance();
|
||||||
|
msgout->put_uint32(this->_data->_current_received_number);
|
||||||
|
msgout->put_bool(true);
|
||||||
|
msgout->put_uint8(CLFECOMMON::SYSTEM_ACK_SYNC_CODE);
|
||||||
|
msgout->put_sint32(this->_data->_last_received_number);
|
||||||
|
msgout->put_sint32(this->_data->_last_ack_in_long_ack);
|
||||||
|
this->_data->_long_ack_bit_field.write_serial(msgout);
|
||||||
|
msgout->put_sint32(this->_data->_server_sync);
|
||||||
|
if (this->_network->_socketUDP->put_packet_buffer(msgout->get_data()) != Error::OK)
|
||||||
|
{
|
||||||
|
ERR_PRINT("Error to send ack sync");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
msgout.unref();
|
||||||
|
this->_data->_client_sync = this->_data->_server_sync;
|
||||||
|
this->_network->_state_connexion = & this->_network->_state_connected;
|
||||||
|
}
|
||||||
|
|
||||||
|
void StateConnectionSynchronize::receive_system_sync(Ref<BitStream> msgin)
|
||||||
|
{
|
||||||
|
bool valide = true;
|
||||||
|
int i;
|
||||||
|
OS::get_singleton()->print("[%s:%d] SYSTEM_SYNC_CODE\n", __FILE__, __LINE__);
|
||||||
|
|
||||||
|
uint32_t synchronize = msgin->get_uint32();
|
||||||
|
int64_t stime = msgin->get_sint64();
|
||||||
|
uint32_t latestsync = msgin->get_uint32();
|
||||||
|
PoolByteArray msg_xml = msgin->get_array_uint8(16);
|
||||||
|
PoolByteArray database_xml = msgin->get_array_uint8(16);
|
||||||
|
|
||||||
|
OS::get_singleton()->print("[%s:%d] SYSTEM_SYNC_CODE synchronize:%u, stime:%ld, latestsync:%u\n", __FILE__, __LINE__, synchronize, stime, latestsync);
|
||||||
|
|
||||||
|
if ( msg_xml.size() != this->_data->_checksum_msg_xml.size() )
|
||||||
|
{
|
||||||
|
valide = false;
|
||||||
|
ERR_PRINTS("MSG XML is incorrect (server:" + itos(msg_xml.size()) +", client:" + itos(this->_data->_checksum_msg_xml.size()) + ")");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for(i=0; i<msg_xml.size(); ++i)
|
||||||
|
{
|
||||||
|
if ( (int) msg_xml[i] != (int) this->_data->_checksum_msg_xml[i] )
|
||||||
|
{
|
||||||
|
valide = false;
|
||||||
|
ERR_PRINTS("MSG XML is incorrect (pos:" + itos(i) +")");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( valide == true )
|
||||||
|
{
|
||||||
|
OS::get_singleton()->print("[%s:%d] MSG XML is correct\n", __FILE__, __LINE__);
|
||||||
|
this->_data->_server_sync = latestsync;
|
||||||
|
this->_data->_synchronize = synchronize;
|
||||||
|
this->_data->_current_server_tick = this->_data->_synchronize + this->_data->_current_received_number + 2;
|
||||||
|
this->_data->_current_client_tick = this->_data->_current_server_tick + (LCT + this->_data->_ms_per_tick) / this->_data->_ms_per_tick;
|
||||||
|
this->_data->_current_client_time = this->_data->_update_time - (LCT + this->_data->_ms_per_tick);
|
||||||
|
//this->_state = STATE::Synchronize;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ERR_PRINTS("MSG.XML is wrong");
|
||||||
|
}
|
||||||
|
|
||||||
|
void StateConnectionSynchronize::receive_message(int index)
|
||||||
|
{
|
||||||
|
bool system_mode;
|
||||||
|
|
||||||
|
OS::get_singleton()->print("[%s:%d] receive_message ...\n", __FILE__, __LINE__);
|
||||||
|
|
||||||
|
//this->_data->_current_received_number = current_received_number;
|
||||||
|
Ref<BitStreamField> field = this->_network->_queue.get_msg(index);
|
||||||
|
uint32_t current_received_number = field->get_id();
|
||||||
|
Ref<BitStream> msgin = field->get_msgin();
|
||||||
|
|
||||||
|
this->_data->_current_received_number = current_received_number;
|
||||||
|
|
||||||
|
//Ref<BitStreamField> msgin = this->_network->_queue.get_msg(index)->get_msgin();
|
||||||
|
system_mode = msgin->get_bool();
|
||||||
|
if ( system_mode == true )
|
||||||
|
{
|
||||||
|
int message = msgin->get_uint8();
|
||||||
|
switch (message)
|
||||||
|
{
|
||||||
|
case CLFECOMMON::SYSTEM_LOGIN_CODE:
|
||||||
|
OS::get_singleton()->print("[%s:%d] SYSTEM_LOGIN_CODE\n", __FILE__, __LINE__);
|
||||||
|
break;
|
||||||
|
case CLFECOMMON::SYSTEM_SYNC_CODE:
|
||||||
|
this->receive_system_sync(msgin);
|
||||||
|
break;
|
||||||
|
case CLFECOMMON::SYSTEM_STALLED_CODE:
|
||||||
|
OS::get_singleton()->print("[%s:%d] SYSTEM_STALLED_CODE\n", __FILE__, __LINE__);
|
||||||
|
break;
|
||||||
|
case CLFECOMMON::SYSTEM_SERVER_DOWN_CODE:
|
||||||
|
OS::get_singleton()->print("[%s:%d] SYSTEM_SERVER_DOWN_CODE\n", __FILE__, __LINE__);
|
||||||
|
break;
|
||||||
|
case CLFECOMMON::SYSTEM_PROBE_CODE:
|
||||||
|
OS::get_singleton()->print("[%s:%d] SYSTEM_PROBE_CODE\n", __FILE__, __LINE__);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ERR_PRINTS("Received unknown message [" + itos(message) + "]");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// this->_last_received_number = current_received_number;
|
||||||
|
this->_network->_queue.erase_index(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
void StateConnectionSynchronize::send_message()
|
||||||
|
{
|
||||||
|
//OS::get_singleton()->print("[%s:%d] send_system %d / %d \n", __FILE__, __LINE__, this->_data->_server_sync, this->_data->_client_sync);
|
||||||
|
if ( this->_data->_server_sync != this->_data->_client_sync )
|
||||||
|
this->send_system_ack_sync();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* StateConnectionConnected
|
||||||
|
*/
|
||||||
|
|
||||||
|
void StateConnectionConnected::send_system_quit()
|
||||||
|
{
|
||||||
|
OS::get_singleton()->print("[%s:%d] send quit to server\n", __FILE__, __LINE__);
|
||||||
|
BitStream msgout;
|
||||||
|
msgout.put_uint32(this->_data->_current_received_number);
|
||||||
|
msgout.put_bool(true);
|
||||||
|
msgout.put_uint8(CLFECOMMON::SYSTEM_QUIT_CODE);
|
||||||
|
msgout.put_sint32(this->_data->_quit_id);
|
||||||
|
|
||||||
|
if ( this->_network->_socketUDP->put_packet_buffer(msgout.get_data()) != Error::OK )
|
||||||
|
{
|
||||||
|
ERR_PRINT("Error to send disconnect");
|
||||||
|
}
|
||||||
|
this->_network->_state_connexion = & this->_network->_state_quit;
|
||||||
|
}
|
||||||
|
|
||||||
|
void StateConnectionConnected::send_system_disconnect()
|
||||||
|
{
|
||||||
|
//if ( this->_state != STATE::Connected && this->_state != STATE::ForceSynchronize ) return;
|
||||||
|
OS::get_singleton()->print("[%s:%d] send disconnect to server\n", __FILE__, __LINE__);
|
||||||
|
BitStream msgout;
|
||||||
|
msgout.put_uint32(this->_data->_current_received_number);
|
||||||
|
msgout.put_bool(true);
|
||||||
|
msgout.put_uint8(CLFECOMMON::SYSTEM_DISCONNECTION_CODE);
|
||||||
|
|
||||||
|
if ( this->_network->_socketUDP->put_packet_buffer(msgout.get_data()) != Error::OK )
|
||||||
|
{
|
||||||
|
ERR_PRINT("Error to send disconnect");
|
||||||
|
}
|
||||||
|
this->_network->_socketUDP->close();
|
||||||
|
// this->_state = STATE::Disconnect;
|
||||||
|
this->_network->_state_connexion = & this->_network->_state_not_initialized;
|
||||||
|
}
|
||||||
|
|
||||||
|
void StateConnectionConnected::send_system_ack_sync()
|
||||||
|
{
|
||||||
|
OS::get_singleton()->print("[%s:%d] send system ACK Sync to server\n", __FILE__, __LINE__);
|
||||||
|
|
||||||
|
Ref<BitStream> msgout;
|
||||||
|
msgout.instance();
|
||||||
|
msgout->put_uint32(this->_data->_current_received_number);
|
||||||
|
msgout->put_bool(true);
|
||||||
|
msgout->put_uint8(CLFECOMMON::SYSTEM_ACK_SYNC_CODE);
|
||||||
|
msgout->put_sint32(this->_data->_last_received_number);
|
||||||
|
msgout->put_sint32(this->_data->_last_ack_in_long_ack);
|
||||||
|
this->_data->_long_ack_bit_field.write_serial(msgout);
|
||||||
|
msgout->put_sint32(this->_data->_server_sync);
|
||||||
|
if (this->_network->_socketUDP->put_packet_buffer(msgout->get_data()) != Error::OK)
|
||||||
|
{
|
||||||
|
ERR_PRINT("Error to send ack sync");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
msgout.unref();
|
||||||
|
this->_data->_client_sync = this->_data->_server_sync;
|
||||||
|
}
|
||||||
|
|
||||||
|
void StateConnectionConnected::send_system_ack_probe()
|
||||||
|
{
|
||||||
|
// khanat-opennel-code/code/ryzom/server/src/frontend_service/fe_receive_sub.cpp:1121 void CFeReceiveSub::handleReceivedMsg( CClientHost *clienthost )
|
||||||
|
OS::get_singleton()->print("[%s:%d] send system ACK PROBE to server\n", __FILE__, __LINE__);
|
||||||
|
int max = this->_data->_latest_probes.size() ;
|
||||||
|
|
||||||
|
BitStream msgout;
|
||||||
|
msgout.put_uint32(this->_data->_current_received_number);
|
||||||
|
msgout.put_bool(true);
|
||||||
|
msgout.put_uint8(CLFECOMMON::SYSTEM_ACK_PROBE_CODE);
|
||||||
|
msgout.put_sint32(max);
|
||||||
|
for(int i=0; i < max ; ++i )
|
||||||
|
{
|
||||||
|
int data = this->_data->_latest_probes[i];
|
||||||
|
msgout.put_sint32(data);
|
||||||
|
}
|
||||||
|
if (this->_network->_socketUDP->put_packet_buffer(msgout.get_data()) != Error::OK)
|
||||||
|
{
|
||||||
|
ERR_PRINT("Error to send disconnect");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this->_data->_latest_probes.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void StateConnectionConnected::receive_system_sync(Ref<BitStream> msgin)
|
||||||
|
{
|
||||||
|
bool valide = true;
|
||||||
|
int i;
|
||||||
|
OS::get_singleton()->print("[%s:%d] SYSTEM_SYNC_CODE\n", __FILE__, __LINE__);
|
||||||
|
|
||||||
|
uint32_t synchronize = msgin->get_uint32();
|
||||||
|
int64_t stime = msgin->get_sint64();
|
||||||
|
uint32_t latestsync = msgin->get_uint32();
|
||||||
|
PoolByteArray msg_xml = msgin->get_array_uint8(16);
|
||||||
|
PoolByteArray database_xml = msgin->get_array_uint8(16);
|
||||||
|
|
||||||
|
OS::get_singleton()->print("[%s:%d] SYSTEM_SYNC_CODE synchronize:%u, stime:%ld, latestsync:%u\n", __FILE__, __LINE__, synchronize, stime, latestsync);
|
||||||
|
|
||||||
|
if ( msg_xml.size() != this->_data->_checksum_msg_xml.size() )
|
||||||
|
{
|
||||||
|
valide = false;
|
||||||
|
ERR_PRINTS("MSG XML is incorrect (server:" + itos(msg_xml.size()) +", client:" + itos(this->_data->_checksum_msg_xml.size()) + ")");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for(i=0; i<msg_xml.size(); ++i)
|
||||||
|
{
|
||||||
|
if ( (int) msg_xml[i] != (int) this->_data->_checksum_msg_xml[i] )
|
||||||
|
{
|
||||||
|
valide = false;
|
||||||
|
ERR_PRINTS("MSG XML is incorrect (pos:" + itos(i) +")");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( valide == true )
|
||||||
|
{
|
||||||
|
OS::get_singleton()->print("[%s:%d] MSG XML is correct\n", __FILE__, __LINE__);
|
||||||
|
this->_data->_server_sync = latestsync;
|
||||||
|
this->_data->_synchronize = synchronize;
|
||||||
|
this->_data->_current_server_tick = this->_data->_synchronize + this->_data->_current_received_number + 2;
|
||||||
|
this->_data->_current_client_tick = this->_data->_current_server_tick + (LCT + this->_data->_ms_per_tick) / this->_data->_ms_per_tick;
|
||||||
|
this->_data->_current_client_time = this->_data->_update_time - (LCT + this->_data->_ms_per_tick);
|
||||||
|
//this->_state = STATE::Synchronize;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ERR_PRINTS("MSG.XML is wrong");
|
||||||
|
}
|
||||||
|
|
||||||
|
void StateConnectionConnected::receive_message(int index)
|
||||||
|
{
|
||||||
|
// SHOW_USAGE_MEMORY
|
||||||
|
bool system_mode;
|
||||||
|
|
||||||
|
Ref<BitStreamField> field = this->_network->_queue.get_msg(index);
|
||||||
|
uint32_t current_received_number = field->get_id();
|
||||||
|
this->_data->_current_received_number = current_received_number;
|
||||||
|
Ref<BitStream> msgin = field->get_msgin();
|
||||||
|
|
||||||
|
system_mode = msgin->get_bool();
|
||||||
|
if ( system_mode == true )
|
||||||
|
{
|
||||||
|
//OS::get_singleton()->print("[%s:%d] system message (%d) [%d]\n", __FILE__, __LINE__, (int)current_received_number, this->_network->_queue.length());
|
||||||
|
int message = msgin->get_uint8();
|
||||||
|
switch (message)
|
||||||
|
{
|
||||||
|
case CLFECOMMON::SYSTEM_LOGIN_CODE:
|
||||||
|
OS::get_singleton()->print("[%s:%d] Receive SYSTEM_LOGIN_CODE (%d) [%d]\n", __FILE__, __LINE__, (int)current_received_number, this->_network->_queue.length());
|
||||||
|
break;
|
||||||
|
case CLFECOMMON::SYSTEM_SYNC_CODE:
|
||||||
|
OS::get_singleton()->print("[%s:%d] Receive SYSTEM_SYNC_CODE (%d) [%d]\n", __FILE__, __LINE__, (int)current_received_number, this->_network->_queue.length());
|
||||||
|
this->receive_system_sync(msgin);
|
||||||
|
break;
|
||||||
|
case CLFECOMMON::SYSTEM_STALLED_CODE:
|
||||||
|
OS::get_singleton()->print("[%s:%d] Receive SYSTEM_STALLED_CODE (%d) [%d]\n", __FILE__, __LINE__, (int)current_received_number, this->_network->_queue.length());
|
||||||
|
break;
|
||||||
|
case CLFECOMMON::SYSTEM_SERVER_DOWN_CODE:
|
||||||
|
OS::get_singleton()->print("[%s:%d] Receive SYSTEM_SERVER_DOWN_CODE (%d) [%d]\n", __FILE__, __LINE__, (int)current_received_number, this->_network->_queue.length());
|
||||||
|
break;
|
||||||
|
case CLFECOMMON::SYSTEM_PROBE_CODE:
|
||||||
|
OS::get_singleton()->print("[%s:%d] Receive SYSTEM_PROBE_CODE (%d) [%d]\n", __FILE__, __LINE__, (int)current_received_number, this->_network->_queue.length());
|
||||||
|
this->_data->_latest_probes.append(msgin->get_sint32());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
OS::get_singleton()->print("[%s:%d] Receive UNKNOWN SYSTEM MESSAGE [id:%d] (%d) [%d]\n", __FILE__, __LINE__, message, (int)current_received_number, this->_network->_queue.length());
|
||||||
|
//ERR_PRINTS("Received unknown message [" + itos(message) + "]");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
OS::get_singleton()->print("[%s:%d] application message (%d) [%d]\n", __FILE__, __LINE__, (int)current_received_number, this->_network->_queue.length());
|
||||||
|
}
|
||||||
|
this->_network->_queue.erase_index(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
void StateConnectionConnected::send_message()
|
||||||
|
{
|
||||||
|
if ( this->_data->_server_sync != this->_data->_client_sync )
|
||||||
|
this->send_system_ack_sync();
|
||||||
|
if (this->_data->_latest_probes.size() != 0 )
|
||||||
|
this->send_system_ack_probe();
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
*/
|
144
modules/networkconnection/state_connexion.h
Normal file
144
modules/networkconnection/state_connexion.h
Normal file
|
@ -0,0 +1,144 @@
|
||||||
|
/*
|
||||||
|
Header NetworkConnectionCore
|
||||||
|
|
||||||
|
Copyright (C) 2019 AleaJactaEst
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef STATE_CONNEXION_H
|
||||||
|
#define STATE_CONNEXION_H
|
||||||
|
|
||||||
|
#include "core/reference.h"
|
||||||
|
#include "core/io/packet_peer_udp.h"
|
||||||
|
#include "modules/bitset/bitset.h"
|
||||||
|
#include "modules/bitstreamqueue/bitstreamqueue.h"
|
||||||
|
#include "network_data.h"
|
||||||
|
|
||||||
|
#define NUM_BITS_IN_LONG_ACK 512
|
||||||
|
|
||||||
|
enum STATE {
|
||||||
|
NotInitialised = 0,
|
||||||
|
//NotConnected = 1, // When received a cookie - not used here
|
||||||
|
//Authenticate = 2,
|
||||||
|
Login = 3,
|
||||||
|
Synchronize = 4,
|
||||||
|
Connected = 5, // State when we are connecte
|
||||||
|
//Probe = 6,
|
||||||
|
//Stalled = 7,
|
||||||
|
Disconnect = 8,
|
||||||
|
Quit = 9,
|
||||||
|
ForceSynchronize = 10
|
||||||
|
};
|
||||||
|
|
||||||
|
enum CLFECOMMON {
|
||||||
|
SYSTEM_LOGIN_CODE = 0,
|
||||||
|
SYSTEM_SYNC_CODE = 1,
|
||||||
|
SYSTEM_ACK_SYNC_CODE = 2,
|
||||||
|
SYSTEM_PROBE_CODE = 3,
|
||||||
|
SYSTEM_ACK_PROBE_CODE = 4,
|
||||||
|
SYSTEM_DISCONNECTION_CODE = 5,
|
||||||
|
SYSTEM_STALLED_CODE = 6,
|
||||||
|
SYSTEM_SERVER_DOWN_CODE = 7,
|
||||||
|
SYSTEM_QUIT_CODE = 8,
|
||||||
|
SYSTEM_ACK_QUIT_CODE = 9,
|
||||||
|
NUMBITSINLONGACK = 512
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class NetworkConnectionCore;
|
||||||
|
|
||||||
|
// Virtual class reference for network state
|
||||||
|
class StateConnectionBase
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
NetworkConnectionCore * _network;
|
||||||
|
NetworkData * _data;
|
||||||
|
public:
|
||||||
|
StateConnectionBase(NetworkConnectionCore * network);
|
||||||
|
~StateConnectionBase() {}
|
||||||
|
virtual int get_state() {return STATE::NotInitialised;}
|
||||||
|
virtual void connect_to_server() {}
|
||||||
|
virtual void send_message() {}
|
||||||
|
//virtual void send_system_login() {}
|
||||||
|
virtual void send_system_quit() {}
|
||||||
|
virtual void send_system_disconnect() {}
|
||||||
|
// virtual void send_system_ack_sync() {}
|
||||||
|
|
||||||
|
virtual void receive_message(int index) {}
|
||||||
|
virtual void send_system() {}
|
||||||
|
};
|
||||||
|
|
||||||
|
// class define state not initialized
|
||||||
|
class StateConnectionNotInitialized : public StateConnectionBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
StateConnectionNotInitialized(NetworkConnectionCore * network) : StateConnectionBase(network) {}
|
||||||
|
~StateConnectionNotInitialized() {}
|
||||||
|
int get_state() {return STATE::NotInitialised;}
|
||||||
|
void connect_to_server();
|
||||||
|
};
|
||||||
|
|
||||||
|
// class define state login
|
||||||
|
class StateConnectionLogin : public StateConnectionBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
StateConnectionLogin(NetworkConnectionCore * network) : StateConnectionBase(network) {}
|
||||||
|
~StateConnectionLogin() {}
|
||||||
|
int get_state() {return STATE::Login;}
|
||||||
|
void send_system_quit();
|
||||||
|
void send_message();
|
||||||
|
};
|
||||||
|
|
||||||
|
// class define state synchronize
|
||||||
|
class StateConnectionSynchronize : public StateConnectionBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
StateConnectionSynchronize(NetworkConnectionCore * network) : StateConnectionBase(network) {}
|
||||||
|
~StateConnectionSynchronize() {}
|
||||||
|
int get_state() {return STATE::Synchronize;}
|
||||||
|
void receive_system_sync(Ref<BitStream> msgin);
|
||||||
|
void send_system_quit();
|
||||||
|
void send_system_ack_sync();
|
||||||
|
void receive_message(int index);
|
||||||
|
void send_message();
|
||||||
|
};
|
||||||
|
|
||||||
|
// class define state connected
|
||||||
|
class StateConnectionConnected : public StateConnectionBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
StateConnectionConnected(NetworkConnectionCore * network) : StateConnectionBase(network) {}
|
||||||
|
~StateConnectionConnected() {}
|
||||||
|
int get_state() {return STATE::Connected;}
|
||||||
|
void send_system_quit();
|
||||||
|
void send_system_disconnect();
|
||||||
|
void send_system_ack_sync();
|
||||||
|
void send_system_ack_probe();
|
||||||
|
void receive_system_sync(Ref<BitStream> msgin);
|
||||||
|
void receive_message(int index);
|
||||||
|
void send_message();
|
||||||
|
};
|
||||||
|
|
||||||
|
// class define state quit
|
||||||
|
class StateConnectionQuit : public StateConnectionBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
StateConnectionQuit(NetworkConnectionCore * network) : StateConnectionBase(network) {}
|
||||||
|
~StateConnectionQuit() {}
|
||||||
|
int get_state() {return STATE::Quit;}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -30,6 +30,11 @@ msg="*res://assets/Scripts/Definition/msg.gd"
|
||||||
[debug]
|
[debug]
|
||||||
|
|
||||||
settings/stdout/verbose_stdout=true
|
settings/stdout/verbose_stdout=true
|
||||||
|
gdscript/warnings/unused_class_variable=true
|
||||||
|
gdscript/warnings/unsafe_property_access=true
|
||||||
|
gdscript/warnings/unsafe_method_access=true
|
||||||
|
gdscript/warnings/unsafe_cast=true
|
||||||
|
gdscript/warnings/unsafe_call_argument=true
|
||||||
|
|
||||||
[display]
|
[display]
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue