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); } } }
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; }
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; } }