2016-07-08 30 views
0

私はUeTcpServerという名前のQTcpServerサブクラスであるいくつかのサーバーアプリケーションで作業しています。サーバーアプリケーションは正常に起動し、私はQTcpServer :: hadPendingConnections()は、新しい接続時にfalseを返します

connect(this->ueTcpServer(), 
     SIGNAL(newConnection()), 
     this, 
     SLOT(ueSlotTcpServerNewConnection())); 

介しUeTcpServernewConnectionSignalに接続した後Linux terminalを使用して、サーバアプリケーションに接続されているueSlotTcpServerNewConnection()にブレークポイントを配置すると、ブレークポイントは、ueSlotTcpServerNewConnection()スロット内部活性化:

void UeMainWindow::ueSlotTcpServerNewConnection() 
{ 
    if(this->ueTcpServer()->hasPendingConnections()) 
    { 
     QTcpSocket* incomingSocket=this->ueTcpServer()->nextPendingConnection(); 

     this->ueSlotAddEventInfoLog(0, 
            tr("New incoming connection from host") 
            .append(" ") 
            //.append(this->ueTcpServer()->nextPendingConnection()->peerAddress().toString()) 
            .append(incomingSocket->peerName()) 
            .append(" ") 
            .append(tr("with IP address")) 
            .append(" ") 
            .append(incomingSocket->peerAddress().toString()) 
            .append(" ") 
            .append(tr("using port")) 
            .append(" ") 
            //.append(this->ueTcpServer()->nextPendingConnection()->peerPort())); 
            .append(QString::number(incomingSocket->peerPort()))); 
    } // if 
} // ueSlotTcpServerNewConnection 

ただし、this->ueTcpServer()->hasPendingConnection()falseを返します。どうして?

+1

「QTcpSocket * conn = server-> nextPendingConnection()){」を使用する傾向があり、問題は一度もありませんでした。だから私の質問は... 'hasPendingConnections'がfalseを返すとき' nextPendingConnection'はNULL/nullptrを返しますか?それとも実際に有効な接続を返しますか? –

+0

@ G.M。 'if(this-> ueTcpServer() - > hasPendingConnections())'を削除/コメントすると、 'QTcpSocket'への' NULL'ポインタを取得します。 – KernelPanic

+1

アプリケーションのQTcpServerのサブクラスでincomingConnectionを再実装しましたか?もしそうなら、おそらくあなたはaddPendingConnectionを呼び出すことを忘れています。 –

答えて

0

私もdocsに記載されているようincomingConnection(qintptr socketDescriptor)からaddPendingConnection(QTcpSocket *socketに電話をするのを忘れたました:

void UeTcpServer::incomingConnection(qintptr socketDescriptor) 
{ 
    QTcpSocket* newSocket=new QTcpSocket(this); 

    newSocket->setSocketDescriptor(socketDescriptor); 

    this->addPendingConnection(newSocket); 
} // incomingConnection 

、それが機能するようになりました。

+2

これはあなたがしたいことがあれば 'incomingConnection'をオーバーライドする必要はありません。これはまさに[基本実装](https://code.qt.io/cgit/qt/qtbase.git/tree /src/network/socket/qtcpserver.cpp#n579)があります。 – Mike

+1

functionパラメータを使用すると、なぜ 'Q_UNUSED'ですか? – peppe

+0

@peppe間違い! – KernelPanic

関連する問題