332 lines
9.6 KiB
C++
332 lines
9.6 KiB
C++
|
|
/*//===============================================================
|
|||
|
|
|
|||
|
|
<< WINSOCK BASE >>
|
|||
|
|
|
|||
|
|
PRGM : B4nFter
|
|||
|
|
|
|||
|
|
FILE : WINSOCKBASE.HPP
|
|||
|
|
DESC : <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>⺻ Ŭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
INIT BUILT DATE : 2005. 04. 28
|
|||
|
|
LAST BUILT DATE : 2005. 04. 28
|
|||
|
|
|
|||
|
|
Copyright<EFBFBD><EFBFBD> 2002~2009 B4nFter (b4nfter@gmail.com) and Co-Writers. All Rights Reserved.
|
|||
|
|
|
|||
|
|
*///===============================================================
|
|||
|
|
|
|||
|
|
|
|||
|
|
#pragma once
|
|||
|
|
|
|||
|
|
|
|||
|
|
///////////////////////////////////////////////////////////////////
|
|||
|
|
// INCLUDE
|
|||
|
|
///////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
#include "ERRORFORMAT.H"
|
|||
|
|
#include "SYSBASEBASE.H"
|
|||
|
|
#include "IPV4.HPP"
|
|||
|
|
#include <LIST>
|
|||
|
|
|
|||
|
|
|
|||
|
|
///////////////////////////////////////////////////////////////////
|
|||
|
|
// DEFINE
|
|||
|
|
///////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
|
|||
|
|
///////////////////////////////////////////////////////////////////
|
|||
|
|
// DECLARATION
|
|||
|
|
///////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// TYPE : CLASS
|
|||
|
|
// NAME : CWinsockBase
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// DESC : Winsock Base Socket Class
|
|||
|
|
// PRGM : B4nFter
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
class CWinsockBase
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
public:
|
|||
|
|
static enum {
|
|||
|
|
EV_ERROR_NONE, // <20><><EFBFBD><EFBFBD> - none
|
|||
|
|
EV_ERROR_SYSTEM, // <20><><EFBFBD><EFBFBD> - system
|
|||
|
|
EV_ERROR_LOGIC // <20><><EFBFBD><EFBFBD> - logic
|
|||
|
|
};
|
|||
|
|
typedef std::list<std::string> TP_IPLIST;
|
|||
|
|
typedef TP_IPLIST::iterator TP_IPLIST_ITR;
|
|||
|
|
|
|||
|
|
public:
|
|||
|
|
inline CWinsockBase();
|
|||
|
|
inline virtual ~CWinsockBase(); // P.S.> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (*.h, *.cpp <20><> <20>и<EFBFBD> <20>ʿ<EFBFBD>)
|
|||
|
|
|
|||
|
|
INT GetErrorCode() { return m_ErrorFormat.GetErrorCode(); }
|
|||
|
|
|
|||
|
|
inline static BOOL GetPhysicalAddress(LPBYTE lpbtPhysicalAddress);
|
|||
|
|
inline static BOOL GetHostByName(LPCSTR lpszHostName, ULONG& uIpAddress);
|
|||
|
|
inline static INT GetLocalIpAddressList(TP_IPLIST& pLocalIpAddressList);
|
|||
|
|
|
|||
|
|
inline static INT GetSockOpt(SOCKET pSocket, INT pLevel, INT pOptName, PCHAR pOptVal, PINT pOptLen);
|
|||
|
|
inline static INT SetSockOpt(SOCKET pSocket, INT pLevel, INT pOptName, PCHAR pOptVal, INT pOptLen);
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
inline BOOL Initialize();
|
|||
|
|
inline VOID Finalize();
|
|||
|
|
|
|||
|
|
protected:
|
|||
|
|
SOCKADDR_IN m_stSockAddr;
|
|||
|
|
WSADATA m_stWsaData;
|
|||
|
|
CErrorFormat m_ErrorFormat;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
///////////////////////////////////////////////////////////////////
|
|||
|
|
// IMPLEMENTATION
|
|||
|
|
///////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// TYPE : FUNCTION
|
|||
|
|
// NAME : CWinsockBase::CWinsockBase
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// PARM : N/A
|
|||
|
|
// RETV : N/A
|
|||
|
|
// PRGM : B4nFter
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
CWinsockBase::CWinsockBase()
|
|||
|
|
{
|
|||
|
|
Initialize();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// TYPE : FUNCTION
|
|||
|
|
// NAME : CWinsockBase::~CWinsockBase
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// DESC : <20>Ҹ<EFBFBD><D2B8><EFBFBD>
|
|||
|
|
// PARM : N/A
|
|||
|
|
// RETV : N/A
|
|||
|
|
// PRGM : B4nFter
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
CWinsockBase::~CWinsockBase()
|
|||
|
|
{
|
|||
|
|
Finalize();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// TYPE : FUNCTION
|
|||
|
|
// NAME : CWinsockBase::Initialize
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// DESC : <20><>ü <20><><EFBFBD><EFBFBD> <20>ڿ<EFBFBD><DABF><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ
|
|||
|
|
// PARM : N/A
|
|||
|
|
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><EFBFBD><EFBFBD>
|
|||
|
|
// PRGM : B4nFter
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
BOOL CWinsockBase::Initialize()
|
|||
|
|
{
|
|||
|
|
INT iErrNo = 0;
|
|||
|
|
iErrNo = ::WSAStartup(MAKEWORD(2,2), & m_stWsaData);
|
|||
|
|
|
|||
|
|
if (iErrNo) {
|
|||
|
|
switch (iErrNo) {
|
|||
|
|
case WSASYSNOTREADY :
|
|||
|
|
case WSAVERNOTSUPPORTED :
|
|||
|
|
case WSAEINPROGRESS :
|
|||
|
|
case WSAEPROCLIM :
|
|||
|
|
case WSAEFAULT :
|
|||
|
|
{
|
|||
|
|
TCHAR szText[128] = { _T('\0'), };
|
|||
|
|
SNPRINTF(MODE_DBG_EX(szText, COUNT_OF(szText)), COUNT_OF(szText), _T("CWinsockBase::Initialize() - WSAStartup() error : %d"), iErrNo);
|
|||
|
|
m_ErrorFormat.Write(szText);
|
|||
|
|
return FALSE;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return TRUE;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// TYPE : FUNCTION
|
|||
|
|
// NAME : CWinsockBase::Finalize
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// DESC : <20><>ü <20><><EFBFBD><EFBFBD> <20>ڿ<EFBFBD><DABF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
// PARM : N/A
|
|||
|
|
// RETV : N/A
|
|||
|
|
// PRGM : B4nFter
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
VOID CWinsockBase::Finalize()
|
|||
|
|
{
|
|||
|
|
::WSACleanup();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// TYPE : FUNCTION
|
|||
|
|
// NAME : CWinsockBase::GetPhysicalAddress
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// DESC : ȣ<><C8A3>Ʈ<EFBFBD><C6AE> <20><>Ʈ<EFBFBD><C6AE>ũ <20><><EFBFBD><EFBFBD><EFBFBD>ּ<EFBFBD> (MAC) <20><> <20><><EFBFBD><EFBFBD>
|
|||
|
|
// PARM : 1 . lpbtPhysicalAddress - ȣ<><C8A3>Ʈ<EFBFBD><C6AE> <20><>Ʈ<EFBFBD><C6AE>ũ <20><><EFBFBD><EFBFBD><EFBFBD>ּ<EFBFBD> (MAC) <20><> <20><><EFBFBD><EFBFBD> BYTE<54>迭<EFBFBD><E8BFAD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD>!!> . <20>ּ<EFBFBD> 6<><36><EFBFBD><EFBFBD>Ʈ <20>̻<EFBFBD>)
|
|||
|
|
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><EFBFBD><EFBFBD>
|
|||
|
|
// PRGM : B4nFter
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
BOOL CWinsockBase::GetPhysicalAddress(LPBYTE lpbtPhysicalAddress)
|
|||
|
|
{
|
|||
|
|
UUID stUuid;
|
|||
|
|
INT iRetVal = ::UuidCreateSequential(&stUuid); // Ask OS to create UUID
|
|||
|
|
if (iRetVal != RPC_S_OK) {
|
|||
|
|
BASE_TRACE(_T("iRetVal != RPC_S_OK : %d - CWinsockBase::GetPhysicalAddress()"), iRetVal);
|
|||
|
|
return FALSE;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for (INT iCount = 2 ; iCount<8 ; ++iCount) {
|
|||
|
|
// UUID <20><> <20><><EFBFBD><EFBFBD> Data4 <20><> 2 ~ 7 <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD>̰<EFBFBD> MAC <20>ּ<EFBFBD><D6BC>̴<EFBFBD>.
|
|||
|
|
lpbtPhysicalAddress[iCount-2] = stUuid.Data4[iCount];
|
|||
|
|
}
|
|||
|
|
return TRUE;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// TYPE : FUNCTION
|
|||
|
|
// NAME : CWinsockBase::GetHostByName
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// DESC : IP <20≯<EFBFBD><CCB8><EFBFBD> dotted decimal <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD> domain name <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IP4 <20>ּҷ<D6BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
|
|||
|
|
// PARM : 1 . lpszHostName - domain name <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȣ<><C8A3>Ʈ <20>ּ<EFBFBD>
|
|||
|
|
// 2 . uIpAddress - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IP4 ȣ<><C8A3>Ʈ <20>ּҸ<D6BC> <20><>ȯ<EFBFBD><C8AF> <20><><EFBFBD><EFBFBD>
|
|||
|
|
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><EFBFBD><EFBFBD>
|
|||
|
|
// PRGM : B4nFter
|
|||
|
|
/* EXAM :
|
|||
|
|
SOCKADDR_IN stSockAddr;
|
|||
|
|
...
|
|||
|
|
...
|
|||
|
|
stSockAddr.sin_addr.s_addr = ::inet_addr(ipszAddress);
|
|||
|
|
if (INADDR_NONE == stSockAddr.sin_addr.s_addr) {
|
|||
|
|
if (TRUE == CWinsockBase::GetHostByName(ipszAddress, stSockAddr.sin_addr.s_addr)) {
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
// <20><><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
*/
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
BOOL CWinsockBase::GetHostByName(LPCSTR lpszHostName, ULONG& uIpAddress)
|
|||
|
|
{
|
|||
|
|
LPHOSTENT lpstHostent;
|
|||
|
|
lpstHostent = ::gethostbyname(lpszHostName);
|
|||
|
|
if (lpstHostent) {
|
|||
|
|
uIpAddress = ((LPIN_ADDR)lpstHostent->h_addr)->s_addr;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
return FALSE;
|
|||
|
|
}
|
|||
|
|
return TRUE;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// TYPE : FUNCTION
|
|||
|
|
// NAME : CWinsockBase::GetLocalIpAddressList
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// DESC : <20><><EFBFBD><EFBFBD>ȣ<EFBFBD><C8A3>Ʈ<EFBFBD><C6AE> IP<49>ּ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD>
|
|||
|
|
// PARM : 1 . pLocalIpAddressList - IP<49>ּ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƿ<DEBE> <20><><EFBFBD><EFBFBD>Ʈ <20><>ü
|
|||
|
|
// RETV : <20><><EFBFBD><EFBFBD>ȣ<EFBFBD><C8A3>Ʈ<EFBFBD><C6AE> IP<49>ּ<EFBFBD><D6BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȯ
|
|||
|
|
// PRGM : B4nFter
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
INT CWinsockBase::GetLocalIpAddressList(TP_IPLIST& pLocalIpAddressList)
|
|||
|
|
{
|
|||
|
|
CHAR szHostName[128];
|
|||
|
|
::gethostname(szHostName, sizeof(szHostName));
|
|||
|
|
|
|||
|
|
LPHOSTENT lpstHostent = ::gethostbyname(szHostName); // !!! <20><><EFBFBD>ܹ<DCB9> - 0x000006C5 (1733) <20>±װ<C2B1> Ʋ<><C6B2><EFBFBD>ϴ<EFBFBD>.
|
|||
|
|
if (!lpstHostent) {
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
LPIN_ADDR lpstInAddr;
|
|||
|
|
std::string stTempIpAddress;
|
|||
|
|
switch (lpstHostent->h_addrtype) {
|
|||
|
|
case AF_INET :
|
|||
|
|
while(NULL != (lpstInAddr = ((LPIN_ADDR)*lpstHostent->h_addr_list++))) {
|
|||
|
|
stTempIpAddress = ::inet_ntoa(*lpstInAddr);
|
|||
|
|
pLocalIpAddressList.push_back(stTempIpAddress);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return (INT)pLocalIpAddressList.size();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// TYPE : FUNCTION
|
|||
|
|
// NAME : CSessionBase::GetSockOpt
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// DESC : <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD> Ư<><C6AF> <20>ɼ<EFBFBD><C9BC><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
// PARM : 1 . pSocket - <20>ɼ<EFBFBD><C9BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
// 2 . pLevel - <20><><EFBFBD><EFBFBD> <20>ɼ<EFBFBD><C9BC><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD>
|
|||
|
|
/*
|
|||
|
|
IPPROTO_IP
|
|||
|
|
IPPROTO_IPV6
|
|||
|
|
IPPROTO_TCP
|
|||
|
|
IPPROTO_UDP
|
|||
|
|
SOL_SOCKET
|
|||
|
|
SOL_IRLMP
|
|||
|
|
*/
|
|||
|
|
// 3 . pOptName - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ɼ<EFBFBD><C9BC><EFBFBD> <20≯<EFBFBD> (pLevel <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٸ<EFBFBD><D9B8>Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD>)
|
|||
|
|
// 4 . pOptVal - <20><>û<EFBFBD><C3BB> <20>ɼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
// 5 . pOptLen - <20><>û<EFBFBD><C3BB> <20>ɼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<><C5A9>
|
|||
|
|
// RETV : NOERROR - <20><><EFBFBD><EFBFBD> / <20><EFBFBD> - <20><><EFBFBD><EFBFBD> (::WSAGetLastError() <20><>)
|
|||
|
|
// PRGM : B4nFter
|
|||
|
|
// P.S.>
|
|||
|
|
// - <20>Ʒ<EFBFBD> MSDN URL <20><><EFBFBD><EFBFBD> getsockopt() <20>ɼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
|
|||
|
|
// http://msdn.microsoft.com/en-us/library/ms738544.aspx
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
INT CWinsockBase::GetSockOpt(SOCKET pSocket, INT pLevel, INT pOptName, PCHAR pOptVal, PINT pOptLen)
|
|||
|
|
{
|
|||
|
|
INT iRetVal = ::getsockopt(pSocket, pLevel, pOptName, pOptVal, pOptLen);
|
|||
|
|
if (SOCKET_ERROR == iRetVal) {
|
|||
|
|
BASE_RETURN(::WSAGetLastError());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return NOERROR;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// TYPE : FUNCTION
|
|||
|
|
// NAME : CSessionBase::SetSockOpt
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// DESC : <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD> Ư<><C6AF> <20>ɼ<EFBFBD><C9BC><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
// PARM : 1 . pSocket - <20>ɼ<EFBFBD><C9BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
// 2 . pLevel - <20><><EFBFBD><EFBFBD> <20>ɼ<EFBFBD><C9BC><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD>
|
|||
|
|
/*
|
|||
|
|
IPPROTO_IP
|
|||
|
|
IPPROTO_IPV6
|
|||
|
|
IPPROTO_TCP
|
|||
|
|
IPPROTO_UDP
|
|||
|
|
SOL_SOCKET
|
|||
|
|
SOL_IRLMP
|
|||
|
|
*/
|
|||
|
|
// 3 . pOptName - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ɼ<EFBFBD><C9BC><EFBFBD> <20≯<EFBFBD> (pLevel <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٸ<EFBFBD><D9B8>Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD>)
|
|||
|
|
// 4 . pOptVal - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD>
|
|||
|
|
// 5 . pOptLen - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<><C5A9>
|
|||
|
|
// RETV : NOERROR - <20><><EFBFBD><EFBFBD> / <20><EFBFBD> - <20><><EFBFBD><EFBFBD> (::WSAGetLastError() <20><>)
|
|||
|
|
// PRGM : B4nFter
|
|||
|
|
// P.S.>
|
|||
|
|
// - <20>Ʒ<EFBFBD> MSDN URL <20><><EFBFBD><EFBFBD> setsockopt() <20>ɼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
|
|||
|
|
// http://msdn.microsoft.com/en-us/library/ms740476.aspx
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
INT CWinsockBase::SetSockOpt(SOCKET pSocket, INT pLevel, INT pOptName, PCHAR pOptVal, INT pOptLen)
|
|||
|
|
{
|
|||
|
|
INT iRetVal = ::setsockopt(pSocket, pLevel, pOptName, pOptVal, pOptLen);
|
|||
|
|
if (SOCKET_ERROR == iRetVal) {
|
|||
|
|
BASE_RETURN(::WSAGetLastError());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return NOERROR;
|
|||
|
|
}
|
|||
|
|
|