2013-08-22 2 views
0

ну, я все еще пытаюсь получить IPC, проходящий через QLocalSocket. Очевидно, что моя розетка соединяет, соединение получает принято, но когда я пытаюсь отправить что-тоQLocalSocket ничего не посылает

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(...) был для отладки, чтобы проверить, если они подключены правильно .... они do

+0

'if (clientConnection-> bytesAvailable() <(int) sizeof (quint16)) {' эта проверка выглядит подозрительной. Попробуйте удалить его и посмотреть, что произойдет. –

+0

это просто проверяет, доступен ли хотя бы один байт. я удалил его для отладки, но это ничего не меняет; все еще ничего не читать –

+0

Кажется, что клиент получает сигнал подключения, а затем сразу же отправляет данные на сервер. Всякий раз, когда я пишу код клиент-сервер, я всегда подключаюсь к клиенту, а затем по соединению сервер отправляет пакет данных «ok». Когда клиент получает «ok», он затем отправляет запросы на сервер. Интересно, сначала ли ваш клиент отправляет данные, чтобы он был упущен с помощью команды readyRead(). – TheDarkKnight

ответ

0

Примечание: вы должны действительно проверить возвращаемое значение waitForConnected(). Нет смысла идти дальше, если клиенту не удается подключиться к серверу.

Но я думаю, что ваша фактическая проблема заключается в том, что вы пишете простую 8-битную строку, такую ​​как «hallo welt \ 0», но вы читаете с QDataStream, который ожидает двоичный формат (для QString, что означает unicode, и сначала длина), это не соответствует.

Смежные вопросы