2015-10-18 5 views
0

Я подключаюсь через QTcpSocket к QTcpServer. Я могу указать порт прослушивания на стороне сервера, но клиент выбирает случайный порт для своего соединения. Я попытался использовать метод QAbstractSocket::bind, но это не имело значения.Привязать QTcpSocket к определенному порту

Вот мой код:

void ConnectionHandler::connectToServer() { 
    this->socket->bind(QHostAddress::LocalHost, 2001); 
    this->socket->connectToHost(this->ip, this->port); 

    if (!this->socket->waitForConnected()) { 
      this->socket->close(); 
      this->errorMsg = this->socket->errorString(); 
     } 

    qDebug() << this->socket->localPort(); 
} 

Кто-нибудь знает, что я не хватает?

ответ

2

Я переформулировать свой код в MCVE:

#include <QDebug> 
#include <QHostAddress> 
#include <QTcpSocket> 

#include <memory> 

int main() 
{ 
    std::unique_ptr<QTcpSocket> socket(new QTcpSocket); 

    socket->bind(QHostAddress::LocalHost, 2001); 
    qDebug() << socket->localPort(); // prints 2001 

    socket->connectToHost(QHostAddress::LocalHost, 25); 
    qDebug() << socket->localPort(); // prints 0 
} 

Почему connectToHost сброса локального порта 0?

Это, кажется, ошибка в Qt. В версии 5.2.1, QAbstractSocket::connectToHost содержит

d->state = UnconnectedState; 
/* ... */ 
d->localPort = 0; 
d->peerPort = 0; 

В версии 5.5 это изменилось в

if (d->state != BoundState) { 
    d->state = UnconnectedState; 
    d->localPort = 0; 
    d->localAddress.clear(); 
} 

Так что, скорее всего, что обновление Qt будет решить проблему.