Ich versuche QLocalServer in meinem lokalen OSX 10.11 zu starten.QLocalServer sendet readyRead, wenn keine Bytes verfügbar sind
Ich habe Klienten, die Verbindung zum Server in Schleife versucht:
int connect(const char* filename) {
int sock;
struct sockaddr_un serv_addr;
memset(&serv_addr, 0x00, sizeof(serv_addr));
serv_addr.sun_family = AF_LOCAL;
strncpy(serv_addr.sun_path, filename, sizeof(serv_addr.sun_path) - 1);
if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
return sock;
}
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1) {
close(sock);
sock = -1;
return sock;
}
return sock;
}
int main() {
int sock;
while((sock = connect("my_socket_server")) == -1) {
usleep(3000);
}
// The code never reaches this line
const char* buffer = "hello";
if (send(sock, buffer, strlen(buffer), 0) < 0) {
exit(1);
}
return 0;
}
Wenn dieser Code ausgeführt wird, versuche ich QLocalServer in einer anderen Anwendung zu starten:
// Starting server:
QString socket_path = "my_socket_server";
QLocalServer::removeServer(socket_path);
if (!server.listen(socket_path)) {
return false;
}
connect(&server, &QLocalServer::newConnection, this, &MyServerClass::newConnection);
...
void MyServerClass::newConnection() {
socket = server.nextPendingConnection(); // socket - member of MyServerClass
connect(socket, &QLocalSocket::disconnected, socket, &QLocalSocket::deleteLater);
connect(socket, &QLocalSocket::readyRead, this, &MyServerClass::readyRead);
}
...
void MyServerClass::readyRead() {
if (!socket->bytesAvailable()) {
exit(1); // THIS CODE WAS CALLED. WHY?
}
...
}
Warum wenn readyread genannt wurde, Bytes sind nicht verfügbar?
Haben Sie überprüft, dass Sie nicht mehrere Verbindungen erhalten? Wenn Sie das tun, kann die Variable 'socket' auf ein anderes Objekt verweisen als das, das' readyRead' ausgibt. – thuga
ja, du hast Recht. Schreibe als Antwort. – fhdnsYa