더북(TheBook)

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();
}

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.