2016-04-29 11 views
0

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?

+0

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

+0

ja, du hast Recht. Schreibe als Antwort. – fhdnsYa

Antwort

1

Sie könnten mehrere Verbindungen erhalten. In diesem Fall könnte die socket-Variable auf ein anderes Objekt verweisen als das, das das Signal readyRead ausgibt. Verwenden Sie entweder QObject::sender, um das richtige Objekt im Steckplatz zu erhalten, oder verwenden Sie QSignalMapper. Wenn Sie Qt5 verwenden, können Sie auch eine Lambda-Funktion verwenden und das Objekt socket erfassen.

Verwandte Themen