equal
deleted
inserted
replaced
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); |