--- /dev/null
+// 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