Форум   Статьи   Новости   Файлы   Bugtraq   Сниффер   Друзья   О Клубе
  , 05:39   #1
Jedi Knight
 
Аватар для vladyxa13
 
Локация: Планета Земля
Регистрация: 03.04.2013
Сообщений: 1,120

Репутация: 227 / 4
По умолчанию Простой сервер на Qt/C++

Простой сервер на Qt/C++

В этой статье мы рассмотрим:
  • Создание tcp сервера.
  • Подключение нескольких клиентов к серверу параллельно.
  • Отключение клиентов (отключение сокетов).
  • Получение и отправку данных.

QTcpServer или слушаем нужный порт

В переменной server_status — храню статус QTcpServer, чтоб не происходило эксцессов при работе сервера (если 0 — то сервер не слушает порт, 1 — слушает).
Сигналы в данном случае решают лишний раз проблему с прослушиванием порта, т.е. слот newuser() в данный момент вызывается только тогда, когда появляется новое подключение к серверу.

C++ highlight
tcpServer = new QTcpServer(this);
    connect(tcpServer, SIGNAL(newConnection()), this, SLOT(newuser()));
    if (!tcpServer->listen(QHostAddress::Any, 33333) && server_status==0) {
        qDebug() <<  QObject::tr("Unable to start the server: %1.").arg(tcpServer->errorString());
    } else {
        server_status=1;
        qDebug() << QString::fromUtf8("Сервер запущен!");
    }
Подключение нескольких клиентов к серверу параллельно

Код ниже демонстрирует, как создать новый сокет и заставить его слушать сигналы. Так же в нем получаем дескриптор сокета, который используем в качестве ключа для хранения объекта сокета, который пригодится нам при дальнейшей работе.

C++ highlight
if(server_status==1){
        qDebug() << QString::fromUtf8("У нас новое соединение!");
        QTcpSocket* clientSocket=tcpServer->nextPendingConnection();
        int idusersocs=clientSocket->socketDescriptor();
        SClients[idusersocs]=clientSocket;
        connect(SClients[idusersocs],SIGNAL(readyRead()),this, SLOT(slotReadClient()));
    }
QMap<int,QTcpSocket *> SClients; Данная карта хранит объекты созданных сокетов. Ее использую например если принудительно останавливаю сервер и мне необходимо закрыть открытые сокеты. Если их не закрыть, то клиент будет еще долго ждать ответ от нашего сервера и не закрывать соединение. Ниже выложен вариант принудительного закрытия всех сокетов.

C++ highlight
if(server_status==1){
        foreach(int i,SClients.keys()){
            QTextStream os(SClients[i]);
            os.setAutoDetectUnicode(true);
            os << QDateTime::currentDateTime().toString() << "\n";
            SClients[i]->close();
            SClients.remove(i);
        }
        tcpServer->close();
        qDebug() << QString::fromUtf8("Сервер остановлен!");
        server_status=0;
    }
При создании нового сокета Вы уже наверно заметили сигнал readyRead(), он выполняется когда клиент передает какие-то данные на наш сервер, в этот момент мы и будем давать ответ нашему клиенту, предварительно получив данные.

C++ highlight
 // Получаем объект сокета, который вызвал данный слот
    QTcpSocket* clientSocket = (QTcpSocket*)sender();
    // Получаем дескриптор, для того, чтоб в случае закрытия сокета удалить его из карты
    int idusersocs=clientSocket->socketDescriptor();
    // Пример отправки ответа клиенту
    QTextStream os(clientSocket);
    os.setAutoDetectUnicode(true);
    os << "HTTP/1.0 200 Ok\r\n"
          "Content-Type: text/html; charset=\"utf-8\"\r\n"
          "\r\n"
          "<h1>Nothing to see here</h1>\n"
          << QDateTime::currentDateTime().toString() << "\n";
    // Полученные данные от клиента выведем в qDebug, 
    // можно разобрать данные например от GET запроса и по условию выдавать необходимый ответ. 
    qDebug() << clientSocket->readAll()+"\n\r");
    // Если нужно закрыть сокет
    clientSocket->close();
    // Удалим объект сокета из карты
    SClients.remove(idusersocs);
Таким образом мы получаем сервер (например HTTP), который слушает порт 33333, сможет обрабатывать сразу несколько запросов одновременно и отдавать нужный результат.

Источник http://habrahabr.ru
__________________

Профессия тыже программист очень популярная!
Почини колонку, тыже программист. Достань кота с дерева тыже программист! ...

Никогда ее не забуду http://www.youtube.com/watch?v=OH15GOMvYUs [►], на ней вырос...
Пользователь вне форума    
Наши Спонсоры
 

Метки
qt с++, с++

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pаздача от Kontika Kontik Раздачи 248 19.09.2015 17:47
Простой FTP сервер Kontik Delphi 0 12.12.2011 20:41
Создаем свой CS 1.6 сервер =) WenoM Gaming Zone 77 02.12.2010 00:01
Пишем HTTP Сервер на VB6 Nobody4all Basic 1 16.01.2010 15:34
Приёмы взлома и виды хакерских атак Ping0 Новичкам 0 26.03.2009 18:57



Часовой пояс GMT +2
Powered by vBulletin® 3.x.x Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.

Copyright © 2008 - 2013 «HPC» Реклама на сайте Правила Форума Пользовательское соглашение Работа на сайте
При копировании материалов ставьте ссылку на источник
Все материалы представлены только в ознакомительных целях, администрация за их использование ответственности не несет.