Я создал программу приветствия, чтобы понять, как работают QTcpServer и QTcpSocket. В нем QTcpServer принимает новые соединения и соединяет их сигнал readyRead()
со слотом MainWindow::onNewData()
, где их новые данные добавляются к текстовому элементу управления.
Проблема в том, что несколько сокетов могут быть открыты одновременно. Итак, когда я получаю сигнал readyRead()
и хочу прочитать данные с помощью readAll()
, как мне узнать, какой сокет его испустил?
Вот соответствующие части кода. Я вообще не храню здесь указатели QTcpSocket, но даже если бы и хранил, то все равно не знал бы, какой из них излучает сигнал.
// constructor
server = new QTcpServer(this);
connect(server, SIGNAL(newConnection()), this, SLOT(onNewConnection()));
server->listen(QHostAddress::LocalHost, 3333);
void MainWindow::onNewConnection()
{
QTcpSocket* socket = server->nextPendingConnection();
connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
connect(socket, SIGNAL(readyRead()), this, SLOT(onNewData()));
}
void MainWindow::onNewData()
{
ui->plainTextEdit->appendPlainText(WHICH_SOCKET_EMITTED_IT()->readAll());
}