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