X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Fplatform%2Fsockets%2Ftcp.h;h=ffc372ccacfcad10e7cb90a7d4c7aff94bfc5849;hb=996665192725398172263999b88c63663d11db04;hp=ef9c418aaa82568d7b24008e0e8be5c487605add;hpb=4478bc797f871f631399ab8008d3b2787ded07c2;p=deb_libcec.git diff --git a/src/lib/platform/sockets/tcp.h b/src/lib/platform/sockets/tcp.h index ef9c418..ffc372c 100644 --- a/src/lib/platform/sockets/tcp.h +++ b/src/lib/platform/sockets/tcp.h @@ -33,28 +33,24 @@ #include "socket.h" -#if defined(__WINDOWS__) -#include "../windows/os-tcp.h" -#else -#include "../posix/os-tcp.h" -#endif - using namespace std; namespace PLATFORM { - class CTcpSocket : public CSocket + class CTcpSocket : public CCommonSocket { public: - CTcpSocket(void) {}; + CTcpSocket(const CStdString &strHostname, uint16_t iPort) : + CCommonSocket(INVALID_SOCKET_VALUE, strHostname), + m_iPort(iPort) {} + virtual ~CTcpSocket(void) {} - virtual bool Open(const CStdString &strHostname, uint16_t iPort, uint64_t nTimeout) + virtual bool Open(uint64_t iTimeoutMs = 0) { bool bReturn(false); struct addrinfo *address(NULL), *addr(NULL); - CLockObject lock(m_mutex); - if (!TcpResolveAddress(strHostname.c_str(), iPort, &m_iError, &address)) + if (!TcpResolveAddress(m_strName.c_str(), m_iPort, &m_iError, &address)) { m_strError = strerror(m_iError); return bReturn; @@ -62,8 +58,8 @@ namespace PLATFORM for(addr = address; !bReturn && addr; addr = addr->ai_next) { - m_socket = TcpCreateSocket(addr, &m_iError, nTimeout); - if (m_socket != INVALID_SOCKET && m_socket != SOCKET_ERROR) + m_socket = TcpCreateSocket(addr, &m_iError, iTimeoutMs); + if (m_socket != INVALID_SOCKET_VALUE) bReturn = true; else m_strError = strerror(m_iError); @@ -73,34 +69,62 @@ namespace PLATFORM return bReturn; } + virtual void Close(void) + { + TcpSocketClose(m_socket); + m_socket = INVALID_SOCKET_VALUE; + } + virtual void Shutdown(void) { - CLockObject lock(m_mutex); - if (m_socket != INVALID_SOCKET && m_socket != SOCKET_ERROR) - TcpShutdownSocket(m_socket); - m_socket = INVALID_SOCKET; - m_strError = ""; + 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); + } + + virtual ssize_t Read(void* data, size_t len, uint64_t iTimeoutMs = 0) + { + return TcpSocketRead(m_socket, &m_iError, data, len, iTimeoutMs); } - protected: - virtual socket_t TcpCreateSocket(struct addrinfo* addr, int* iError, uint64_t iTimeout) - { - socket_t fdSock = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol); - if (fdSock == INVALID_SOCKET || fdSock == SOCKET_ERROR) + virtual bool IsOpen(void) { - *iError = errno; - return (socket_t)SOCKET_ERROR; + return m_socket != INVALID_SOCKET_VALUE; } - if (!TcpConnectSocket(fdSock, addr, iError, iTimeout)) + protected: + virtual tcp_socket_t TcpCreateSocket(struct addrinfo* addr, int* iError, uint64_t iTimeout) { - SocketClose(fdSock); - return (socket_t)SOCKET_ERROR; + 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; } - TcpSetNoDelay(fdSock); + uint16_t m_iPort; + }; - return fdSock; - } + class CTcpConnection : public CProtectedSocket + { + public: + CTcpConnection(const CStdString &strHostname, uint16_t iPort) : + CProtectedSocket (new CTcpSocket(strHostname, iPort)) {} + virtual ~CTcpConnection(void) {} }; };