struct sockaddr_in cli_addr; int clilen = sizeof(cli_addr); fd_set socket; struct timeval tv; tv.tv_sec = obj->timeout; tv.tv_usec = 0; FD_ZERO(&socket); FD_SET(obj->cb_socket, &socket); while (obj->nbmsg_to_wait > 0) { char read_buffer[BUFSIZE]; std::string buffer=""; if (select(obj->cb_socket + 1, &socket, NULL, NULL, &tv) == -1) { perror("ERROR @select:"); abort(); } if (FD_ISSET(obj->cb_socket, &socket)) { int newsockfd = accept(obj->cb_socket, (struct sockaddr *) &cli_addr, (socklen_t *) & clilen); if (newsockfd < 0) { perror("ERROR @accept:"); abort(); } utils::log->append(DEPLOYER_CBLISTENER, INFO_LVL, "got connection from %s", inet_ntoa(cli_addr.sin_addr)); while (true) { // read data from remote hosts bzero(read_buffer, 1024); int nbcar = read(newsockfd, read_buffer, 1024); if (nbcar == 0) continue; if (nbcar < 0) { perror("ERROR @read:"); break; } buffer += read_buffer; if (buffer[buffer.size() - 1] == -1) { DBG("found 255:breaking"); break; } } close(newsockfd); // handle buffer obj->handle_callback(buffer); FD_SET(obj->cb_socket, &socket); } else { utils::log->append(DEPLOYER_CBLISTENER, INFO_LVL, "select() has timeout'ed, missed %d callbacks messages..", obj->nbmsg_to_wait); break; } } assert (!obj->nbmsg_to_wait); close(obj->cb_socket);