2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
42#include "core/socket/stream/SocketConnection.h"
43#include "core/socket/stream/SocketContext.h"
45#ifndef DOXYGEN_SHOULD_SKIP_THIS
47#include "log/Logger.h"
48#include "utils/PreserveErrno.h"
49#include "utils/system/signal.h"
56namespace core::socket::
stream {
58 template <
typename SocketAddress,
typename PhysicalSocket,
typename Config>
60 typename SocketAddress::SockAddr localSockAddr;
61 typename SocketAddress::SockLen localSockAddrLen =
sizeof(
typename SocketAddress::SockAddr);
63 SocketAddress localPeerAddress;
64 if (physicalSocket.getSockName(localSockAddr, localSockAddrLen) == 0) {
66 localPeerAddress = config->Local::getSocketAddress(localSockAddr, localSockAddrLen);
67 LOG(TRACE) << config->getInstanceName() <<
" [" << physicalSocket.getFd() <<
"]" << std::setw(25)
68 <<
" PeerAddress (local): " << localPeerAddress.toString();
69 }
catch (
const typename SocketAddress::BadSocketAddress& badSocketAddress) {
70 LOG(WARNING) << config->getInstanceName() <<
" [" << physicalSocket.getFd() <<
"]" << std::setw(25)
71 <<
" PeerAddress (local): " << badSocketAddress.what();
74 PLOG(WARNING) << config->getInstanceName() <<
" [" << physicalSocket.getFd() <<
"]" << std::setw(25)
75 <<
" PeerAddress (local) not retrievable";
78 return localPeerAddress;
81 template <
typename SocketAddress,
typename PhysicalSocket,
typename Config>
83 typename SocketAddress::SockAddr remoteSockAddr;
84 typename SocketAddress::SockLen remoteSockAddrLen =
sizeof(
typename SocketAddress::SockAddr);
86 SocketAddress remotePeerAddress;
87 if (physicalSocket.getPeerName(remoteSockAddr, remoteSockAddrLen) == 0) {
89 remotePeerAddress = config->Remote::getSocketAddress(remoteSockAddr, remoteSockAddrLen);
90 LOG(TRACE) << config->getInstanceName() <<
" [" << physicalSocket.getFd() <<
"]" << std::setw(25)
91 <<
" PeerAddress (remote): " << remotePeerAddress.toString();
92 }
catch (
const typename SocketAddress::BadSocketAddress& badSocketAddress) {
93 LOG(WARNING) << config->getInstanceName() <<
" [" << physicalSocket.getFd() <<
"]" << std::setw(25)
94 <<
" PeerAddress (remote): " << badSocketAddress.what();
97 PLOG(WARNING) << config->getInstanceName() <<
" [" << physicalSocket.getFd() <<
"]" << std::setw(25)
98 <<
" PeerAddress (remote) not retrievble";
101 return remotePeerAddress;
104 template <
typename PhysicalSocket,
typename SocketReader,
typename SocketWriter,
typename Config>
106 const std::function<
void()>& onDisconnect,
107 const std::shared_ptr<
Config>& config)
124 config->getReadTimeout(),
125 config->getReadBlockSize(),
126 config->getTerminateTimeout())
138 config->getWriteTimeout(),
139 config->getWriteBlockSize(),
140 config->getTerminateTimeout())
155 template <
typename PhysicalSocket,
typename SocketReader,
typename SocketWriter,
typename Config>
159 template <
typename PhysicalSocket,
typename SocketReader,
typename SocketWriter,
typename Config>
165 template <
typename PhysicalSocketT,
typename SocketReaderT,
typename SocketWriterT,
typename ConfigT>
169 template <
typename PhysicalSocketT,
typename SocketReaderT,
typename SocketWriterT,
typename ConfigT>
174 template <
typename PhysicalSocket,
typename SocketReader,
typename SocketWriter,
typename Config>
179 template <
typename PhysicalSocket,
typename SocketReader,
typename SocketWriter,
typename Config>
185 template <
typename PhysicalSocket,
typename SocketReader,
typename SocketWriter,
typename Config>
191 template <
typename PhysicalSocket,
typename SocketReader,
typename SocketWriter,
typename Config>
197 template <
typename PhysicalSocket,
typename SocketReader,
typename SocketWriter,
typename Config>
204 LOG(TRACE) <<
connectionName <<
" ReadFromPeer: New SocketContext != nullptr: SocketContextSwitch still in progress";
210 template <
typename PhysicalSocket,
typename SocketReader,
typename SocketWriter,
typename Config>
215 template <
typename PhysicalSocket,
typename SocketReader,
typename SocketWriter,
typename Config>
220 template <
typename PhysicalSocket,
typename SocketReader,
typename SocketWriter,
typename Config>
225 template <
typename PhysicalSocket,
typename SocketReader,
typename SocketWriter,
typename Config>
238 template <
typename PhysicalSocket,
typename SocketReader,
typename SocketWriter,
typename Config>
251 template <
typename PhysicalSocket,
typename SocketReader,
typename SocketWriter,
typename Config>
261 template <
typename PhysicalSocket,
typename SocketReader,
typename SocketWriter,
typename Config>
266 template <
typename PhysicalSocket,
typename SocketReader,
typename SocketWriter,
typename Config>
271 template <
typename PhysicalSocket,
typename SocketReader,
typename SocketWriter,
typename Config>
276 template <
typename PhysicalSocket,
typename SocketReader,
typename SocketWriter,
typename Config>
281 template <
typename PhysicalSocket,
typename SocketReader,
typename SocketWriter,
typename Config>
286 template <
typename PhysicalSocket,
typename SocketReader,
typename SocketWriter,
typename Config>
303 template <
typename PhysicalSocket,
typename SocketReader,
typename SocketWriter,
typename Config>
307 if (available != 0 && consumed == 0) {
326 template <
typename PhysicalSocket,
typename SocketReader,
typename SocketWriter,
typename Config>
331 template <
typename PhysicalSocket,
typename SocketReader,
typename SocketWriter,
typename Config>
336 template <
typename PhysicalSocket,
typename SocketReader,
typename SocketWriter,
typename Config>
356 template <
typename PhysicalSocket,
typename SocketReader,
typename SocketWriter,
typename Config>
362 template <
typename PhysicalSocket,
typename SocketReader,
typename SocketWriter,
typename Config>
368 template <
typename PhysicalSocket,
typename SocketReader,
typename SocketWriter,
typename Config>
virtual bool onSignal(int sig)=0
const std::shared_ptr< Config > config
Socket(const std::shared_ptr< Config > &config)
Socket(const std::string &name)
Config * getConfig() const
SocketAddress remoteAddress
Config * getConfig() const
void onReceivedFromPeer(std::size_t available) final
void setReadTimeout(const utils::Timeval &timeout) final
bool streamToPeer(core::pipe::Source *source) final
std::size_t getTotalSent() const override
SocketConnectionT(PhysicalSocket &&physicalSocket, const std::function< void()> &onDisconnect, const std::shared_ptr< Config > &config)
core::socket::stream::SocketConnection Super
std::shared_ptr< Config > config
const SocketAddress & getBindAddress() const final
void doWriteShutdown(const std::function< void()> &onShutdown) override
void shutdownWrite() final
void writeTimeout() final
const SocketAddress & getRemoteAddress() const final
void sendToPeer(const char *chunk, std::size_t chunkLen) final
void setWriteTimeout(const utils::Timeval &timeout) final
std::function< void()> onDisconnect
void setTimeout(const utils::Timeval &timeout) final
PhysicalSocket physicalSocket
void onReadError(int errnum)
bool onSignal(int signum) final
std::size_t readFromPeer(char *chunk, std::size_t chunkLen) final
std::size_t getTotalProcessed() const override
SocketAddress localAddress
std::size_t getTotalRead() const override
void unobservedEvent() final
void onWriteError(int errnum)
~SocketConnectionT() override
void shutdownRead() final
SocketWriterT SocketWriter
PhysicalSocketT PhysicalSocket
typename PhysicalSocket::SocketAddress SocketAddress
const SocketAddress & getLocalAddress() const final
std::size_t getTotalQueued() const override
SocketReaderT SocketReader
std::string connectionName
core::socket::stream::SocketContext * newSocketContext
core::socket::stream::SocketContext * socketContext
const std::string & getConnectionName() const
std::size_t readFromPeer()
void onReadError(int errnum) override
void onWriteError(int errnum) override
PhysicalSocketT PhysicalSocket
SocketConnection(PhysicalSocket &&physicalSocket, const std::function< void(SocketConnection *)> &onDisconnect, const std::shared_ptr< Config > &config)
core::socket::stream::SocketConnectionT< PhysicalSocketT, core::socket::stream::legacy::SocketReader, core::socket::stream::legacy::SocketWriter, ConfigT > Super
LogMessage(Level level, int verboseLevel=-1, bool withErrno=false)
PreserveErrno(int newErrno=errno)
SocketAddress getRemoteSocketAddress(PhysicalSocket &physicalSocket, Config &config)
SocketAddress getLocalSocketAddress(PhysicalSocket &physicalSocket, Config &config)
std::string strsignal(int sig)
std::string sigabbrev_np(int sig)