Merge pull request #6657 from Faless/multi_channel_rpc

Use 2 different ENet channels for reliable/unreliable packets
This commit is contained in:
Rémi Verschelde 2016-10-09 14:05:40 +02:00 committed by GitHub
commit c16c621c97
2 changed files with 27 additions and 16 deletions

View file

@ -32,7 +32,7 @@ Error NetworkedMultiplayerENet::create_server(int p_port, int p_max_clients, int
host = enet_host_create (& address /* the address to bind the server host to */,
p_max_clients /* allow up to 32 clients and/or outgoing connections */,
2 /* allow up to 2 channels to be used, 0 and 1 */,
SYSCH_MAX /* allow up to SYSCH_MAX channels to be used */,
p_in_bandwidth /* assume any amount of incoming bandwidth */,
p_out_bandwidth /* assume any amount of outgoing bandwidth */);
@ -52,7 +52,7 @@ Error NetworkedMultiplayerENet::create_client(const IP_Address& p_ip, int p_port
host = enet_host_create (NULL /* create a client host */,
1 /* only allow 1 outgoing connection */,
2 /* allow up 2 channels to be used, 0 and 1 */,
SYSCH_MAX /* allow up to SYSCH_MAX channels to be used */,
p_in_bandwidth /* 56K modem with 56 Kbps downstream bandwidth */,
p_out_bandwidth /* 56K modem with 14 Kbps upstream bandwidth */);
@ -70,8 +70,8 @@ Error NetworkedMultiplayerENet::create_client(const IP_Address& p_ip, int p_port
unique_id=_gen_unique_id();
/* Initiate the connection, allocating the two channels 0 and 1. */
ENetPeer *peer = enet_host_connect (host, & address, 2, unique_id);
/* Initiate the connection, allocating the enough channels */
ENetPeer *peer = enet_host_connect (host, & address, SYSCH_MAX, unique_id);
if (peer == NULL) {
enet_host_destroy(host);
@ -148,12 +148,12 @@ void NetworkedMultiplayerENet::poll(){
ENetPacket * packet = enet_packet_create (NULL,8,ENET_PACKET_FLAG_RELIABLE);
encode_uint32(SYSMSG_ADD_PEER,&packet->data[0]);
encode_uint32(E->key(),&packet->data[4]);
enet_peer_send(event.peer,1,packet);
enet_peer_send(event.peer,SYSCH_CONFIG,packet);
//send the new peer to existing peers
packet = enet_packet_create (NULL,8,ENET_PACKET_FLAG_RELIABLE);
encode_uint32(SYSMSG_ADD_PEER,&packet->data[0]);
encode_uint32(*new_id,&packet->data[4]);
enet_peer_send(E->get(),1,packet);
enet_peer_send(E->get(),SYSCH_CONFIG,packet);
}
} else {
@ -185,7 +185,7 @@ void NetworkedMultiplayerENet::poll(){
ENetPacket* packet = enet_packet_create (NULL,8,ENET_PACKET_FLAG_RELIABLE);
encode_uint32(SYSMSG_REMOVE_PEER,&packet->data[0]);
encode_uint32(*id,&packet->data[4]);
enet_peer_send(E->get(),1,packet);
enet_peer_send(E->get(),SYSCH_CONFIG,packet);
}
} else if (!server) {
emit_signal("server_disconnected");
@ -204,7 +204,7 @@ void NetworkedMultiplayerENet::poll(){
case ENET_EVENT_TYPE_RECEIVE: {
if (event.channelID==1) {
if (event.channelID==SYSCH_CONFIG) {
//some config message
ERR_CONTINUE( event.packet->dataLength < 8);
@ -226,7 +226,7 @@ void NetworkedMultiplayerENet::poll(){
}
enet_packet_destroy(event.packet);
} else if (event.channelID==0){
} else if (event.channelID < SYSCH_MAX){
Packet packet;
packet.packet = event.packet;
@ -258,7 +258,7 @@ void NetworkedMultiplayerENet::poll(){
ENetPacket* packet2 = enet_packet_create (packet.packet->data,packet.packet->dataLength,flags);
enet_peer_send(E->get(),0,packet2);
enet_peer_send(E->get(),event.channelID,packet2);
}
} else if (target<0) {
@ -272,7 +272,7 @@ void NetworkedMultiplayerENet::poll(){
ENetPacket* packet2 = enet_packet_create (packet.packet->data,packet.packet->dataLength,flags);
enet_peer_send(E->get(),0,packet2);
enet_peer_send(E->get(),event.channelID,packet2);
}
if (-target != 1) {
@ -289,7 +289,7 @@ void NetworkedMultiplayerENet::poll(){
} else {
//to someone else, specifically
ERR_CONTINUE(!peer_map.has(target));
enet_peer_send(peer_map[target],0,packet.packet);
enet_peer_send(peer_map[target],event.channelID,packet.packet);
}
} else {
@ -369,16 +369,20 @@ Error NetworkedMultiplayerENet::put_packet(const uint8_t *p_buffer,int p_buffer_
ERR_FAIL_COND_V(connection_status!=CONNECTION_CONNECTED,ERR_UNCONFIGURED);
int packet_flags=0;
int channel=SYSCH_RELIABLE;
switch(transfer_mode) {
case TRANSFER_MODE_UNRELIABLE: {
packet_flags=ENET_PACKET_FLAG_UNSEQUENCED;
channel=SYSCH_UNRELIABLE;
} break;
case TRANSFER_MODE_UNRELIABLE_ORDERED: {
packet_flags=0;
channel=SYSCH_UNRELIABLE;
} break;
case TRANSFER_MODE_RELIABLE: {
packet_flags=ENET_PACKET_FLAG_RELIABLE;
channel=SYSCH_RELIABLE;
} break;
}
@ -402,7 +406,7 @@ Error NetworkedMultiplayerENet::put_packet(const uint8_t *p_buffer,int p_buffer_
if (server) {
if (target_peer==0) {
enet_host_broadcast(host,0,packet);
enet_host_broadcast(host,channel,packet);
} else if (target_peer<0) {
//send to all but one
//and make copies for sending
@ -416,18 +420,18 @@ Error NetworkedMultiplayerENet::put_packet(const uint8_t *p_buffer,int p_buffer_
ENetPacket* packet2 = enet_packet_create (packet->data,packet->dataLength,packet_flags);
enet_peer_send(F->get(),0,packet2);
enet_peer_send(F->get(),channel,packet2);
}
enet_packet_destroy(packet); //original packet no longer needed
} else {
enet_peer_send (E->get(), 0, packet);
enet_peer_send (E->get(), channel, packet);
}
} else {
ERR_FAIL_COND_V(!peer_map.has(1),ERR_BUG);
enet_peer_send (peer_map[1], 0, packet); //send to server for broadcast..
enet_peer_send (peer_map[1], channel, packet); //send to server for broadcast..
}

View file

@ -23,6 +23,13 @@ private:
SYSMSG_REMOVE_PEER
};
enum {
SYSCH_CONFIG,
SYSCH_RELIABLE,
SYSCH_UNRELIABLE,
SYSCH_MAX
};
bool active;
bool server;