示例#1
0
void TcpServer::check_for_messages() {

  fd_set tmp_set;
  std::map<int, ConnectionToClient*>::iterator it;
  int len_read;
  ConnectionToClient* client;

  uint32_t buf;

  memcpy(&tmp_set, &m_client_set, sizeof(fd_set));
  safe_select(m_highest_socket+1, &tmp_set);

  for (it = m_clients.begin(); it != m_clients.end(); ++it) {

    client = it->second;
    if (FD_ISSET(client->sock_fd, &tmp_set)) {
      len_read = recv(client->sock_fd, (void*)&buf, sizeof(buf), MSG_PEEK);

      if (len_read > 0) {
        handleMessageFromClient(client);
      } else if (len_read == 0) {
        printf("TcpServer: length 0 message received from a client.");
        clientDisconnected(client);
        FD_CLR(client->sock_fd, &m_client_set);
        m_clients.erase(it);
      } else {
        perror("TcpServer read message");
      }
    }
  }
}
示例#2
0
void TcpServer::check_for_clients() {

  fd_set tmp_set;

  // Check if the Server has any new clients
  memcpy(&tmp_set, &m_server_set, sizeof(fd_set));
  safe_select(m_highest_socket+1, &tmp_set);

  if (FD_ISSET(m_socket_number, &tmp_set)) {
    // add a client
    ConnectionToClient* client = new ConnectionToClient();
    client->socket_len = sizeof(struct sockaddr_in);

    client->sock_fd = accept(m_socket_number, (sockaddr*)&client->addr, &client->socket_len);
    client->pending = 1;

    if (client->sock_fd < 0) {
      perror("accept");
      return;
    }

    if (client->sock_fd > m_highest_socket) {
      m_highest_socket = client->sock_fd;
    }

    printf("TcpServer: a client joined and was assigned fd: %d\n", client->sock_fd);
    m_clients[client->sock_fd] = client;
    FD_SET(client->sock_fd, &m_client_set);
    clientConnected(client);
  }
}
bool VirtualSerialDevice::waitForBytesWritten(int msecs)
{
    QMutexLocker locker(&lock);
    if (pendingWrites.count() == 0) return false;

    if (QThread::currentThread() != thread()) {
        // Wait for signal from main thread
        unsigned long timeout = msecs;
        if (msecs == -1) timeout = ULONG_MAX;
        if (waiterForBytesWritten == NULL)
            waiterForBytesWritten = new QWaitCondition;
        return waiterForBytesWritten->wait(&lock, timeout);
    }

    d->writeUnblockedNotifier->setEnabled(false);
    forever {
        fd_set writeSet;
        FD_ZERO(&writeSet);
        FD_SET(d->portHandle, &writeSet);

        struct timeval timeout;
        if (msecs != -1) {
            timeout.tv_sec = msecs / 1000;
            timeout.tv_usec = (msecs % 1000) * 1000;
        }
        int ret = safe_select(d->portHandle+1, NULL, &writeSet, NULL, msecs == -1 ? NULL : &timeout);

        if (ret == 0) {
            // Timeout
            return false;
        } else if (ret < 0) {
            setErrorString(tr("The function select() returned an error on port %1: %2 (POSIX error %3)").
                           arg(portName, QString::fromLocal8Bit(strerror(errno))).arg(errno));
            return false;
        } else {
            bool needToWait = tryFlushPendingBuffers(locker, StopAfterWritingOneBuffer);
            if (needToWait) {
                // go round the select again
            } else {
                return true;
            }
        }
    }
}