+ protected:
+ virtual tcp_socket_t TcpCreateSocket(struct addrinfo* addr, int* iError, uint64_t iTimeout)
+ {
+ tcp_socket_t fdSock = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
+ if (fdSock == INVALID_SOCKET_VALUE)
+ {
+ *iError = errno;
+ return (tcp_socket_t)INVALID_SOCKET_VALUE;
+ }
+
+ if (!TcpConnectSocket(fdSock, addr, iError, iTimeout))
+ {
+ TcpSocketClose(fdSock);
+ return (tcp_socket_t)INVALID_SOCKET_VALUE;
+ }
+
+ TcpSetNoDelay(fdSock);
+
+ return fdSock;
+ }
+
+ uint16_t m_iPort;
+ };
+
+ class CTcpClientSocket : public CCommonSocket<tcp_socket_t>
+ {
+ public:
+ CTcpClientSocket(tcp_socket_t socket) :
+ CCommonSocket<tcp_socket_t>(socket, "tcpclient") {}
+
+ virtual ~CTcpClientSocket(void) {}
+
+ virtual bool Open(uint64_t iTimeoutMs = 0)
+ {
+ (void) iTimeoutMs;
+ return true;
+ }
+
+ virtual void Close(void)
+ {
+ TcpSocketClose(m_socket);
+ m_socket = INVALID_SOCKET_VALUE;
+ }
+
+ virtual void Shutdown(void)
+ {
+ TcpSocketShutdown(m_socket);
+ m_socket = INVALID_SOCKET_VALUE;
+ }
+
+ virtual ssize_t Write(void* data, size_t len)
+ {
+ return TcpSocketWrite(m_socket, &m_iError, data, len);
+ }