0

まあ、私はまだ QLocalSocket を介して実行されている IPC を取得しようとしています。明らかにソケットが接続され、接続が受け入れられますが、何かを送信しようとすると

void ServiceConnector::send_MessageToServer(QString message) {

    if(!connected){
        m_socket->connectToServer(m_serverName);
        m_socket->waitForConnected();

    }

    char str[] = {"hallo welt\0"};
    int c = m_socket->write(str,strlen(str));
    qDebug() << "written: " << c;
}

応答がありません...サーバーのソケットは何もしません。

サーバーの読み取り実装:

void ClientHandler::socket_new_connection() {

    logToFile("incoming connection");

    clientConnection = m_server->nextPendingConnection();

    socket_StateChanged(clientConnection->state());

    auto conn = connect(clientConnection, SIGNAL(disconnected()),this, SLOT(socket_disconnected()));
    conn = connect(clientConnection, SIGNAL(stateChanged(QLocalSocket::LocalSocketState)),this,SLOT(socket_StateChanged(QLocalSocket::LocalSocketState)));
    conn = connect(clientConnection, SIGNAL(readyRead()), this, SLOT(socket_readReady()));

    clientConnection->waitForReadyRead();
    socket_readReady();
}
void ClientHandler::socket_readReady(){
    logToFile("socket is ready to be read");

    logToFile((clientConnection->isOpen())? "open: true":"open: false");
    logToFile((clientConnection->isReadable())? "readable: true":"readable: false");

    QDataStream in(clientConnection);
    in.setVersion(QDataStream::Qt_4_0);
    if (clientConnection->bytesAvailable() < (int)sizeof(quint16)) {
        return;
    }

    QString message;
    in >> message;

    logToFile("Message recieved" + message);

    send(message);
    emit messageReceived(message);
}

出力:

クライアント:

[Debug]: ConnectingState 
[Debug]: ConnectedState 
[Debug]: socket_connected 
[Debug]: written:  10 

サーバ:

[Debug]: incoming connection
[Debug]: socket is ready to be read
[Debug]: open: true
[Debug]: readable: true

ソケットの readReady() シグナルは発行されないので、使用することにしました

clientConnection->waitForReadyRead();
socket_readReady();

...しかし、明らかにそれも機能しません。クライアントの関数のwaitForReadyRead直後に起動されます。これは、読み取る準備ができていることを意味すると思います...write

[編集] はauto conn = connection(...)デバッグ用で、正しく接続されているかどうかを確認するためのものでした....そうです

4

1 に答える 1

0

注: waitForConnected() の戻り値を実際に確認する必要があります。クライアントがサーバーに接続できなければ、先に進む意味はありません。

しかし、あなたの実際の問題は、「ハローウェルト\ 0」のような単純な8ビット文字列を書いているが、バイナリ形式を期待するQDataStreamで読んでいることだと思います(QStringの場合、ユニコードを意味し、最初に長さ)、これは一致しません。

于 2016-01-23T22:14:50.783 に答える