From 2c351a8bccdfe0fe9ad0ccb4dba5e15ef23b4c0c Mon Sep 17 00:00:00 2001 From: manuel Date: Wed, 13 Apr 2011 17:24:38 +0200 Subject: - rewrite network methods (ugly but good performance) - fix memleaks --- pacman-c++/server.cpp | 85 +++++++++++++++++++++++++++++---------------------- 1 file changed, 49 insertions(+), 36 deletions(-) (limited to 'pacman-c++/server.cpp') diff --git a/pacman-c++/server.cpp b/pacman-c++/server.cpp index 1c42174..b1877ad 100644 --- a/pacman-c++/server.cpp +++ b/pacman-c++/server.cpp @@ -14,7 +14,10 @@ Server::Server(QWidget *parent) waitForClientConnections(); qDebug() << "[Server] All Clients connected"; - updateMap(Util::createDemoMap()); + Transmission::map_t map = Util::createDemoMap(); + updateMap(map); + Util::deleteMap(map); + map = NULL; QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(tick())); @@ -24,11 +27,10 @@ Server::Server(QWidget *parent) void Server::tick() { qDebug() << "[Tick] Doing server update"; - Transmission::map_t map = calculateUpdates(); + Transmission::map_t map = calculateUpdates(); updateMap(map); - - QSharedPointer packet = createUpdatePacket(map); - sendUpdate(packet); + sendUpdate(map); + Util::deleteMap(map); } Transmission::map_t Server::calculateUpdates() @@ -145,26 +147,6 @@ invalid_direction: return map; } -QSharedPointer Server::createUpdatePacket(Transmission::map_t map) -{ - QSharedPointer updatePacket = - QSharedPointer(new ProtoBuf::MapUpdate); - - for (unsigned int x = 0; x < Constants::map_size.width; ++x) - { - for (unsigned int y = 0; y < Constants::map_size.height; ++y) - updatePacket->add_field(map[x][y]); - } - - for(unsigned i = 0; Color::order[i] != Color::none; ++i) - { - updatePacket->add_round_points(m_actors.value(Color::order[i])->getRoundPoints()); - updatePacket->add_game_points(m_actors.value(Color::order[i])->getGamePoints()); - } - - return updatePacket; -} - void Server::waitForClientConnections() { QTcpServer *tcpSrv = new QTcpServer(this); @@ -182,13 +164,15 @@ void Server::waitForClientConnections() #endif bool connectionAvailable = tcpSrv->waitForNewConnection(-1); Q_ASSERT(connectionAvailable); + Q_UNUSED(connectionAvailable); QTcpSocket *socket = tcpSrv->nextPendingConnection(); connect(socket, SIGNAL(readyRead()), this, SLOT(keyPressUpdate())); - // assign color + /* assign color */ Color::Color color = Color::order[i]; m_clientConnections[color] = socket; - // notify player of color + /* notify player of color */ + //TODO: allocate + reuse packet ProtoBuf::WhoAmI packet; packet.set_color(color); Util::sendPacket(packet, socket); @@ -197,12 +181,31 @@ void Server::waitForClientConnections() } } -void Server::sendUpdate(QSharedPointer< ProtoBuf::MapUpdate > packet) +void Server::sendUpdate(Transmission::map_t map) { - std::string dataStr = packet->SerializeAsString(); - const char *data = dataStr.c_str(); + ProtoBuf::MapUpdate packet; + + for (unsigned int x = 0; x < Constants::map_size.width; ++x) + { + for (unsigned int y = 0; y < Constants::map_size.height; ++y) + packet.add_field(map[x][y]); + } + + for(unsigned i = 0; Color::order[i] != Color::none; ++i) + { + packet.add_round_points(m_actors.value(Color::order[i])->getRoundPoints()); + packet.add_game_points(m_actors.value(Color::order[i])->getGamePoints()); + } + + QSharedPointer data = Util::createPacket(packet); foreach(QTcpSocket *socket, m_clientConnections) - Util::sendPacket(data, dataStr.length(), socket); + { + if (!Util::sendPacket(data.data(), socket)) + { + qDebug() << "[sendUpdate] Error while sending data to client, exiting..."; + qApp->quit(); + } + } } void Server::keyPressUpdate() @@ -213,13 +216,15 @@ void Server::keyPressUpdate() i.next(); Color::Color color = i.key(); QTcpSocket *socket = i.value(); - if (socket->bytesAvailable() > 0) + QDataStream in(i.value()); + while (socket->bytesAvailable() > (qint64)sizeof(qint64)) { - std::string dataStr; - Util::QByteArrayToStdString(socket->readAll(), dataStr); + QSharedPointer data = Util::receivePacket(socket); + //TODO: allocate + reuse packet ProtoBuf::KeyPressUpdate packet; - bool worked = packet.ParseFromString(dataStr); + bool worked = packet.ParseFromArray(data->data(), data->size()); Q_ASSERT(worked); + Q_UNUSED(worked); Transmission::field_t direction = packet.newkey(); qDebug() << "[KeyPress] actor=" << color << "direction=" << direction; m_actorMovements[color] = Util::transmissionMovementToActor(direction); @@ -231,6 +236,9 @@ bool Constants::server = true; int main(int argc, char ** argv) { + /* Verify that the version of the library that we linked against is + * compatible with the version of the headers we compiled against. + */ GOOGLE_PROTOBUF_VERIFY_VERSION; QApplication app(argc, argv, false); @@ -240,5 +248,10 @@ int main(int argc, char ** argv) qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime())); Server Server; - return app.exec(); + int ret = app.exec(); + + /* Delete all global objects allocated by libprotobuf */ + google::protobuf::ShutdownProtobufLibrary(); + + return ret; } -- cgit v1.2.3