void server::incomingConnection(qintptr socketDescriptor) {
qDebug() << "incoming connection";
connection* new_connection = new connection(this);
new_connection->set_socket_descriptor(socketDescriptor);
connect(new_connection, SIGNAL(ready_read()), this, SLOT(ready_read()));
connect(new_connection, SIGNAL(disconnected()), this, SLOT(disconnected()));
emit signal_new_connection(new_connection);
}
класс сервера наследуется от QTcpServer, а класс соединения
имеет QTcpSocket в качестве члена и некоторую информацию о пользователе, который хочет
подключиться (имя, ip, id …)
Моя проблема в том, что я ничего не знаю о new_connection. Мне нужно знать, кто соединяется с сервером. по этой причине я хочу подключиться обратно, но как? там в любом случае? или нужно подождать, пока я получу данные (приветственное сообщение) из подключенного сокета (пользователя)?
Я просто случайно наткнулся на эту старую ветку с той же проблемой. И я только что нашел решение, поэтому я решил опубликовать здесь на случай, если у кого-то есть аналогичная проблема.
Чтобы получить актуальный QTcpSocket
(тот, который излучал readyRead()
сигнал), вы можете использовать QObject::sender()
метод, например:
void NetServer::onNewConnection() {
QObject::connect(clientSocket, SIGNAL(readyRead()), this, SLOT(onData()));
}
// ...
void NetServer::onData() {
QTcpSocket *client = this->server->nextPendingConnection();
qDebug() << "Received data from" << sender();
// or
qDebug() << "Received data from" << this->sender();
// or even
qDebug() << "Received data from" << QObject::sender();
}
Других решений пока нет …