コード例 #1
0
//-----------------------------------------------------------------------------
void ScanDataReceiver::handleSocketRead(const boost::system::error_code& error)
{
    if (!error )
    {
        // Read all received data and write it to the internal ring buffer
        instream_.clear();
        while(!instream_.eof())
        {
            char buf[4096];
            instream_.read(buf,4096);
            int bytes_read = instream_.gcount();
            writeBufferBack(buf,bytes_read);
        }

        // Handle (read and parse) packets stored in the internal ring buffer
        while( handleNextPacket() ) {}

        // Read data asynchronously
        boost::asio::async_read(*tcp_socket_, inbuf_, boost::bind(&ScanDataReceiver::handleSocketRead, this, boost::asio::placeholders::error));
    }
    else
    {
        if( error.value() != 995 )
            std::cerr << "ERROR: " << "data connection error: " << error.message() << "(" << error.value() << ")" << std::endl;
        disconnect();
    }
    last_data_time_ = std::time(0);
}
コード例 #2
0
	void ScanDataReceiverTCP::run()
	{
		char* buffer = data_buffer_.data();
		
		// thread worker
#if __cplusplus>=201103
		isRunning = true;
		
		while(isRunning)
#else
		bool doIt = true;
			
		run_mutex.lock();
		isRunning = true;
		run_mutex.unlock();
			
		while(doIt)
#endif
		{
			// do
			std::size_t numBytes = tcp_socket.receiveBytes(buffer, data_buffer_.size());
			
			if (numBytes == 0) break; // gracefull shutdown...
			
			// write data to ringbuffer
			writeBufferBack(buffer, numBytes);
			
			// handle packets
			while( handleNextPacket() ) {}
			
#if __cplusplus<201103
            run_mutex.lock();
			doIt = isRunning;
            run_mutex.unlock();
#endif
		}
		
		// thread done
	}
コード例 #3
0
//-----------------------------------------------------------------------------
void ScanDataReceiver::handleSocketRead(const boost::system::error_code &error, std::size_t bytes_transferred)
{
    if (!error )
    {
        // Read all received data and write it to the internal ring buffer
        writeBufferBack(&udp_buffer_[0],bytes_transferred);

        // Handle (read and parse) packets stored in the internal ring buffer
        while( handleNextPacket() ) {}

        // Read data asynchronously
        udp_socket_->async_receive_from(boost::asio::buffer(&udp_buffer_[0],udp_buffer_.size()), udp_endpoint_,
                                        boost::bind(&ScanDataReceiver::handleSocketRead, this,
                                                    boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
    }
    else
    {
        if( error.value() != 995 )
            std::cerr << "ERROR: " << "data connection error: " << error.message() << "(" << error.value() << ")" << std::endl;
        disconnect();
    }
    last_data_time_ = std::time(0);
}