ну, я все еще пытаюсь получить 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
'if (clientConnection-> bytesAvailable() <(int) sizeof (quint16)) {' эта проверка выглядит подозрительной. Попробуйте удалить его и посмотреть, что произойдет. –
это просто проверяет, доступен ли хотя бы один байт. я удалил его для отладки, но это ничего не меняет; все еще ничего не читать –
Кажется, что клиент получает сигнал подключения, а затем сразу же отправляет данные на сервер. Всякий раз, когда я пишу код клиент-сервер, я всегда подключаюсь к клиенту, а затем по соединению сервер отправляет пакет данных «ok». Когда клиент получает «ok», он затем отправляет запросы на сервер. Интересно, сначала ли ваш клиент отправляет данные, чтобы он был упущен с помощью команды readyRead(). – TheDarkKnight