X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Fplatform%2Fsockets%2Ftcp.h;h=ef9c418aaa82568d7b24008e0e8be5c487605add;hb=cb2397e953b3f892b4206d5bb87968ca4cccbac8;hp=47c71b7754eeb3e0b043df9bfd3172a4d07fdc52;hpb=9b53a148ade63466655e6e5d8cb0ca2b64a76ae3;p=deb_libcec.git diff --git a/src/lib/platform/sockets/tcp.h b/src/lib/platform/sockets/tcp.h index 47c71b7..ef9c418 100644 --- a/src/lib/platform/sockets/tcp.h +++ b/src/lib/platform/sockets/tcp.h @@ -39,52 +39,62 @@ #include "../posix/os-tcp.h" #endif +using namespace std; + namespace PLATFORM { class CTcpSocket : public CSocket { public: - CTcpSocket(void); + CTcpSocket(void) {}; virtual ~CTcpSocket(void) {} virtual bool Open(const CStdString &strHostname, uint16_t iPort, uint64_t nTimeout) { bool bReturn(false); - struct addrinfo *address, *addr; - int iResult = TcpResolveAddress(strHostname, iPort, address); - if (iResult) + struct addrinfo *address(NULL), *addr(NULL); + CLockObject lock(m_mutex); + if (!TcpResolveAddress(strHostname.c_str(), 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); + m_socket = TcpCreateSocket(addr, &m_iError, nTimeout); if (m_socket != INVALID_SOCKET && m_socket != SOCKET_ERROR) bReturn = true; else - m_strError = strerror(iError); + m_strError = strerror(m_iError); } freeaddrinfo(address); return bReturn; } + 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 = ""; + } + 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) + if (fdSock == INVALID_SOCKET || fdSock == SOCKET_ERROR) { - *iError = TcpGetSocketError(); + *iError = errno; return (socket_t)SOCKET_ERROR; } - if (TcpConnectSocket(addr, fdSock, iError, iTimeout) != 0) + if (!TcpConnectSocket(fdSock, addr, iError, iTimeout)) { - closesocket(fdSock); + SocketClose(fdSock); return (socket_t)SOCKET_ERROR; }