コード例 #1
0
ファイル: inspsocket.cpp プロジェクト: Renegade334/inspircd
void StreamSocket::DoRead()
{
	if (GetIOHook())
	{
		int rv = -1;
		try
		{
			rv = GetIOHook()->OnStreamSocketRead(this, recvq);
		}
		catch (CoreException& modexcept)
		{
			ServerInstance->Logs->Log("SOCKET", LOG_DEFAULT, "%s threw an exception: %s",
				modexcept.GetSource().c_str(), modexcept.GetReason().c_str());
			return;
		}
		if (rv > 0)
			OnDataReady();
		if (rv < 0)
			SetError("Read Error"); // will not overwrite a better error message
	}
	else
	{
		char* ReadBuffer = ServerInstance->GetReadBuffer();
		int n = SocketEngine::Recv(this, ReadBuffer, ServerInstance->Config->NetBufferSize, 0);
		if (n == ServerInstance->Config->NetBufferSize)
		{
			SocketEngine::ChangeEventMask(this, FD_WANT_FAST_READ | FD_ADD_TRIAL_READ);
			recvq.append(ReadBuffer, n);
			OnDataReady();
		}
		else if (n > 0)
		{
			SocketEngine::ChangeEventMask(this, FD_WANT_FAST_READ);
			recvq.append(ReadBuffer, n);
			OnDataReady();
		}
		else if (n == 0)
		{
			error = "Connection closed";
			SocketEngine::ChangeEventMask(this, FD_WANT_NO_READ | FD_WANT_NO_WRITE);
		}
		else if (SocketEngine::IgnoreError())
		{
			SocketEngine::ChangeEventMask(this, FD_WANT_FAST_READ | FD_READ_WILL_BLOCK);
		}
		else if (errno == EINTR)
		{
			SocketEngine::ChangeEventMask(this, FD_WANT_FAST_READ | FD_ADD_TRIAL_READ);
		}
		else
		{
			error = SocketEngine::LastError();
			SocketEngine::ChangeEventMask(this, FD_WANT_NO_READ | FD_WANT_NO_WRITE);
		}
	}
}
コード例 #2
0
ファイル: NET.cpp プロジェクト: slawer/krs_kal
void NET_BaseSocket::OnReceived()
{
	MutexWrap in_read_access(m_in_data->m_r_mutex);
	int ready_data_size;
	{
		MutexWrap in_write_access(m_in_data->m_w_mutex);
		ready_data_size = m_in_data->NoLockSpaceFor(RingBuffer_READ);
	}
	char* data = new char[ready_data_size];
	if (data == NULL)
	{
		OnError("NET_BaseSocket::OnReceived, data == NULL");
		return;
	}
	m_in_data->Read(data, ready_data_size);
	OnDataReady(data, ready_data_size);
	delete[] data;
}
コード例 #3
0
ファイル: m_pgsql.cpp プロジェクト: thepaul/inspircd-deb
	virtual void HandleEvent(EventType et, int errornum)
	{
		switch (et)
		{
			case EVENT_READ:
				OnDataReady();
			break;

			case EVENT_WRITE:
				OnWriteReady();
			break;

			case EVENT_ERROR:
				DelayReconnect();
			break;

			default:
			break;
		}
	}