더북(TheBook)

3.4.1 자료형 안전성을 보강한 UDP 소켓

코드 3-5에 자료형 안전성을 보강한 UDPSocket 클래스를 구현하였는데, 주소를 바인딩하고 데이터그램을 송수신하는 기능이 구현되어 있다.

코드 3-5 자료형 안전성을 보강한 UDPSocket 클래스

class UDPSocket
{
public:
    ~UDPSocket();
    int Bind(const SocketAddress& inToAddress);
    int SendTo(const void* inData, int inLen, const SocketAddress& inTo);
    int ReceiveFrom(void* inBuffer, int inLen, SocketAddress& outFrom);
 
private:
    friend class SocketUtil;
    UDPSocket(SOCKET inSocket) : mSocket(inSocket) {}
    SOCKET mSocket;
};
 
using UDPSocketPtr = shared_ptr<UDPSocket>;
 
int UDPSocket::Bind(const SocketAddress& inBindAddress)
{
    int err = bind(mSocket,
        &inBindAddress.mSockAddr, inBindAddress.GetSize());
 
    if (err == 0)
        return NO_ERROR;
 
    SocketUtil::ReportError(L“UDPSocket::Bind”);
    return SocketUtil::GetLastError();
}
 
int UDPSocket::SendTo(
    const void* inData, int inLen,
    const SocketAddress& inTo)
{
    int byteSentCount = sendto(
        mSocket,
        static_cast<const char*>(inData),
        inLen,
        0, &inTo.mSockAddr, into.GetSize());
 
    if (byteSentCount >= 0)
        return byteSentCount;
 
    // 에러 코드를 음수로 리턴함
    SocketUtil::ReportError(L“UDPSocket::SendTo”);
    return -SocketUtil::GetLastError();
}
 
int UDPSocket::ReceiveFrom(
    void* inBuffer, int inLen,
    SocketAddress& outFrom)
{
    int fromLength = outFromAddress.GetSize();
    int readByteCount = recvfrom(
        mSocket,
        static_cast<char*>(inBuffer),
        inMaxLength,
        0, &outFromAddress.mSockAddr,
        &fromLength);
 
    if (readByteCount >= 0)
        return readByteCount;
 
    SocketUtil::ReportError(L“UDPSocket::ReceiveFrom”);
    return -SocketUtil::GetLastError();
}
 
UDPSocket::~UDPSocket()
{
    closesocket(mSocket);
}

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