rendered paste body 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);