/
champion14
/
tcp_auction_server
Обзор
Документация
Войти
/
champion14
/
tcp_auction_server
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
server.cpp
95 строк
3 KB
Mikhail Sadovnikov
First commit - Dockerized Auction Server
15 июн 2026, 11:21
15 июн 2026, 11:21
e31d55b
Код
Авторство
О чём код?
#include "server.h" #include <QDebug> AuctionServer::AuctionServer(QObject *parent) : QTcpServer(parent) {} void AuctionServer::startServer() { if (this->listen(QHostAddress::Any, 9000)) { qDebug() << "Server started on port 9000..."; } else { qDebug() << "Server error!"; } } void AuctionServer::incomingConnection(qintptr socketDescriptor) { QTcpSocket *socket = new QTcpSocket; socket->setSocketDescriptor(socketDescriptor); if (clients.size() >= MAX_CLIENTS) { socket->write("Сервер занят. Подключитесь позднее.\n"); socket->flush(); socket->disconnectFromHost(); socket->deleteLater(); return; } connect(socket, &QTcpSocket::readyRead, this, &AuctionServer::slotReadyRead); connect(socket, &QTcpSocket::disconnected, this, &AuctionServer::slotClientDisconnected); clients.push_back(socket); socket->write("Добро пожаловать на аукцион! Введите вашу ставку (число):\n"); broadcastClientCount(); } void AuctionServer::slotReadyRead() { QTcpSocket *socket = (QTcpSocket*)sender(); QByteArray data = socket->readAll(); QString msg = QString::fromUtf8(data).trimmed(); if (auctionEnded) { if (msg.toLower() == "нет" || msg.toLower() == "no") { socket->write("До свидания!\n"); socket->flush(); socket->disconnectFromHost(); } else if (msg.toLower() == "да" || msg.toLower() == "yes") { socket->write("Ожидайте нового раунда...\n"); } return; } bool isNumeric; int bid = msg.toInt(&isNumeric); if (isNumeric) { bids[socket] = bid; socket->write("Ставка принята!\n"); if (bids.size() == clients.size() && clients.size() > 1) { checkWinner(); } } else { socket->write("Введите корректное число!\n"); } } void AuctionServer::checkWinner() { int maxBid = -1; for (auto it = bids.begin(); it != bids.end(); ++it) { if (it.value() > maxBid) { maxBid = it.value(); } } QString resultMsg = QString("\n[АУКЦИОН ЗАВЕРШЕН] Победила максимальная ставка: %1\nБудете участвовать еще? (да/нет)\n").arg(maxBid); broadcastMessage(resultMsg.toUtf8()); auctionEnded = true; bids.clear(); } void AuctionServer::broadcastClientCount() { QString msg = QString("Текущее количество подключенных клиентов: %1/6\n").arg(clients.size()); broadcastMessage(msg.toUtf8()); } void AuctionServer::broadcastMessage(const QByteArray &message) { for (QTcpSocket *client : clients) { client->write(message); } } void AuctionServer::slotClientDisconnected() { QTcpSocket *socket = (QTcpSocket*)sender(); clients.removeOne(socket); bids.remove(socket); socket->deleteLater(); if (!clients.isEmpty() && !auctionEnded) { broadcastClientCount(); } }