QTcpServer::incomingConnection(qintptr socketDescriptor) возможно ли подключиться к указанному сокету?

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, идентификатор...)

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


person Mher Didaryan    schedule 30.01.2014    source источник
comment
Что означает кто подключается к серверу? Я думаю, что вам не хватает информации в вопросе.   -  person peppe    schedule 31.01.2014
comment
я имею в виду, мне нужно временное соединение, которое будет инициализировано после функции incomingConnection, или я могу инициализировать new_connection в функции incomingConnection? (Извините за мой английский)   -  person Mher Didaryan    schedule 31.01.2014
comment
Вы можете, конечно. Но почему бы вам просто не использовать nextPendingConnection(), чтобы получить хорошо подключенный QTcpSocket?   -  person peppe    schedule 31.01.2014
comment
есть принципиальная разница между ними?   -  person Mher Didaryan    schedule 31.01.2014


Ответы (1)


Я просто случайно наткнулся на эту старую тему с той же проблемой. И я только что нашел решение, поэтому решил опубликовать здесь, если у кого-то есть похожая проблема.

Чтобы получить фактический 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();
}
person Andrew Dunai    schedule 12.12.2014