3.5.2 자료형 안전성을 보강한 TCP 소켓
TCPSocket 클래스도 UDPSocket 클래스 비슷하게 자료형 안정성을 보강한 것으로, TCP의 연결 지향(connection-oriented) 기능을 추가했다. 코드 3-7에 해당 구현이 있다.
코드 3-7 자료형 안전성을 보강한 TCPSocket 클래스
class TCPSocket; using TCPSocketPtr = shared_ptr<TCPSocket>; class TCPSocket { public: ~TCPSocket(); int Connect(const SocketAddress& inAddress); int Bind(const SocketAddress& inToAddress); int Listen(int inBackLog = 32); TCPSocketPtr Accept(SocketAddress& inFromAddress); int Send(const void* inData, int inLen); int Receive(void* inBuffer, int inLen); private: friend class SocketUtil; TCPSocket(SOCKET inSocket) : mSocket(inSocket) { } SOCKET mSocket; }; int TCPSocket::Connect(const SocketAddress& inAddress) { int err = connect(mSocket, &inAddress.mSocketAddr, inAddress.GetSize()); if (err >= 0) return NO_ERROR; SocketUtil::ReportError(L“TCPSocket::Connect”); return -SocketUtil::GetLastError(); } int TCPSocket::Listen(int inBackLog) { int err = listen(mSocket, inBackLog); if (err >= 0) return NO_ERROR; SocketUtil::ReportError(L“TCPSocket::Listen”); return -SocketUtil::GetLastError(); } TCPSocketPtr TCPSocket::Accept(SocketAddress& inFromAddress) { int length = inFromAddress.GetSize(); SOCKET newSocket = accept(mSocket, &inFromAddress.mSockAddr, &length); if (newSocket != INVALID_SOCKET) return TCPSocketPtr(new TCPSocket(newSocket)); SocketUtil::ReportError(L“TCPSocket::Accept”); return nullptr; } int TCPSocket::Send(const void* inData, int inLen) { int bytesSentCount = send( mSocket, static_cast<const char*>(inData), inLen, 0); if (bytesSentCount >= 0) return bytesSentCount; SocketUtil::ReportError(L“TCPSocket::Send”); return -SocketUtil::GetLastError(); } int TCPSocket::Receive(void* inData, int inLen) { int bytesReceivedCount = recv( mSocket, static_cast<char*>(inData), inLen, 0); if (bytesReceivedCount >= 0) return bytesReceivedCount; SocketUtil::ReportError(L“TCPSocket::Receive”); return -SocketUtil::GetLastError(); }