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