Uploaded image for project: 'Qt'
  1. Qt
  2. QTBUG-53080

QLocalServer emits readyRead when bytes are not available in OSX 10.11

    XMLWordPrintable

Details

    • Bug
    • Resolution: Cannot Reproduce
    • P2: Important
    • None
    • 5.5.1
    • Network, Network: Sockets
    • None
    • macOS

    Description

      I have client which tries connection to server in loop:

      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;
      }
      

      When this code is running, I try to start QLocalServer in another application:

      ...
      
      // 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?
        }
      
        ...
      }
      
      

      Why when readyRead was called, bytes are not available?

      Attachments

        1. client.zip
          0.9 kB
        2. server.zip
          3 kB
        No reviews matched the request. Check your Options in the drop-down menu of this sections header.

        Activity

          People

            tpochep Timur Pocheptsov
            fhdns anton
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Gerrit Reviews

                There are no open Gerrit changes