Я использую QTcpServer, который должен прослушивать один порт.Язык c ++ с Qt 5.9.Приложение должно работать под Win и Linux, используя MingW.Метод listen из QTcpServer использует стандартный параметр для опций сокетов.Для Win10, Linux эти параметры по умолчанию установлены на одно использование порта прослушивания, поэтому прослушивание работает нормально.К сожалению, напротив, Win7 предлагает совместное использование, которое я должен избегать.Я понял, что класс QAbstractSocket позволяет мне создавать сокет с помощью BindFlag :: DontShareAddress.Я могу переслать дескриптор сокета в QTcpServer.Затем метод listen терпит неудачу (не слушает), заявляя: QTcpServer :: listen () вызывается, когда уже слушает.Я проверяю состояние портов с помощью netstat.Пример моего кода ниже:
bool TcpServer::init(QString ipAddress, quint16 port, Command::RoutingProperty clientSocketKind, QString interfaceName)
{
if (mServerIsInit == true) // only 1 server instance
{
return false;
mServer = new (std::nothrow) QTcpServer();
if (mServer == nullptr)
{
return false;
}
mClientSocketKind = clientSocketKind;
mInterfaceName = interfaceName;
// tries to set socket properties to a non sharing port
QTcpSocket tsocket;
if (!tsocket.bind(QHostAddress(ipAddress), port, QAbstractSocket::BindFlag::DontShareAddress))
{
qDebug() << "Socket bind fails";
}
else
{
qDebug() << "Socket bind success";
}
sd = tsocket.socketDescriptor(); // valid socket descriptor
if (!mServer->setSocketDescriptor(sd))
{
qDebug() << "SocketDescriptor fails";
}
sd = mServer->socketDescriptor();
qDebug() << "Socketdescriptor Server " << sd;
//end tries to set socket properties to a non sharing port
if (mServer->listen(QHostAddress(ipAddress), port)) // fails with message ... is always listening
// if (mServer->mServer->isListening()) // is not listening tells netstat
{
qDebug() << "Server status for listening ok: " << mServer->isListening();
qDebug() << "Server listen on " << mServer->serverAddress() << ":" << mServer->serverPort();
connect(mServer, SIGNAL(newConnection()), this, SLOT(newConnection()));
connect(mServer, SIGNAL(acceptError(QAbstractSocket::SocketError)), this, SLOT(socketErr(QAbstractSocket::SocketError)));
mServerIsInit = true;
return true;
}
else
{
qDebug() << "Server status for listening fail" << mServer->isListening();
delete mServer;
mServer = nullptr;
return false;
}
}
Спасибо за любую идею, как установить параметры сокета для эксклюзивного использования порта прослушивания.
Martin