networked_multiplayer_enet.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  1. #include "os/os.h"
  2. #include "io/marshalls.h"
  3. #include "networked_multiplayer_enet.h"
  4. void NetworkedMultiplayerENet::set_transfer_mode(TransferMode p_mode) {
  5. transfer_mode=p_mode;
  6. }
  7. void NetworkedMultiplayerENet::set_target_peer(int p_peer){
  8. target_peer=p_peer;
  9. }
  10. int NetworkedMultiplayerENet::get_packet_peer() const{
  11. ERR_FAIL_COND_V(!active,1);
  12. ERR_FAIL_COND_V(incoming_packets.size()==0,1);
  13. return incoming_packets.front()->get().from;
  14. }
  15. Error NetworkedMultiplayerENet::create_server(int p_port, int p_max_clients, int p_in_bandwidth, int p_out_bandwidth){
  16. ERR_FAIL_COND_V(active,ERR_ALREADY_IN_USE);
  17. ENetAddress address;
  18. address.host = ENET_HOST_ANY;
  19. address.port = p_port;
  20. host = enet_host_create (& address /* the address to bind the server host to */,
  21. p_max_clients /* allow up to 32 clients and/or outgoing connections */,
  22. 2 /* allow up to 2 channels to be used, 0 and 1 */,
  23. p_in_bandwidth /* assume any amount of incoming bandwidth */,
  24. p_out_bandwidth /* assume any amount of outgoing bandwidth */);
  25. ERR_FAIL_COND_V(!host,ERR_CANT_CREATE);
  26. active=true;
  27. server=true;
  28. refuse_connections=false;
  29. unique_id=1;
  30. connection_status=CONNECTION_CONNECTED;
  31. return OK;
  32. }
  33. Error NetworkedMultiplayerENet::create_client(const IP_Address& p_ip, int p_port, int p_in_bandwidth, int p_out_bandwidth){
  34. ERR_FAIL_COND_V(active,ERR_ALREADY_IN_USE);
  35. host = enet_host_create (NULL /* create a client host */,
  36. 1 /* only allow 1 outgoing connection */,
  37. 2 /* allow up 2 channels to be used, 0 and 1 */,
  38. p_in_bandwidth /* 56K modem with 56 Kbps downstream bandwidth */,
  39. p_out_bandwidth /* 56K modem with 14 Kbps upstream bandwidth */);
  40. ERR_FAIL_COND_V(!host,ERR_CANT_CREATE);
  41. ENetAddress address;
  42. address.host=p_ip.host;
  43. address.port=p_port;
  44. //enet_address_set_host (& address, "localhost");
  45. //address.port = p_port;
  46. unique_id=_gen_unique_id();
  47. /* Initiate the connection, allocating the two channels 0 and 1. */
  48. ENetPeer *peer = enet_host_connect (host, & address, 2, unique_id);
  49. if (peer == NULL) {
  50. enet_host_destroy(host);
  51. ERR_FAIL_COND_V(!peer,ERR_CANT_CREATE);
  52. }
  53. //technically safe to ignore the peer or anything else.
  54. connection_status=CONNECTION_CONNECTING;
  55. active=true;
  56. server=false;
  57. refuse_connections=false;
  58. return OK;
  59. }
  60. void NetworkedMultiplayerENet::poll(){
  61. ERR_FAIL_COND(!active);
  62. _pop_current_packet();
  63. ENetEvent event;
  64. /* Wait up to 1000 milliseconds for an event. */
  65. while (true) {
  66. if (!host || !active) //might have been disconnected while emitting a notification
  67. return;
  68. int ret = enet_host_service (host, & event, 1);
  69. if (ret<0) {
  70. //error, do something?
  71. break;
  72. } else if (ret==0) {
  73. break;
  74. }
  75. switch (event.type)
  76. {
  77. case ENET_EVENT_TYPE_CONNECT: {
  78. /* Store any relevant client information here. */
  79. if (server && refuse_connections) {
  80. enet_peer_reset(event.peer);
  81. break;
  82. }
  83. IP_Address ip;
  84. ip.host=event.peer -> address.host;
  85. int *new_id = memnew( int );
  86. *new_id = event.data;
  87. if (*new_id==0) { //data zero is sent by server (enet won't let you configure this). Server is always 1
  88. *new_id=1;
  89. }
  90. event.peer->data=new_id;
  91. peer_map[*new_id]=event.peer;
  92. connection_status=CONNECTION_CONNECTED; //if connecting, this means it connected t something!
  93. emit_signal("peer_connected",*new_id);
  94. if (server) {
  95. //someone connected, let it know of all the peers available
  96. for (Map<int,ENetPeer*>::Element *E=peer_map.front();E;E=E->next()) {
  97. if (E->key()==*new_id)
  98. continue;
  99. //send existing peers to new peer
  100. ENetPacket * packet = enet_packet_create (NULL,8,ENET_PACKET_FLAG_RELIABLE);
  101. encode_uint32(SYSMSG_ADD_PEER,&packet->data[0]);
  102. encode_uint32(E->key(),&packet->data[4]);
  103. enet_peer_send(event.peer,1,packet);
  104. //send the new peer to existing peers
  105. packet = enet_packet_create (NULL,8,ENET_PACKET_FLAG_RELIABLE);
  106. encode_uint32(SYSMSG_ADD_PEER,&packet->data[0]);
  107. encode_uint32(*new_id,&packet->data[4]);
  108. enet_peer_send(E->get(),1,packet);
  109. }
  110. } else {
  111. emit_signal("connection_succeeded");
  112. }
  113. } break;
  114. case ENET_EVENT_TYPE_DISCONNECT: {
  115. /* Reset the peer's client information. */
  116. int *id = (int*)event.peer -> data;
  117. if (!id) {
  118. if (!server) {
  119. emit_signal("connection_failed");
  120. }
  121. } else {
  122. if (server) {
  123. //someone disconnected, let it know to everyone else
  124. for (Map<int,ENetPeer*>::Element *E=peer_map.front();E;E=E->next()) {
  125. if (E->key()==*id)
  126. continue;
  127. //send the new peer to existing peers
  128. ENetPacket* packet = enet_packet_create (NULL,8,ENET_PACKET_FLAG_RELIABLE);
  129. encode_uint32(SYSMSG_REMOVE_PEER,&packet->data[0]);
  130. encode_uint32(*id,&packet->data[4]);
  131. enet_peer_send(E->get(),1,packet);
  132. }
  133. } else if (!server) {
  134. emit_signal("server_disconnected");
  135. close_connection();
  136. return;
  137. }
  138. emit_signal("peer_disconnected",*id);
  139. peer_map.erase(*id);
  140. memdelete( id );
  141. }
  142. } break;
  143. case ENET_EVENT_TYPE_RECEIVE: {
  144. if (event.channelID==1) {
  145. //some config message
  146. ERR_CONTINUE( event.packet->dataLength < 8);
  147. int msg = decode_uint32(&event.packet->data[0]);
  148. int id = decode_uint32(&event.packet->data[4]);
  149. switch(msg) {
  150. case SYSMSG_ADD_PEER: {
  151. peer_map[id]=NULL;
  152. emit_signal("peer_connected",id);
  153. } break;
  154. case SYSMSG_REMOVE_PEER: {
  155. peer_map.erase(id);
  156. emit_signal("peer_disconnected",id);
  157. } break;
  158. }
  159. enet_packet_destroy(event.packet);
  160. } else if (event.channelID==0){
  161. Packet packet;
  162. packet.packet = event.packet;
  163. int *id = (int*)event.peer -> data;
  164. ERR_CONTINUE(event.packet->dataLength<12)
  165. uint32_t source = decode_uint32(&event.packet->data[0]);
  166. int target = decode_uint32(&event.packet->data[4]);
  167. uint32_t flags = decode_uint32(&event.packet->data[8]);
  168. packet.from=source;
  169. if (server) {
  170. packet.from=*id;
  171. if (target==0) {
  172. //re-send the everyone but sender :|
  173. incoming_packets.push_back(packet);
  174. //and make copies for sending
  175. for (Map<int,ENetPeer*>::Element *E=peer_map.front();E;E=E->next()) {
  176. if (uint32_t(E->key())==source) //do not resend to self
  177. continue;
  178. ENetPacket* packet2 = enet_packet_create (packet.packet->data,packet.packet->dataLength,flags);
  179. enet_peer_send(E->get(),0,packet2);
  180. }
  181. } else if (target<0) {
  182. //to all but one
  183. //and make copies for sending
  184. for (Map<int,ENetPeer*>::Element *E=peer_map.front();E;E=E->next()) {
  185. if (uint32_t(E->key())==source || E->key()==-target) //do not resend to self, also do not send to excluded
  186. continue;
  187. ENetPacket* packet2 = enet_packet_create (packet.packet->data,packet.packet->dataLength,flags);
  188. enet_peer_send(E->get(),0,packet2);
  189. }
  190. if (-target != 1) {
  191. //server is not excluded
  192. incoming_packets.push_back(packet);
  193. } else {
  194. //server is excluded, erase packet
  195. enet_packet_destroy(packet.packet);
  196. }
  197. } else if (target==1) {
  198. //to myself and only myself
  199. incoming_packets.push_back(packet);
  200. } else {
  201. //to someone else, specifically
  202. ERR_CONTINUE(!peer_map.has(target));
  203. enet_peer_send(peer_map[target],0,packet.packet);
  204. }
  205. } else {
  206. incoming_packets.push_back(packet);
  207. }
  208. //destroy packet later..
  209. } else {
  210. ERR_CONTINUE(true);
  211. }
  212. }break;
  213. case ENET_EVENT_TYPE_NONE: {
  214. //do nothing
  215. } break;
  216. }
  217. }
  218. }
  219. bool NetworkedMultiplayerENet::is_server() const {
  220. ERR_FAIL_COND_V(!active,false);
  221. return server;
  222. }
  223. void NetworkedMultiplayerENet::close_connection() {
  224. if (!active)
  225. return;
  226. _pop_current_packet();
  227. bool peers_disconnected=false;
  228. for (Map<int,ENetPeer*>::Element *E=peer_map.front();E;E=E->next()) {
  229. if (E->get()) {
  230. enet_peer_disconnect_now(E->get(),unique_id);
  231. peers_disconnected=true;
  232. }
  233. }
  234. if (peers_disconnected) {
  235. enet_host_flush(host);
  236. OS::get_singleton()->delay_usec(100); //wait 100ms for disconnection packets to send
  237. }
  238. enet_host_destroy(host);
  239. active=false;
  240. incoming_packets.clear();
  241. unique_id=1; //server is 1
  242. connection_status=CONNECTION_DISCONNECTED;
  243. }
  244. int NetworkedMultiplayerENet::get_available_packet_count() const {
  245. return incoming_packets.size();
  246. }
  247. Error NetworkedMultiplayerENet::get_packet(const uint8_t **r_buffer,int &r_buffer_size) const{
  248. ERR_FAIL_COND_V(incoming_packets.size()==0,ERR_UNAVAILABLE);
  249. _pop_current_packet();
  250. current_packet = incoming_packets.front()->get();
  251. incoming_packets.pop_front();
  252. *r_buffer=(const uint8_t*)(&current_packet.packet->data[12]);
  253. r_buffer_size=current_packet.packet->dataLength;
  254. return OK;
  255. }
  256. Error NetworkedMultiplayerENet::put_packet(const uint8_t *p_buffer,int p_buffer_size){
  257. ERR_FAIL_COND_V(!active,ERR_UNCONFIGURED);
  258. ERR_FAIL_COND_V(connection_status!=CONNECTION_CONNECTED,ERR_UNCONFIGURED);
  259. int packet_flags=0;
  260. switch(transfer_mode) {
  261. case TRANSFER_MODE_UNRELIABLE: {
  262. packet_flags=ENET_PACKET_FLAG_UNSEQUENCED;
  263. } break;
  264. case TRANSFER_MODE_RELIABLE: {
  265. packet_flags=ENET_PACKET_FLAG_RELIABLE;
  266. } break;
  267. case TRANSFER_MODE_ORDERED: {
  268. packet_flags=ENET_PACKET_FLAG_RELIABLE;
  269. } break;
  270. }
  271. Map<int,ENetPeer*>::Element *E=NULL;
  272. if (target_peer!=0) {
  273. E = peer_map.find(ABS(target_peer));
  274. if (!E) {
  275. ERR_EXPLAIN("Invalid Target Peer: "+itos(target_peer));
  276. ERR_FAIL_V(ERR_INVALID_PARAMETER);
  277. }
  278. }
  279. ENetPacket * packet = enet_packet_create (NULL,p_buffer_size+12,packet_flags);
  280. encode_uint32(unique_id,&packet->data[0]); //source ID
  281. encode_uint32(target_peer,&packet->data[4]); //dest ID
  282. encode_uint32(packet_flags,&packet->data[8]); //dest ID
  283. copymem(&packet->data[12],p_buffer,p_buffer_size);
  284. if (server) {
  285. if (target_peer==0) {
  286. enet_host_broadcast(host,0,packet);
  287. } else if (target_peer<0) {
  288. //send to all but one
  289. //and make copies for sending
  290. int exclude=-target_peer;
  291. for (Map<int,ENetPeer*>::Element *F=peer_map.front();F;F=F->next()) {
  292. if (F->key()==exclude) // exclude packet
  293. continue;
  294. ENetPacket* packet2 = enet_packet_create (packet->data,packet->dataLength,packet_flags);
  295. enet_peer_send(F->get(),0,packet2);
  296. }
  297. enet_packet_destroy(packet); //original packet no longer needed
  298. } else {
  299. enet_peer_send (E->get(), 0, packet);
  300. }
  301. } else {
  302. ERR_FAIL_COND_V(!peer_map.has(1),ERR_BUG);
  303. enet_peer_send (peer_map[1], 0, packet); //send to server for broadcast..
  304. }
  305. enet_host_flush(host);
  306. return OK;
  307. }
  308. int NetworkedMultiplayerENet::get_max_packet_size() const {
  309. return 1<<24; //anything is good
  310. }
  311. void NetworkedMultiplayerENet::_pop_current_packet() const {
  312. if (current_packet.packet) {
  313. enet_packet_destroy(current_packet.packet);
  314. current_packet.packet=NULL;
  315. current_packet.from=0;
  316. }
  317. }
  318. NetworkedMultiplayerPeer::ConnectionStatus NetworkedMultiplayerENet::get_connection_status() const {
  319. return connection_status;
  320. }
  321. uint32_t NetworkedMultiplayerENet::_gen_unique_id() const {
  322. uint32_t hash = 0;
  323. while (hash==0 || hash==1) {
  324. hash = hash_djb2_one_32(
  325. (uint32_t)OS::get_singleton()->get_ticks_usec() );
  326. hash = hash_djb2_one_32(
  327. (uint32_t)OS::get_singleton()->get_unix_time(), hash );
  328. hash = hash_djb2_one_32(
  329. (uint32_t)OS::get_singleton()->get_data_dir().hash64(), hash );
  330. //hash = hash_djb2_one_32(
  331. // (uint32_t)OS::get_singleton()->get_unique_ID().hash64(), hash );
  332. hash = hash_djb2_one_32(
  333. (uint32_t)((uint64_t)this), hash ); //rely on aslr heap
  334. hash = hash_djb2_one_32(
  335. (uint32_t)((uint64_t)&hash), hash ); //rely on aslr stack
  336. hash=hash&0x7FFFFFFF; // make it compatible with unsigned, since negatie id is used for exclusion
  337. }
  338. return hash;
  339. }
  340. int NetworkedMultiplayerENet::get_unique_id() const {
  341. ERR_FAIL_COND_V(!active,0);
  342. return unique_id;
  343. }
  344. void NetworkedMultiplayerENet::set_refuse_new_connections(bool p_enable) {
  345. refuse_connections=p_enable;
  346. }
  347. bool NetworkedMultiplayerENet::is_refusing_new_connections() const {
  348. return refuse_connections;
  349. }
  350. void NetworkedMultiplayerENet::_bind_methods() {
  351. ObjectTypeDB::bind_method(_MD("create_server","port","max_clients","in_bandwidth","out_bandwidth"),&NetworkedMultiplayerENet::create_server,DEFVAL(32),DEFVAL(0),DEFVAL(0));
  352. ObjectTypeDB::bind_method(_MD("create_client","ip","port","in_bandwidth","out_bandwidth"),&NetworkedMultiplayerENet::create_client,DEFVAL(0),DEFVAL(0));
  353. ObjectTypeDB::bind_method(_MD("close_connection"),&NetworkedMultiplayerENet::close_connection);
  354. }
  355. NetworkedMultiplayerENet::NetworkedMultiplayerENet(){
  356. active=false;
  357. server=false;
  358. refuse_connections=false;
  359. unique_id=0;
  360. target_peer=0;
  361. current_packet.packet=NULL;
  362. transfer_mode=TRANSFER_MODE_ORDERED;
  363. connection_status=CONNECTION_DISCONNECTED;
  364. }
  365. NetworkedMultiplayerENet::~NetworkedMultiplayerENet(){
  366. close_connection();
  367. }