2013-08-22 5 views
0

글쎄, 여전히 QLocalSocket을 통해 IPC를 실행하려고합니다. 은 분명히 내 소켓 연결이 허용됩니다, 연결,하지만 난 뭔가 내가 응답을 얻을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 그들은 ....

[편집] auto conn = connection(...)

가 제대로 연결되었는지 확인하기 위해 디버깅했다 ... 난 지금 읽을 준비가되어 있음을 의미한다고 생각 클라이언트의 write 기능 직후 해고 do

+0

'if (clientConnection-> bytesAvailable() <(int) sizeof (quint16))''이 체크는 비명 성으로 보입니다. 그것을 제거하고, 무슨 일이 일어나는 지보십시오. –

+0

적어도 하나의 바이트가 읽을 수 있는지 확인합니다. 디버깅을 위해 제거했지만 아무것도 변경되지 않습니다. 여전히 읽을 게 없다. –

+0

클라이언트가 연결 신호를 받고 즉시 서버에 데이터를 보내는 것 같습니다. 클라이언트 - 서버 코드를 작성할 때마다 항상 클라이언트를 연결 한 다음 연결시 서버가 'ok'데이터 패킷을 보냅니다. 클라이언트가 'ok'를 받으면 서버에 요청을 진행합니다. 나는 데이터를 보내는 클라이언트가 서버의 readyRead()에 의해 놓친 원인인지 궁금하다. – TheDarkKnight

답변

0

참고 : 실제로 waitForConnected()의 반환 값을 확인해야합니다. 클라이언트가 서버에 연결을 관리하지 않으면 더 이상 진행할 필요가 없습니다.

하지만 실제 문제는 "hallo welt \ 0"과 같은 간단한 8 비트 문자열을 작성하지만 QString의 QString (QString의 경우 유니 코드를 의미 함)을 읽고 있다는 것입니다. 길이 우선), 이것은 일치하지 않습니다.

관련 문제