Beispiel #1
0
void Connection::closeConnectionTask()
{
	//dispatcher thread
	#ifdef __DEBUG_NET_DETAIL__
	std::cout << "Connection::closeConnectionTask" << std::endl;
	#endif

	m_connectionLock.lock();
	if(m_connectionState != CONNECTION_STATE_REQUEST_CLOSE){
		std::cout << "Error: [Connection::closeConnectionTask] m_connectionState = " << m_connectionState << std::endl;
		m_connectionLock.unlock();
		return;
	}

	if(m_protocol){
		m_protocol->setConnection(Connection_ptr());
		m_protocol->releaseProtocol();
		m_protocol = NULL;
	}

	m_connectionState = CONNECTION_STATE_CLOSING;

	if(m_pendingWrite == 0 || m_writeError){
		closeSocket();
		releaseConnection();
		m_connectionState = CONNECTION_STATE_CLOSED;
	}
	else{
		//will be closed by onWriteOperation/handleWriteTimeout/handleReadTimeout instead
	}

	m_connectionLock.unlock();
}
Beispiel #2
0
void Connection::closeConnection() {
	LOGt("Connection::closeConnection()");

	boost::recursive_mutex::scoped_lock lock(m_connectionLock);

	if(m_connectionState != CONNECTION_STATE_REQUEST_CLOSE)
	{
		LOGe("[Connection::closeConnection] m_connectionState = " << m_connectionState);
		return;
	}

	if(m_protocol)
	{
		m_protocol->setConnection(Connection_ptr());
		m_protocol->releaseProtocol();
		m_protocol = nullptr;
	}

	m_connectionState = CONNECTION_STATE_CLOSING;
	if(!m_pendingWrite || m_writeError)
	{
		closeSocket();
		releaseConnection();
		m_connectionState = CONNECTION_STATE_CLOSED;
	}
}
Beispiel #3
0
void Connection::closeConnection()
{
	//dispatcher thread
	#ifdef __DEBUG_NET_DETAIL__
	std::clog << "Connection::closeConnection" << std::endl;
	#endif
	m_connectionLock.lock();
	if(m_connectionState != CONNECTION_STATE_REQUEST_CLOSE)
	{
		std::clog << "[Error - Connection::closeConnection] m_connectionState = " << m_connectionState << std::endl;
		m_connectionLock.unlock();
		return;
	}

	if(m_protocol)
	{
		m_protocol->setConnection(Connection_ptr());
		m_protocol->releaseProtocol();
		m_protocol = NULL;
	}

	m_connectionState = CONNECTION_STATE_CLOSING;
	if(!m_pendingWrite || m_writeError)
	{
		closeSocket();
		releaseConnection();
		m_connectionState = CONNECTION_STATE_CLOSED;
	}

	m_connectionLock.unlock();
}
void Connection::closeConnectionTask()
{
	//dispatcher thread
	std::lock_guard<std::recursive_mutex> lockClass(m_connectionLock);

	if (m_connectionState != CONNECTION_STATE_REQUEST_CLOSE) {
		std::cout << "Error: [Connection::closeConnectionTask] m_connectionState = " << m_connectionState << std::endl;
		return;
	}

	if (m_protocol) {
		m_protocol->setConnection(Connection_ptr());
		m_protocol->releaseProtocol();
		m_protocol = nullptr;
	}

	m_connectionState = CONNECTION_STATE_CLOSING;

	if (m_pendingWrite == 0 || m_writeError) {
		closeSocket();
		releaseConnection();
		m_connectionState = CONNECTION_STATE_CLOSED;
	} else {
		//will be closed by onWriteOperation/handleWriteTimeout/handleReadTimeout instead
	}
}
Beispiel #5
0
Connection_ptr ConnectionManager::createConnection(boost::asio::ip::tcp::socket* socket,
        boost::asio::io_service& io_service, ServicePort_ptr servicer)
{
	boost::recursive_mutex::scoped_lock lockClass(m_connectionManagerLock);
	Connection_ptr connection = Connection_ptr(new Connection(socket, io_service, servicer));
	m_connections.push_back(connection);
	return connection;
}
Connection_ptr ConnectionManager::createConnection(boost::asio::ip::tcp::socket* socket,
        boost::asio::io_service& io_service, ServicePort_ptr servicer)
{
	std::lock_guard<std::recursive_mutex> lockClass(m_connectionManagerLock);

	Connection_ptr connection = Connection_ptr(new Connection(socket, io_service, servicer));
	m_connections.insert(connection);
	return connection;
}
Beispiel #7
0
Protocol* ServicePort::make_protocol(bool checksummed, NetworkMessage& msg) const
{
	uint8_t protocolID = msg.GetByte();
	for(std::vector<Service_ptr>::const_iterator service_iter = m_services.begin(); service_iter != m_services.end(); ++service_iter)
	{
		Service_ptr service = *service_iter;
		if(protocolID != service->get_protocol_identifier())
			continue;

		if(checksummed)
		{
			if(service->is_checksummed())
				return service->make_protocol(Connection_ptr());
		}
		else if(!service->is_checksummed())
			return service->make_protocol(Connection_ptr());
	}
	return NULL;
}
Beispiel #8
0
Protocol* ServicePort::make_protocol(NetworkMessage& msg) const
{
    uint8_t protocolID = msg.GetByte();
    for (Service_ptr service : m_services) {
        if (protocolID == service->get_protocol_identifier()) {
            return service->make_protocol(Connection_ptr());
        }
    }
    return nullptr;
}
Protocol* ServicePort::makeProtocol(bool checksum, NetworkMessage& msg) const
{
	uint8_t protocolId = msg.GetByte();
	for(ServiceVec::const_iterator it = m_services.begin(); it != m_services.end(); ++it)
	{
		if((*it)->getProtocolId() == protocolId && ((checksum && (*it)->hasChecksum()) || !(*it)->hasChecksum()))
			return (*it)->makeProtocol(Connection_ptr());
	}

	return NULL;
}
Beispiel #10
0
Protocol* ServicePort::makeProtocol(NetworkMessage& msg) const
{
	uint8_t protocolId = msg.get<char>();
	for(ServiceVec::const_iterator it = m_services.begin(); it != m_services.end(); ++it)
	{
		if((*it)->getProtocolId() == protocolId)
			return (*it)->makeProtocol(Connection_ptr());
	}

	return NULL;
}
Beispiel #11
0
Protocol* ServicePort::make_protocol(bool checksummed, NetworkMessage& msg) const
{
	uint8_t protocolID = msg.GetByte();
	for (Service_ptr service : m_services) {
		if (protocolID != service->get_protocol_identifier()) {
			continue;
		}

		if ((checksummed && service->is_checksummed()) || !service->is_checksummed()) {
			return service->make_protocol(Connection_ptr());
		}
	}
	return nullptr;
}
Protocol* ServicePort::make_protocol(bool checksummed, NetworkMessage& msg) const
{
	uint8_t protocolId = msg.GetByte();
	for(std::vector<Service_ptr>::const_iterator it = m_services.begin(); it != m_services.end(); ++it)
	{
		Service_ptr service = *it;
		if(service->get_protocol_identifier() == protocolId && ((checksummed &&
			service->is_checksummed()) || !service->is_checksummed())){
			// Correct service! Create protocol and get on with it
			return service->make_protocol(Connection_ptr());
		}

		// We can ignore the other cases, they will most likely end up in return NULL anyways.
	}

	return NULL;
}