All pastes #375667 Raw Edit

Untitled

public text v1 · immutable
#375667 ·published 2007-02-28 14:35 UTC
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);