OSDN Git Service

add b25-remote
[rec10/rec10-git.git] / b25-remote / SmartSock.cpp
diff --git a/b25-remote/SmartSock.cpp b/b25-remote/SmartSock.cpp
new file mode 100755 (executable)
index 0000000..cbf802c
--- /dev/null
@@ -0,0 +1,572 @@
+// SmartSock.cpp: CSmartSock \83N\83\89\83X\82Ì\83C\83\93\83v\83\8a\83\81\83\93\83e\81[\83V\83\87\83\93\r
+//\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+#include "SmartSock.h"\r
+#include <stdio.h>
+#include <sys/time.h>\r
+\r
+#ifdef _DEBUG\r
+#define new DEBUG_NEW\r
+#endif\r
+
+//#pragma warning(disable: 4101) // warning C4101: "\83\8d\81[\83J\83\8b\95Ï\90\94\82Í 1 \93x\82à\8eg\82í\82ê\82Ä\82¢\82Ü\82¹\82ñ\81B"\r
+//#pragma warning(disable: 4996) // warning C4996: "This function or variable may be unsafe. Consider using _wsplitpath_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details"\r
+\r
+\r
+//#pragma comment(lib, "WS2_32")\r
+\r
+\r
+//////////////////////////////////////////////////////////////////////\r
+// \83}\83N\83\8d\92è\8b`\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+#define CHECK_FREESOCK(R)      if(m_Socket != INVALID_SOCKET){m_dwLastError = EC_SOCKINVALID; return (R);}\r
+#define CHECK_TCPSOCK(R)       if((m_Socket == INVALID_SOCKET) || (m_bSockType != SOCKTYPE_TCP)){m_dwLastError = EC_SOCKINVALID; return (R);}\r
+#define CHECK_UDPSOCK(R)       if((m_Socket == INVALID_SOCKET) || (m_bSockType != SOCKTYPE_UDP)){m_dwLastError = EC_SOCKINVALID; return (R);}\r
+\r
+\r
+//////////////////////////////////////////////////////////////////////\r
+// \8d\\92z/\8fÁ\96Å\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+DWORD CSmartSock::dwInstanceNum = 0UL;\r
+\r
+CSmartSock::CSmartSock()\r
+       : m_Socket(INVALID_SOCKET)\r
+       , m_bSockType(SOCKTYPE_NON)\r
+       , m_dwLastError(EC_NOERROR)\r
+{\r
+       // WinSock2\8f\89\8aú\89»\r
+       if(!(dwInstanceNum++))InitWinSock2();\r
+}\r
+\r
+CSmartSock::~CSmartSock()\r
+{\r
+       Close();\r
+\r
+       // WinSock2\8aJ\95ú\r
+       if(!(--dwInstanceNum))FreeWinSock2();\r
+}\r
+\r
+const BOOL CSmartSock::Connect(LPCTSTR lpszHost, const WORD wPort, const DWORD dwTimeOut)\r
+{\r
+       CHECK_FREESOCK(FALSE);\r
+\r
+       if(!lpszHost){\r
+               m_dwLastError = EC_PARAMINVALID;\r
+               return FALSE;\r
+               }\r
+               \r
+       // \83A\83h\83\8c\83X\96¼\82©\82çIP\83A\83h\83\8c\83X\8eæ\93¾\r
+       const DWORD dwIP = HostToIP(lpszHost);\r
+\r
+       if(dwIP == INADDR_NONE){\r
+               m_dwLastError = EC_SOCKERROR;\r
+               return FALSE;           \r
+               }\r
+       \r
+       return Connect(dwIP, wPort, dwTimeOut);\r
+}\r
+\r
+const BOOL CSmartSock::Connect(const DWORD dwIP, const WORD wPort, const DWORD dwTimeOut)\r
+{\r
+       CHECK_FREESOCK(FALSE);\r
+\r
+       // \83\\83P\83b\83g\8dì\90¬\r
+       if((m_Socket = ::socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET){\r
+               m_dwLastError = EC_SOCKERROR;\r
+               return FALSE;           \r
+               }\r
+\r
+       // \83A\83h\83\8c\83X\90Ý\92è\r
+       SOCKADDR_IN SockAddr;\r
+       SockAddr.sin_family = AF_INET;\r
+       SockAddr.sin_port = htons(wPort);\r
+       SockAddr.sin_addr.s_addr = htonl(dwIP);\r
+\r
+       // \93¯\8aú\83R\83l\83N\83g\r
+       if(!dwTimeOut){\r
+               if(::connect(m_Socket, (PSOCKADDR)&SockAddr, sizeof(sockaddr))){\r
+                       Close();\r
+                       m_dwLastError = EC_SOCKERROR;\r
+                       return FALSE;           \r
+                       }\r
+       \r
+               m_dwLastError = EC_NOERROR;\r
+               return TRUE;\r
+       }\r
+\r
+       // \94ñ\93¯\8aú\83R\83l\83N\83g\r
+       u_long nArg;\r
+       fd_set FdSet;\r
+       struct timeval TimeVal;\r
+       TimeVal.tv_sec = 10UL;\r
+       TimeVal.tv_usec = 0UL;
+       nArg = fcntl(m_Socket, F_GETFL, 0);\r
+       FD_ZERO(&FdSet);\r
+       FD_SET(m_Socket, &FdSet);\r
+\r
+       try{\r
+               // \94ñ\93¯\8aú\82É\90Ø\82è\91Ö\82¦\r
+               if(::fcntl(m_Socket, F_SETFL, nArg | O_NONBLOCK) == SOCKET_ERROR)throw (const DWORD)__LINE__;\r
+\r
+               // \83R\83l\83N\83g\r
+               if(::connect(m_Socket, (PSOCKADDR)&SockAddr, sizeof(sockaddr)) != SOCKET_ERROR)throw (const DWORD)__LINE__;\r
+\r
+               if(errno != EAGAIN && errno != EWOULDBLOCK && errno != EINPROGRESS)throw (const DWORD)__LINE__;\r
+\r
+               // \90Ú\91±\8a®\97¹\91Ò\82¿\r
+               if(!::select(32, NULL, &FdSet, NULL, &TimeVal))throw (const DWORD)__LINE__;\r
+\r
+               // \83^\83C\83\80\83A\83E\83g\94»\92è\r
+               if(!FD_ISSET(m_Socket, &FdSet)){\r
+                       Close();\r
+                       m_dwLastError = EC_TIMEOUT;\r
+                       return FALSE;\r
+                       }\r
+\r
+               // \93¯\8aú\82É\90Ø\82è\91Ö\82¦\r
+               if(::fcntl(m_Socket, F_SETFL, nArg) == SOCKET_ERROR)throw (const DWORD)__LINE__;\r
+               }\r
+       catch(const DWORD dwLine){\r
+               // \83G\83\89\81[\94­\90\r
+               Close();\r
+               m_dwLastError = EC_SOCKERROR;\r
+               return FALSE;\r
+               }\r
+\r
+       m_bSockType = SOCKTYPE_TCP;\r
+       m_dwLastError = EC_NOERROR;\r
+\r
+       return TRUE;\r
+}\r
+\r
+const BOOL CSmartSock::Listen(const WORD wPort)\r
+{\r
+       CHECK_FREESOCK(FALSE);\r
+\r
+       // \83\\83P\83b\83g\8dì\90¬\r
+       if((m_Socket = ::socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET){\r
+               m_dwLastError = EC_SOCKERROR;\r
+               return FALSE;           \r
+               }\r
+\r
+       // \83A\83h\83\8c\83X\90Ý\92è\r
+       SOCKADDR_IN SockAddr;\r
+       SockAddr.sin_family = AF_INET;\r
+       SockAddr.sin_port = htons(wPort);\r
+       SockAddr.sin_addr.s_addr = INADDR_ANY;\r
+\r
+       try{\r
+               // \81u\83A\83h\83\8c\83X\8eg\97p\92\86\81v\83G\83\89\81[\82ð\89ñ\94ð
+               int on = 1;
+               setsockopt(m_Socket, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
+
+               // \83o\83C\83\93\83h\r
+               if(::bind(m_Socket, (PSOCKADDR)&SockAddr, sizeof(SockAddr)) == SOCKET_ERROR)throw (const DWORD)__LINE__;\r
+\r
+               // \90Ú\91±\8eó\82¯\93ü\82ê\r
+               if(::listen(m_Socket, 5) == SOCKET_ERROR)throw (const DWORD)__LINE__;\r
+               }\r
+       catch(const DWORD dwLine){\r
+               // \83G\83\89\81[\94­\90\r
+               Close();\r
+               m_dwLastError = EC_SOCKERROR;\r
+               return FALSE;\r
+               }\r
+\r
+       m_bSockType = SOCKTYPE_TCP;\r
+       m_dwLastError = EC_NOERROR;\r
+\r
+       return TRUE;\r
+}\r
+\r
+CSmartSock * CSmartSock::Accept(void)\r
+{\r
+       CHECK_TCPSOCK(FALSE);\r
+       \r
+       SOCKADDR_IN AddrIn;\r
+       memset(&AddrIn, 0, sizeof(AddrIn));\r
+       socklen_t iAddrLen = sizeof(AddrIn);\r
+\r
+       // \83R\83l\83N\83g\8eó\82¯\93ü\82ê\r
+       SOCKET SockIn = ::accept(m_Socket, (sockaddr *)&AddrIn, &iAddrLen);\r
+\r
+       if(SockIn == INVALID_SOCKET){\r
+               Close();\r
+               m_dwLastError = EC_SOCKERROR;\r
+               return NULL;\r
+               }\r
+\r
+       CSmartSock *pNewSock = new CSmartSock;\r
+       pNewSock->m_Socket = SockIn;\r
+       pNewSock->m_bSockType = SOCKTYPE_TCP;\r
+\r
+       m_dwLastError = EC_NOERROR;\r
+\r
+       return pNewSock;\r
+}\r
+\r
+const BOOL CSmartSock::Send(const BYTE *pBuff, const DWORD dwLen, const DWORD dwTimeOut)\r
+{\r
+       CHECK_TCPSOCK(FALSE);\r
+\r
+       if(!pBuff || !dwLen){\r
+               m_dwLastError = EC_PARAMINVALID;\r
+               return FALSE;\r
+               }\r
+\r
+       // \8ew\92è\83T\83C\83Y\91\97\90M\r
+       DWORD dwRef = 0UL, dwSend = 0UL;\r
+\r
+       do{
+               dwRef = SendOnce(pBuff + dwSend, dwLen - dwSend, dwTimeOut);
+               if(!dwRef) return FALSE;\r
+       }\r
+       while((dwSend += dwRef) < dwLen);\r
+\r
+       return TRUE;\r
+}\r
+\r
+const BOOL CSmartSock::Recv(BYTE *pBuff, const DWORD dwLen, const DWORD dwTimeOut)\r
+{\r
+       CHECK_TCPSOCK(FALSE);\r
+\r
+       if(!pBuff || !dwLen){\r
+               m_dwLastError = EC_PARAMINVALID;\r
+               return FALSE;\r
+       }\r
+\r
+       // \8ew\92è\83T\83C\83Y\8eó\90M\r
+       DWORD dwRef = 0UL, dwRecv = 0UL;\r
+
+       do{\r
+               if(!(dwRef = RecvOnce(pBuff + dwRecv, dwLen - dwRecv, dwTimeOut)))return FALSE;\r
+       }\r
+       while((dwRecv += dwRef) < dwLen);
+\r
+       return TRUE;\r
+}\r
+\r
+const DWORD CSmartSock::SendOnce(const BYTE *pBuff, const DWORD dwMaxLen, const DWORD dwTimeOut)\r
+{\r
+       CHECK_TCPSOCK(0UL);\r
+\r
+       if(!pBuff || !dwMaxLen){\r
+               m_dwLastError = EC_PARAMINVALID;\r
+               return FALSE;\r
+               }\r
+       \r
+       // \83^\83C\83\80\83A\83E\83g\90Ý\92è\r
+       struct timeval stTimeOut;\r
+\r
+       stTimeOut.tv_sec = 10UL;
+       stTimeOut.tv_usec = 0UL;\r
+       if(::setsockopt(m_Socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&stTimeOut, sizeof(struct timeval))){\r
+               Close();\r
+               m_dwLastError = EC_SOCKERROR;
+               return 0UL;\r
+       }\r
+
+       // \91\97\90M\r
+       const int iRef = ::send(m_Socket, (const char *)pBuff, dwMaxLen, 0);\r
+\r
+       if((iRef == SOCKET_ERROR) || !iRef){\r
+               if(errno == EAGAIN || errno == EWOULDBLOCK || errno == EINPROGRESS){\r
+                       m_dwLastError = EC_TIMEOUT;\r
+                       return 0UL;\r
+                       }\r
+               else{\r
+                       Close();\r
+                       m_dwLastError = EC_SOCKERROR;\r
+                       return 0UL;\r
+                       }\r
+               }\r
+               \r
+       m_dwLastError = EC_NOERROR;\r
+               \r
+       return (DWORD)iRef;\r
+}\r
+\r
+const DWORD CSmartSock::RecvOnce(BYTE *pBuff, const DWORD dwMaxLen, const DWORD dwTimeOut)\r
+{\r
+       CHECK_TCPSOCK(0UL);\r
+       \r
+       if(!pBuff || !dwMaxLen){\r
+               m_dwLastError = EC_PARAMINVALID;\r
+               return FALSE;\r
+               }\r
+\r
+       // \83^\83C\83\80\83A\83E\83g\92l\90Ý\92è\r
+       struct timeval stTimeOut;\r
+
+       stTimeOut.tv_sec = 10UL;
+       stTimeOut.tv_usec = 0UL;\r
+       if(::setsockopt(m_Socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&stTimeOut, sizeof(struct timeval))){\r
+               Close();\r
+               m_dwLastError = EC_SOCKERROR;
+               return 0UL;\r
+       }\r
+       
+       // \8eó\90M\r
+       int iRef = ::recv(m_Socket, (char *)pBuff, dwMaxLen, 0);\r
+\r
+       if((iRef == SOCKET_ERROR) || !iRef){
+               if(errno == EAGAIN || errno == EWOULDBLOCK || errno == EINPROGRESS){
+                       m_dwLastError = EC_TIMEOUT;\r
+                       return 0UL;\r
+                       }\r
+               else{\r
+                       Close();\r
+                       m_dwLastError = EC_SOCKERROR;\r
+                       return 0UL;\r
+                       }\r
+               }\r
+
+       m_dwLastError = EC_NOERROR;\r
+               \r
+       return (DWORD)iRef;\r
+}\r
+\r
+const BOOL CSmartSock::GetLocalAddr(DWORD *pdwIP, WORD *pwPort)\r
+{\r
+       CHECK_TCPSOCK(FALSE);\r
+\r
+       struct sockaddr_in LocalAddr;\r
+       socklen_t AddrLen = sizeof(LocalAddr);\r
+       \r
+       // \83\8d\81[\83J\83\8b\83A\83h\83\8c\83X\8eæ\93¾\r
+       if(::getsockname(m_Socket, (struct sockaddr *)&LocalAddr, &AddrLen) == SOCKET_ERROR){\r
+               m_dwLastError = EC_SOCKERROR;\r
+               return FALSE;\r
+               }\r
+\r
+       if(pdwIP)*pdwIP = htonl(LocalAddr.sin_addr.s_addr);\r
+       if(pwPort)*pwPort = ntohs(LocalAddr.sin_port);\r
+\r
+       m_dwLastError = EC_NOERROR;\r
+\r
+       return TRUE;\r
+}\r
+\r
+const BOOL CSmartSock::GetPeerAddr(DWORD *pIP, WORD *pPort)\r
+{\r
+       CHECK_TCPSOCK(FALSE);\r
+\r
+       struct sockaddr_in PeerAddr;\r
+       socklen_t AddrLen = sizeof(PeerAddr);\r
+       \r
+       // \83s\83A\83A\83h\83\8c\83X\8eæ\93¾\r
+       if(::getpeername(m_Socket, (struct sockaddr *)&PeerAddr, &AddrLen) == SOCKET_ERROR){\r
+               m_dwLastError = EC_SOCKERROR;\r
+               return FALSE;\r
+               }\r
+\r
+       if(pIP)*pIP = htonl(PeerAddr.sin_addr.s_addr);\r
+       if(pPort)*pPort = ntohs(PeerAddr.sin_port);\r
+\r
+       m_dwLastError = EC_NOERROR;\r
+\r
+       return TRUE;\r
+}\r
+\r
+const BOOL CSmartSock::Bind()\r
+{\r
+       CHECK_FREESOCK(FALSE);\r
+\r
+       // UDP\83\\83P\83b\83g\8dì\90¬\r
+       if((m_Socket = ::socket(PF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET){\r
+               m_dwLastError = EC_SOCKERROR;\r
+               return FALSE;\r
+               }\r
+\r
+       // \83A\83h\83\8c\83X\90Ý\92è\r
+       SOCKADDR_IN SockAddr;\r
+       SockAddr.sin_family = AF_INET;\r
+       SockAddr.sin_port = 0U;\r
+       SockAddr.sin_addr.s_addr = INADDR_ANY;\r
+\r
+       // \83o\83C\83\93\83h\r
+       if(::bind(m_Socket, (struct sockaddr *)&SockAddr, sizeof(SockAddr)) == SOCKET_ERROR){\r
+               Close();\r
+               m_dwLastError = EC_SOCKERROR;\r
+               return FALSE;\r
+               }\r
+\r
+       m_dwLastError = EC_NOERROR;\r
+       m_bSockType = SOCKTYPE_UDP;\r
+       \r
+       return TRUE;\r
+}\r
+\r
+const DWORD CSmartSock::SendTo(const DWORD dwIP, const WORD wPort, const BYTE *pBuff, const DWORD dwLen)\r
+{\r
+       CHECK_UDPSOCK(0UL);\r
+\r
+       if(!pBuff || !dwLen){\r
+               m_dwLastError = EC_PARAMINVALID;\r
+               return 0UL;\r
+               }\r
+\r
+       // \83A\83h\83\8c\83X\90Ý\92è\r
+       SOCKADDR_IN SockAddr;\r
+       SockAddr.sin_family = AF_INET;\r
+       SockAddr.sin_port = htons(wPort);\r
+       SockAddr.sin_addr.s_addr = htonl(dwIP);\r
+\r
+       // \91\97\90M\r
+       int iSend = sendto(m_Socket, (const char *)pBuff, dwLen, 0, (struct sockaddr *)&SockAddr, sizeof(SockAddr));\r
+       \r
+       if(iSend == SOCKET_ERROR){\r
+               m_dwLastError = EC_SOCKERROR;\r
+               return 0UL;\r
+               }\r
+\r
+       m_dwLastError = EC_NOERROR;\r
+\r
+       return (DWORD)iSend;\r
+}\r
+\r
+const DWORD CSmartSock::SendTo(LPCTSTR lpszHost, const WORD wPort, const BYTE *pBuff, const DWORD dwLen)\r
+{\r
+       CHECK_UDPSOCK(0UL);\r
+\r
+       if(!lpszHost || !pBuff || !dwLen){\r
+               m_dwLastError = EC_PARAMINVALID;\r
+               return 0UL;\r
+               }\r
+               \r
+       // \83A\83h\83\8c\83X\96¼\82©\82çIP\83A\83h\83\8c\83X\8eæ\93¾\r
+       const DWORD dwIP = HostToIP(lpszHost);\r
+\r
+       if(dwIP == INADDR_NONE){\r
+               m_dwLastError = EC_SOCKERROR;\r
+               return 0UL;             \r
+               }\r
+       \r
+       return SendTo(dwIP, wPort, pBuff, dwLen);\r
+}\r
+\r
+const DWORD CSmartSock::RecvFrom(BYTE *pBuff, const DWORD dwLen, DWORD *pdwIP, WORD *pwPort)\r
+{\r
+       CHECK_UDPSOCK(0UL);\r
+\r
+       if(!pBuff || !dwLen){\r
+               m_dwLastError = EC_PARAMINVALID;\r
+               return 0UL;\r
+               }\r
+\r
+       // \83A\83h\83\8c\83X\90Ý\92è\r
+       socklen_t iSockSize = sizeof(SOCKADDR_IN);\r
+       SOCKADDR_IN SockAddr;\r
+       SockAddr.sin_family = AF_INET;\r
+       SockAddr.sin_port = 0U;\r
+       SockAddr.sin_addr.s_addr = 0UL;\r
+\r
+       // \8eó\90M\r
+       const int iRecv = ::recvfrom(m_Socket, (char *)pBuff, dwLen, 0, (struct sockaddr *)&SockAddr, &iSockSize);\r
+\r
+       if(iRecv == SOCKET_ERROR){\r
+               m_dwLastError = EC_SOCKERROR;\r
+               return 0UL;\r
+               }\r
+\r
+       if(pdwIP)*pdwIP = SockAddr.sin_addr.s_addr;\r
+       if(pwPort)*pwPort = ntohs(SockAddr.sin_port);\r
+\r
+       m_dwLastError = EC_NOERROR;\r
+\r
+       return (DWORD)iRecv;\r
+}\r
+\r
+const BOOL CSmartSock::Close()\r
+{\r
+       // \83\\83P\83b\83g\83N\83\8d\81[\83Y\r
+       if(m_Socket != INVALID_SOCKET){\r
+               if(m_bSockType == SOCKTYPE_TCP){\r
+                       char byData;\r
+                       ::shutdown(m_Socket, SD_BOTH);\r
+                       while(::recv(m_Socket, &byData, 1, 0) == 1);\r
+                       }\r
+\r
+               ::close(m_Socket);\r
+               m_Socket = INVALID_SOCKET;\r
+               }\r
+       \r
+       m_bSockType = SOCKTYPE_NON;\r
+       m_dwLastError = EC_NOERROR;\r
+       \r
+       return TRUE;\r
+}\r
+\r
+const DWORD CSmartSock::HostToIP(LPCTSTR lpszHost)\r
+{\r
+#ifdef _UNICODE\r
+       char szHost[1024] = {"\0"};\r
+       ::wcstombs(szHost, lpszHost, sizeof(szHost) - 1);\r
+#else\r
+       LPCSTR szHost = lpszHost;\r
+#endif\r
+\r
+       // \83z\83X\83g\96¼\82©\82çIP\83A\83h\83\8c\83X\8eæ\93¾\r
+       const DWORD dwIP = ::inet_addr(szHost);\r
+\r
+       if(dwIP == INADDR_NONE){\r
+               struct hostent *pHost = ::gethostbyname(szHost);\r
+               if(!pHost){             \r
+                       return INADDR_NONE;\r
+                       }\r
+               else return *((DWORD *)pHost->h_addr_list[0]);\r
+               }\r
+       else return htonl(dwIP);\r
+}\r
+\r
+const DWORD CSmartSock::IPToHost(LPTSTR lpszHost, const DWORD dwIP)\r
+{\r
+       if(!lpszHost)return FALSE;\r
+\r
+       // IP\83A\83h\83\8c\83X\82©\82ç\83z\83X\83g\96¼\8eæ\93¾\r
+       const DWORD dwNetIP = htonl(dwIP);\r
+       struct hostent *pHost = ::gethostbyaddr((const char *)&dwNetIP, sizeof(dwNetIP), AF_INET);\r
+       if(!pHost)return FALSE;\r
+\r
+#ifdef _UNICODE\r
+       ::mbstowcs(lpszHost, pHost->h_name, ::lstrlenA(pHost->h_name));\r
+#else\r
+       ::strcpy(lpszHost, pHost->h_name);\r
+#endif\r
+\r
+       return ::strlen(lpszHost);\r
+}\r
+\r
+const DWORD CSmartSock::GetLastError() const\r
+{\r
+       // \8dÅ\8cã\82É\94­\90\82µ\82½\83G\83\89\81[\82ð\95Ô\82·\r
+       return m_dwLastError;\r
+}\r
+\r
+const BOOL CSmartSock::InitWinSock2(void)\r
+{\r
+#ifdef _UNICODE\r
+       ::setlocale(LC_ALL, "japanese");\r
+#endif\r
+/*\r
+       WSADATA WsaData;\r
+\r
+       // WinSock2\8f\89\8aú\89»\r
+       if(::WSAStartup(MAKEWORD(2, 2), &WsaData))return FALSE;\r
+\r
+       if((LOBYTE(WsaData.wVersion) != 2U) || (HIBYTE(WsaData.wVersion) != 2U))return FALSE;\r
+*/\r
+       return TRUE;\r
+}\r
+\r
+const BOOL CSmartSock::FreeWinSock2(void)\r
+{\r
+/*
+       // WinSock2\8aJ\95ú\r
+       return (::WSACleanup())? TRUE : FALSE;\r
+*/
+       return TRUE;
+}\r