2015-06-02 2 views
1

Я делаю простую программу клиентского сервера для школьного проекта в Qt, но у меня возникли проблемы с обработкой нескольких новых подключений к серверу. Код у меня есть для новых подключений до сих пор является довольно простым:Лучший способ обработки нескольких сокетов в приложении Qt-сервера?

void LoginServer::newConnection() 
{ 
    logSock = server->nextPendingConnection(); 

    if(!logSock->waitForConnected(500)) 
    { 
     qDebug() << "Connection failed"; 
    }else 
    { 
     qDebug() << "It worked!"; 
     connect(logSock, SIGNAL(readyRead()),this, SLOT(readData())); 
    } 
} 

Один метода, который я видел на интернет толкал новые подключения к структуре данных, таким как вектор, и регулировать их из одного контейнера. Одна из проблем, с которой я столкнулась, заключается в том, что если я подключаю все разные сокеты к одному слоту для чтения данных, есть ли какой-нибудь изящный способ сказать, какой сокет отправил сигнал?

Другой способ, который я рассматривал, состоял в том, что когда был выпущен метод ReadRead(), я мог искать список сокетов, чтобы увидеть, у которого есть bytesAvailable, но это кажется слишком упрощенным решением для меня. Кроме того, если два сокета отправили данные одновременно, программа может определить неправильный сокет.

Еще один вариант, который я рассматривал, был переопределением readyRead(), чтобы включить ссылку на себя в сигнал, а затем я понял, что у меня нет первой идеи, как это сделать.

connect(logSock, SIGNAL(readyRead(QTcpSocket*)),this, SLOT(readData(QTcpSocket*))); 

Любые советы были бы весьма полезными.

ответ

1

Вы можете идентифицировать гнездо, которое испускаемый readyRead() сигнал, используя следующий код в слоте:

QTcpSocket* socket = qobject_cast< QTcpSocket* >(sender()); 

... и прочитать данные с помощью socket->readAll(). sender() возвращает указатель на QObject, который испускает сигнал.

+0

Это работает! Благодаря! –

Смежные вопросы