src/Network/Server.cc
changeset 391 59c2499fe7bb
parent 387 294ce7ae8140
child 406 a2e35ca66c74
equal deleted inserted replaced
390:3c8078b96469 391:59c2499fe7bb
     4 #include "Config.hh"
     4 #include "Config.hh"
     5 #include "../Engine.hh"
     5 #include "../Engine.hh"
     6 #include "../Logger.hh"
     6 #include "../Logger.hh"
     7 
     7 
     8 #include <cassert>
     8 #include <cassert>
     9 #include <zlib.h>
       
    10 
     9 
    11 NetworkServer::NetworkServer (GameState &state, const NetworkEndpoint &listen_addr) : 
    10 NetworkServer::NetworkServer (GameState &state, const NetworkEndpoint &listen_addr) : 
    12     state(state), netsession(NETWORK_MAGIC_ID), controller(netsession, NETCHAN_CORE) {
    11     state(state), netsession(NETWORK_MAGIC_ID), controller(netsession, NETCHAN_CORE) {
    13     
    12     
    14     // connect slots
    13     // connect slots
   248         for (PixelDimension y = 0; y < map.y; y++) {
   247         for (PixelDimension y = 0; y < map.y; y++) {
   249             terrain_buf[x][y] = (uint8_t) terrain.terrain[x][y];
   248             terrain_buf[x][y] = (uint8_t) terrain.terrain[x][y];
   250         }
   249         }
   251     }
   250     }
   252 
   251 
   253     // compress the terrain buffer
       
   254     unsigned long deflate_size = compressBound(terrain_size);
       
   255     uint8_t deflate_buf[deflate_size];
       
   256 
       
   257     // and compress
       
   258     if (compress(deflate_buf, &deflate_size, (const uint8_t *) terrain_buf, terrain_size) != Z_OK)
       
   259        throw Error("compress failed"); 
       
   260     
       
   261     // allocate our packet...
   252     // allocate our packet...
   262     BigNetworkPacket pkt (
   253     BigNetworkPacket pkt (
   263         NETWORK_SESSION_HEADER_SIZE     // NetworkChannel header
   254         // NetworkChannel header
   264         + 3 * sizeof(uint32_t)          // our own header
   255         NETWORK_SESSION_HEADER_SIZE     
   265         + deflate_size                  // compressed terrain buffer
   256 
       
   257         // our own header
       
   258         + 2 * sizeof(uint32_t)          
       
   259 
       
   260         // compressed terrain buffer
       
   261         + NetworkPacketOutput::write_compressed_size(terrain_size)
   266     );
   262     );
   267     
   263     
   268     // write netsession header
   264     // write netsession header
   269     node->write_packet_header(pkt, NETCHAN_TERRAIN_ARRAY);
   265     node->write_packet_header(pkt, NETCHAN_TERRAIN_ARRAY);
   270 
   266 
   271     // write terrain dimensions
   267     // write terrain dimensions
   272     pkt.write_uint32(map.x);
   268     pkt.write_uint32(map.x);
   273     pkt.write_uint32(map.y);
   269     pkt.write_uint32(map.y);
   274 
   270 
   275     // write compressed data
   271     // write compressed terrain data
   276     pkt.write(deflate_buf, deflate_size);
   272     pkt.write_compressed(terrain_buf, terrain_size);
   277 
   273 
   278     // send
   274     // send
   279     node->send_raw(pkt, true);
   275     node->send_raw(pkt, true);
   280 }
   276 }
   281 
   277