X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Fplatform%2Fsockets%2Ftcp.h;h=ffc372ccacfcad10e7cb90a7d4c7aff94bfc5849;hb=996665192725398172263999b88c63663d11db04;hp=c69159a36420e7c6562594be22b65ae488033a09;hpb=0e51267bc52437d3ae878c5d3beb6ad1e8be4276;p=deb_libcec.git diff --git a/src/lib/platform/sockets/tcp.h b/src/lib/platform/sockets/tcp.h index c69159a..ffc372c 100644 --- a/src/lib/platform/sockets/tcp.h +++ b/src/lib/platform/sockets/tcp.h @@ -2,7 +2,7 @@ /* * This file is part of the libCEC(R) library. * - * libCEC(R) is Copyright (C) 2011 Pulse-Eight Limited. All rights reserved. + * libCEC(R) is Copyright (C) 2011-2012 Pulse-Eight Limited. All rights reserved. * libCEC(R) is an original work, containing original code. * * libCEC(R) is a trademark of Pulse-Eight Limited. @@ -33,64 +33,98 @@ #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, *addr; - int iResult = TcpResolveAddress(strHostname, iPort, address); - if (iResult) + struct addrinfo *address(NULL), *addr(NULL); + if (!TcpResolveAddress(m_strName.c_str(), m_iPort, &m_iError, &address)) { - m_strError = strerror(iResult); + m_strError = strerror(m_iError); return bReturn; } for(addr = address; !bReturn && addr; addr = addr->ai_next) { - int iError(0); - m_socket = TcpCreateSocket(addr, &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(iError); + m_strError = strerror(m_iError); } freeaddrinfo(address); return bReturn; } - 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 == -1) + 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); + } + + virtual ssize_t Read(void* data, size_t len, uint64_t iTimeoutMs = 0) + { + return TcpSocketRead(m_socket, &m_iError, data, len, iTimeoutMs); + } + + virtual bool IsOpen(void) { - *iError = TcpGetSocketError(); - return (socket_t)SOCKET_ERROR; + return m_socket != INVALID_SOCKET_VALUE; } - if (TcpConnectSocket(addr, fdSock, iError, iTimeout) != 0) + protected: + virtual tcp_socket_t TcpCreateSocket(struct addrinfo* addr, int* iError, uint64_t iTimeout) { - closesocket(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) {} }; };