src/network/network_server.cpp
changeset 5902 a9508c166390
parent 5900 135d10dd7219
child 5918 f06b73812d5f
equal deleted inserted replaced
5901:ab59510b0c9c 5902:a9508c166390
    51 		p->Send_uint16(ci->client_index);
    51 		p->Send_uint16(ci->client_index);
    52 		p->Send_uint8 (ci->client_playas);
    52 		p->Send_uint8 (ci->client_playas);
    53 		p->Send_string(ci->client_name);
    53 		p->Send_string(ci->client_name);
    54 		p->Send_string(ci->unique_id);
    54 		p->Send_string(ci->unique_id);
    55 
    55 
    56 		NetworkSend_Packet(p, cs);
    56 		cs->Send_Packet(p);
    57 	}
    57 	}
    58 }
    58 }
    59 
    59 
    60 DEF_SERVER_SEND_COMMAND(PACKET_SERVER_COMPANY_INFO)
    60 DEF_SERVER_SEND_COMMAND(PACKET_SERVER_COMPANY_INFO)
    61 {
    61 {
    76 		p = NetworkSend_Init(PACKET_SERVER_COMPANY_INFO);
    76 		p = NetworkSend_Init(PACKET_SERVER_COMPANY_INFO);
    77 
    77 
    78 		p->Send_uint8 (NETWORK_COMPANY_INFO_VERSION);
    78 		p->Send_uint8 (NETWORK_COMPANY_INFO_VERSION);
    79 		p->Send_uint8 (active);
    79 		p->Send_uint8 (active);
    80 
    80 
    81 		NetworkSend_Packet(p, cs);
    81 		cs->Send_Packet(p);
    82 		return;
    82 		return;
    83 	}
    83 	}
    84 
    84 
    85 	NetworkPopulateCompanyInfo();
    85 	NetworkPopulateCompanyInfo();
    86 
    86 
   115 			p->Send_string("<none>");
   115 			p->Send_string("<none>");
   116 		} else {
   116 		} else {
   117 			p->Send_string(_network_player_info[player->index].players);
   117 			p->Send_string(_network_player_info[player->index].players);
   118 		}
   118 		}
   119 
   119 
   120 		NetworkSend_Packet(p, cs);
   120 		cs->Send_Packet(p);
   121 	}
   121 	}
   122 
   122 
   123 	p = NetworkSend_Init(PACKET_SERVER_COMPANY_INFO);
   123 	p = NetworkSend_Init(PACKET_SERVER_COMPANY_INFO);
   124 
   124 
   125 	p->Send_uint8 (NETWORK_COMPANY_INFO_VERSION);
   125 	p->Send_uint8 (NETWORK_COMPANY_INFO_VERSION);
   126 	p->Send_uint8 (0);
   126 	p->Send_uint8 (0);
   127 
   127 
   128 	NetworkSend_Packet(p, cs);
   128 	cs->Send_Packet(p);
   129 }
   129 }
   130 
   130 
   131 DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_ERROR)(NetworkTCPSocketHandler *cs, NetworkErrorCode error)
   131 DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_ERROR)(NetworkTCPSocketHandler *cs, NetworkErrorCode error)
   132 {
   132 {
   133 	//
   133 	//
   139 
   139 
   140 	char str[100];
   140 	char str[100];
   141 	Packet *p = NetworkSend_Init(PACKET_SERVER_ERROR);
   141 	Packet *p = NetworkSend_Init(PACKET_SERVER_ERROR);
   142 
   142 
   143 	p->Send_uint8(error);
   143 	p->Send_uint8(error);
   144 	NetworkSend_Packet(p, cs);
   144 	cs->Send_Packet(p);
   145 
   145 
   146 	GetNetworkErrorMsg(str, error, lastof(str));
   146 	GetNetworkErrorMsg(str, error, lastof(str));
   147 
   147 
   148 	// Only send when the current client was in game
   148 	// Only send when the current client was in game
   149 	if (cs->status > STATUS_AUTH) {
   149 	if (cs->status > STATUS_AUTH) {
   171 	}
   171 	}
   172 
   172 
   173 	cs->has_quit = true;
   173 	cs->has_quit = true;
   174 
   174 
   175 	// Make sure the data get's there before we close the connection
   175 	// Make sure the data get's there before we close the connection
   176 	NetworkSend_Packets(cs);
   176 	cs->Send_Packets();
   177 
   177 
   178 	// The client made a mistake, so drop his connection now!
   178 	// The client made a mistake, so drop his connection now!
   179 	NetworkCloseClient(cs);
   179 	NetworkCloseClient(cs);
   180 }
   180 }
   181 
   181 
   200 	p->Send_uint8 (grf_count);
   200 	p->Send_uint8 (grf_count);
   201 	for (c = _grfconfig; c != NULL; c = c->next) {
   201 	for (c = _grfconfig; c != NULL; c = c->next) {
   202 		cs->Send_GRFIdentifier(p, c);
   202 		cs->Send_GRFIdentifier(p, c);
   203 	}
   203 	}
   204 
   204 
   205 	NetworkSend_Packet(p, cs);
   205 	cs->Send_Packet(p);
   206 }
   206 }
   207 
   207 
   208 DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_NEED_PASSWORD)(NetworkTCPSocketHandler *cs, NetworkPasswordType type)
   208 DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_NEED_PASSWORD)(NetworkTCPSocketHandler *cs, NetworkPasswordType type)
   209 {
   209 {
   210 	//
   210 	//
   214 	//    uint8:  Type of password
   214 	//    uint8:  Type of password
   215 	//
   215 	//
   216 
   216 
   217 	Packet *p = NetworkSend_Init(PACKET_SERVER_NEED_PASSWORD);
   217 	Packet *p = NetworkSend_Init(PACKET_SERVER_NEED_PASSWORD);
   218 	p->Send_uint8(type);
   218 	p->Send_uint8(type);
   219 	NetworkSend_Packet(p, cs);
   219 	cs->Send_Packet(p);
   220 }
   220 }
   221 
   221 
   222 DEF_SERVER_SEND_COMMAND(PACKET_SERVER_WELCOME)
   222 DEF_SERVER_SEND_COMMAND(PACKET_SERVER_WELCOME)
   223 {
   223 {
   224 	//
   224 	//
   237 	cs->status = STATUS_AUTH;
   237 	cs->status = STATUS_AUTH;
   238 	_network_game_info.clients_on++;
   238 	_network_game_info.clients_on++;
   239 
   239 
   240 	p = NetworkSend_Init(PACKET_SERVER_WELCOME);
   240 	p = NetworkSend_Init(PACKET_SERVER_WELCOME);
   241 	p->Send_uint16(cs->index);
   241 	p->Send_uint16(cs->index);
   242 	NetworkSend_Packet(p, cs);
   242 	cs->Send_Packet(p);
   243 
   243 
   244 		// Transmit info about all the active clients
   244 		// Transmit info about all the active clients
   245 	FOR_ALL_CLIENTS(new_cs) {
   245 	FOR_ALL_CLIENTS(new_cs) {
   246 		if (new_cs != cs && new_cs->status > STATUS_AUTH)
   246 		if (new_cs != cs && new_cs->status > STATUS_AUTH)
   247 			SEND_COMMAND(PACKET_SERVER_CLIENT_INFO)(cs, DEREF_CLIENT_INFO(new_cs));
   247 			SEND_COMMAND(PACKET_SERVER_CLIENT_INFO)(cs, DEREF_CLIENT_INFO(new_cs));
   268 		if (new_cs->status == STATUS_MAP_WAIT) waiting++;
   268 		if (new_cs->status == STATUS_MAP_WAIT) waiting++;
   269 	}
   269 	}
   270 
   270 
   271 	p = NetworkSend_Init(PACKET_SERVER_WAIT);
   271 	p = NetworkSend_Init(PACKET_SERVER_WAIT);
   272 	p->Send_uint8(waiting);
   272 	p->Send_uint8(waiting);
   273 	NetworkSend_Packet(p, cs);
   273 	cs->Send_Packet(p);
   274 }
   274 }
   275 
   275 
   276 // This sends the map to the client
   276 // This sends the map to the client
   277 DEF_SERVER_SEND_COMMAND(PACKET_SERVER_MAP)
   277 DEF_SERVER_SEND_COMMAND(PACKET_SERVER_MAP)
   278 {
   278 {
   317 		// Now send the _frame_counter and how many packets are coming
   317 		// Now send the _frame_counter and how many packets are coming
   318 		p = NetworkSend_Init(PACKET_SERVER_MAP);
   318 		p = NetworkSend_Init(PACKET_SERVER_MAP);
   319 		p->Send_uint8 (MAP_PACKET_START);
   319 		p->Send_uint8 (MAP_PACKET_START);
   320 		p->Send_uint32(_frame_counter);
   320 		p->Send_uint32(_frame_counter);
   321 		p->Send_uint32(ftell(file_pointer));
   321 		p->Send_uint32(ftell(file_pointer));
   322 		NetworkSend_Packet(p, cs);
   322 		cs->Send_Packet(p);
   323 
   323 
   324 		fseek(file_pointer, 0, SEEK_SET);
   324 		fseek(file_pointer, 0, SEEK_SET);
   325 
   325 
   326 		sent_packets = 4; // We start with trying 4 packets
   326 		sent_packets = 4; // We start with trying 4 packets
   327 
   327 
   340 			res = (int)fread(p->buffer + p->size, 1, SEND_MTU - p->size, file_pointer);
   340 			res = (int)fread(p->buffer + p->size, 1, SEND_MTU - p->size, file_pointer);
   341 
   341 
   342 			if (ferror(file_pointer)) error("Error reading temporary network savegame!");
   342 			if (ferror(file_pointer)) error("Error reading temporary network savegame!");
   343 
   343 
   344 			p->size += res;
   344 			p->size += res;
   345 			NetworkSend_Packet(p, cs);
   345 			cs->Send_Packet(p);
   346 			if (feof(file_pointer)) {
   346 			if (feof(file_pointer)) {
   347 				// Done reading!
   347 				// Done reading!
   348 				Packet *p = NetworkSend_Init(PACKET_SERVER_MAP);
   348 				Packet *p = NetworkSend_Init(PACKET_SERVER_MAP);
   349 				p->Send_uint8(MAP_PACKET_END);
   349 				p->Send_uint8(MAP_PACKET_END);
   350 				NetworkSend_Packet(p, cs);
   350 				cs->Send_Packet(p);
   351 
   351 
   352 				// Set the status to DONE_MAP, no we will wait for the client
   352 				// Set the status to DONE_MAP, no we will wait for the client
   353 				//  to send it is ready (maybe that happens like never ;))
   353 				//  to send it is ready (maybe that happens like never ;))
   354 				cs->status = STATUS_DONE_MAP;
   354 				cs->status = STATUS_DONE_MAP;
   355 				fclose(file_pointer);
   355 				fclose(file_pointer);
   379 				break;
   379 				break;
   380 			}
   380 			}
   381 		}
   381 		}
   382 
   382 
   383 		// Send all packets (forced) and check if we have send it all
   383 		// Send all packets (forced) and check if we have send it all
   384 		NetworkSend_Packets(cs);
   384 		cs->Send_Packets();
   385 		if (cs->packet_queue == NULL) {
   385 		if (cs->IsPacketQueueEmpty()) {
   386 			// All are sent, increase the sent_packets
   386 			// All are sent, increase the sent_packets
   387 			sent_packets *= 2;
   387 			sent_packets *= 2;
   388 		} else {
   388 		} else {
   389 			// Not everything is sent, decrease the sent_packets
   389 			// Not everything is sent, decrease the sent_packets
   390 			if (sent_packets > 1) sent_packets /= 2;
   390 			if (sent_packets > 1) sent_packets /= 2;
   405 
   405 
   406 	Packet *p = NetworkSend_Init(PACKET_SERVER_JOIN);
   406 	Packet *p = NetworkSend_Init(PACKET_SERVER_JOIN);
   407 
   407 
   408 	p->Send_uint16(client_index);
   408 	p->Send_uint16(client_index);
   409 
   409 
   410 	NetworkSend_Packet(p, cs);
   410 	cs->Send_Packet(p);
   411 }
   411 }
   412 
   412 
   413 
   413 
   414 DEF_SERVER_SEND_COMMAND(PACKET_SERVER_FRAME)
   414 DEF_SERVER_SEND_COMMAND(PACKET_SERVER_FRAME)
   415 {
   415 {
   431 	p->Send_uint32(_sync_seed_1);
   431 	p->Send_uint32(_sync_seed_1);
   432 #ifdef NETWORK_SEND_DOUBLE_SEED
   432 #ifdef NETWORK_SEND_DOUBLE_SEED
   433 	p->Send_uint32(_sync_seed_2);
   433 	p->Send_uint32(_sync_seed_2);
   434 #endif
   434 #endif
   435 #endif
   435 #endif
   436 	NetworkSend_Packet(p, cs);
   436 	cs->Send_Packet(p);
   437 }
   437 }
   438 
   438 
   439 DEF_SERVER_SEND_COMMAND(PACKET_SERVER_SYNC)
   439 DEF_SERVER_SEND_COMMAND(PACKET_SERVER_SYNC)
   440 {
   440 {
   441 	//
   441 	//
   453 	p->Send_uint32(_sync_seed_1);
   453 	p->Send_uint32(_sync_seed_1);
   454 
   454 
   455 #ifdef NETWORK_SEND_DOUBLE_SEED
   455 #ifdef NETWORK_SEND_DOUBLE_SEED
   456 	p->Send_uint32(_sync_seed_2);
   456 	p->Send_uint32(_sync_seed_2);
   457 #endif
   457 #endif
   458 	NetworkSend_Packet(p, cs);
   458 	cs->Send_Packet(p);
   459 }
   459 }
   460 
   460 
   461 DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_COMMAND)(NetworkTCPSocketHandler *cs, CommandPacket *cp)
   461 DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_COMMAND)(NetworkTCPSocketHandler *cs, CommandPacket *cp)
   462 {
   462 {
   463 	//
   463 	//
   483 	p->Send_uint32(cp->tile);
   483 	p->Send_uint32(cp->tile);
   484 	p->Send_string(cp->text);
   484 	p->Send_string(cp->text);
   485 	p->Send_uint8 (cp->callback);
   485 	p->Send_uint8 (cp->callback);
   486 	p->Send_uint32(cp->frame);
   486 	p->Send_uint32(cp->frame);
   487 
   487 
   488 	NetworkSend_Packet(p, cs);
   488 	cs->Send_Packet(p);
   489 }
   489 }
   490 
   490 
   491 DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_CHAT)(NetworkTCPSocketHandler *cs, NetworkAction action, uint16 client_index, bool self_send, const char *msg)
   491 DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_CHAT)(NetworkTCPSocketHandler *cs, NetworkAction action, uint16 client_index, bool self_send, const char *msg)
   492 {
   492 {
   493 	//
   493 	//
   504 	p->Send_uint8 (action);
   504 	p->Send_uint8 (action);
   505 	p->Send_uint16(client_index);
   505 	p->Send_uint16(client_index);
   506 	p->Send_uint8 (self_send);
   506 	p->Send_uint8 (self_send);
   507 	p->Send_string(msg);
   507 	p->Send_string(msg);
   508 
   508 
   509 	NetworkSend_Packet(p, cs);
   509 	cs->Send_Packet(p);
   510 }
   510 }
   511 
   511 
   512 DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_ERROR_QUIT)(NetworkTCPSocketHandler *cs, uint16 client_index, NetworkErrorCode errorno)
   512 DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_ERROR_QUIT)(NetworkTCPSocketHandler *cs, uint16 client_index, NetworkErrorCode errorno)
   513 {
   513 {
   514 	//
   514 	//
   523 	Packet *p = NetworkSend_Init(PACKET_SERVER_ERROR_QUIT);
   523 	Packet *p = NetworkSend_Init(PACKET_SERVER_ERROR_QUIT);
   524 
   524 
   525 	p->Send_uint16(client_index);
   525 	p->Send_uint16(client_index);
   526 	p->Send_uint8 (errorno);
   526 	p->Send_uint8 (errorno);
   527 
   527 
   528 	NetworkSend_Packet(p, cs);
   528 	cs->Send_Packet(p);
   529 }
   529 }
   530 
   530 
   531 DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_QUIT)(NetworkTCPSocketHandler *cs, uint16 client_index, const char *leavemsg)
   531 DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_QUIT)(NetworkTCPSocketHandler *cs, uint16 client_index, const char *leavemsg)
   532 {
   532 {
   533 	//
   533 	//
   542 	Packet *p = NetworkSend_Init(PACKET_SERVER_QUIT);
   542 	Packet *p = NetworkSend_Init(PACKET_SERVER_QUIT);
   543 
   543 
   544 	p->Send_uint16(client_index);
   544 	p->Send_uint16(client_index);
   545 	p->Send_string(leavemsg);
   545 	p->Send_string(leavemsg);
   546 
   546 
   547 	NetworkSend_Packet(p, cs);
   547 	cs->Send_Packet(p);
   548 }
   548 }
   549 
   549 
   550 DEF_SERVER_SEND_COMMAND(PACKET_SERVER_SHUTDOWN)
   550 DEF_SERVER_SEND_COMMAND(PACKET_SERVER_SHUTDOWN)
   551 {
   551 {
   552 	//
   552 	//
   555 	// Data:
   555 	// Data:
   556 	//     <none>
   556 	//     <none>
   557 	//
   557 	//
   558 
   558 
   559 	Packet *p = NetworkSend_Init(PACKET_SERVER_SHUTDOWN);
   559 	Packet *p = NetworkSend_Init(PACKET_SERVER_SHUTDOWN);
   560 	NetworkSend_Packet(p, cs);
   560 	cs->Send_Packet(p);
   561 }
   561 }
   562 
   562 
   563 DEF_SERVER_SEND_COMMAND(PACKET_SERVER_NEWGAME)
   563 DEF_SERVER_SEND_COMMAND(PACKET_SERVER_NEWGAME)
   564 {
   564 {
   565 	//
   565 	//
   568 	// Data:
   568 	// Data:
   569 	//     <none>
   569 	//     <none>
   570 	//
   570 	//
   571 
   571 
   572 	Packet *p = NetworkSend_Init(PACKET_SERVER_NEWGAME);
   572 	Packet *p = NetworkSend_Init(PACKET_SERVER_NEWGAME);
   573 	NetworkSend_Packet(p, cs);
   573 	cs->Send_Packet(p);
   574 }
   574 }
   575 
   575 
   576 DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_RCON)(NetworkTCPSocketHandler *cs, uint16 color, const char *command)
   576 DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_RCON)(NetworkTCPSocketHandler *cs, uint16 color, const char *command)
   577 {
   577 {
   578 	Packet *p = NetworkSend_Init(PACKET_SERVER_RCON);
   578 	Packet *p = NetworkSend_Init(PACKET_SERVER_RCON);
   579 
   579 
   580 	p->Send_uint16(color);
   580 	p->Send_uint16(color);
   581 	p->Send_string(command);
   581 	p->Send_string(command);
   582 	NetworkSend_Packet(p, cs);
   582 	cs->Send_Packet(p);
   583 }
   583 }
   584 
   584 
   585 // **********
   585 // **********
   586 // Receiving functions
   586 // Receiving functions
   587 //   DEF_SERVER_RECEIVE_COMMAND has parameter: NetworkTCPSocketHandler *cs, Packet *p
   587 //   DEF_SERVER_RECEIVE_COMMAND has parameter: NetworkTCPSocketHandler *cs, Packet *p
  1461 // Reads a packet from the stream
  1461 // Reads a packet from the stream
  1462 bool NetworkServer_ReadPackets(NetworkTCPSocketHandler *cs)
  1462 bool NetworkServer_ReadPackets(NetworkTCPSocketHandler *cs)
  1463 {
  1463 {
  1464 	Packet *p;
  1464 	Packet *p;
  1465 	NetworkRecvStatus res;
  1465 	NetworkRecvStatus res;
  1466 	while ((p = NetworkRecv_Packet(cs, &res)) != NULL) {
  1466 	while ((p = cs->Recv_Packet(&res)) != NULL) {
  1467 		byte type = p->Recv_uint8();
  1467 		byte type = p->Recv_uint8();
  1468 		if (type < PACKET_END && _network_server_packet[type] != NULL && !cs->has_quit) {
  1468 		if (type < PACKET_END && _network_server_packet[type] != NULL && !cs->has_quit) {
  1469 			_network_server_packet[type](cs, p);
  1469 			_network_server_packet[type](cs, p);
  1470 		} else {
  1470 		} else {
  1471 			DEBUG(net, 0, "[server] received invalid packet type %d", type);
  1471 			DEBUG(net, 0, "[server] received invalid packet type %d", type);