37 SocketConnectionT<PhysicalSocket, SocketReader, SocketWriter>::SocketConnectionT(
const std::string& instanceName,
38 PhysicalSocket&& physicalSocket,
39 const std::function<
void()>& onDisconnect,
40 const std::string& configuredServer,
41 const SocketAddress& localAddress,
42 const SocketAddress& remoteAddress,
43 const utils::Timeval& readTimeout,
44 const utils::Timeval& writeTimeout,
45 std::size_t readBlockSize,
46 std::size_t writeBlockSize,
47 const utils::Timeval& terminateTimeout)
48 : SocketConnection(instanceName, physicalSocket.getFd(), configuredServer)
50 instanceName +
" [" + std::to_string(physicalSocket.getFd()) +
"]",
53 const utils::PreserveErrno pe(errnum);
55 LOG(TRACE) << connectionName <<
" OnReadError: EOF received";
57 PLOG(TRACE) << connectionName <<
" OnReadError";
60 SocketReader::disable();
68 instanceName +
" [" + std::to_string(physicalSocket.getFd()) +
"]",
71 const utils::PreserveErrno pe(errnum);
72 PLOG(TRACE) << connectionName <<
" OnWriteError";
74 SocketWriter::disable();
82 , onDisconnect(onDisconnect)
85 if (!SocketReader::enable(
this->physicalSocket.getFd())) {
87 }
else if (!SocketWriter::enable(
this->physicalSocket.getFd())) {
90 SocketWriter::suspend();
151 LOG(TRACE) << connectionName <<
": Shutdown (RD)";
153 SocketReader::shutdownRead();
156 LOG(DEBUG) << connectionName <<
" Shutdown (RD): success";
158 PLOG(ERROR) << connectionName <<
" Shutdown (RD)";
164 if (!SocketWriter::shutdownInProgress) {
165 LOG(TRACE) << connectionName <<
": Stop writing";
167 SocketWriter::shutdownWrite([forceClose,
this]() {
168 if (SocketWriter::isEnabled()) {
169 SocketWriter::disable();
171 if (forceClose && SocketReader::isEnabled()) {
194 LOG(TRACE) << connectionName <<
": Shutdown (WR)";
197 LOG(DEBUG) << connectionName <<
" Shutdown (WR): success";
199 PLOG(ERROR) << connectionName <<
" Shutdown (WR)";
207 std::size_t consumed = socketContext->onReceivedFromPeer();
209 if (available != 0 && consumed == 0) {
210 LOG(TRACE) << connectionName <<
": Data available: " << available <<
" but nothing read";
214 delete newSocketContext;
215 newSocketContext =
nullptr;
216 }
else if (newSocketContext !=
nullptr) {
218 setSocketContext(newSocketContext);
219 newSocketContext =
nullptr;
243 LOG(DEBUG) << connectionName <<
": Shutting down due to signal '" << strsignal(signum) <<
"' (SIG"
244 << utils::system::sigabbrev_np(signum) <<
" [" << signum <<
"])";
250 return socketContext !=
nullptr ? socketContext->onSignal(signum) :
true;
SocketConnection(const std::string &instanceName, PhysicalSocket &&physicalSocket, const std::function< void(SocketConnection *)> &onDisconnect, const std::string &configuredServer, const SocketAddress &localAddress, const SocketAddress &remoteAddress, const utils::Timeval &readTimeout, const utils::Timeval &writeTimeout, std::size_t readBlockSize, std::size_t writeBlockSize, const utils::Timeval &terminateTimeout)