-// 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
+// SmartSock.cpp: CSmartSock クラスのインプリメンテーション
+//
+//////////////////////////////////////////////////////////////////////
+
+#include "SmartSock.h"
#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
+#include <sys/time.h>
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#endif
+
+//#pragma warning(disable: 4101) // warning C4101: "ローカル変数は 1 度も使われていません。"
+//#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"
+
+
+//#pragma comment(lib, "WS2_32")
+
+
+//////////////////////////////////////////////////////////////////////
+// マクロ定義
+//////////////////////////////////////////////////////////////////////
+
+#define CHECK_FREESOCK(R) if(m_Socket != INVALID_SOCKET){m_dwLastError = EC_SOCKINVALID; return (R);}
+#define CHECK_TCPSOCK(R) if((m_Socket == INVALID_SOCKET) || (m_bSockType != SOCKTYPE_TCP)){m_dwLastError = EC_SOCKINVALID; return (R);}
+#define CHECK_UDPSOCK(R) if((m_Socket == INVALID_SOCKET) || (m_bSockType != SOCKTYPE_UDP)){m_dwLastError = EC_SOCKINVALID; return (R);}
+
+
+//////////////////////////////////////////////////////////////////////
+// 構築/消滅
+//////////////////////////////////////////////////////////////////////
+
+DWORD CSmartSock::dwInstanceNum = 0UL;
+
+CSmartSock::CSmartSock()
+ : m_Socket(INVALID_SOCKET)
+ , m_bSockType(SOCKTYPE_NON)
+ , m_dwLastError(EC_NOERROR)
+{
+ // WinSock2初期化
+ if(!(dwInstanceNum++))InitWinSock2();
+}
+
+CSmartSock::~CSmartSock()
+{
+ Close();
+
+ // WinSock2開放
+ if(!(--dwInstanceNum))FreeWinSock2();
+}
+
+const BOOL CSmartSock::Connect(LPCTSTR lpszHost, const WORD wPort, const DWORD dwTimeOut)
+{
+ CHECK_FREESOCK(FALSE);
+
+ if(!lpszHost){
+ m_dwLastError = EC_PARAMINVALID;
+ return FALSE;
+ }
+
+ // アドレス名からIPアドレス取得
+ const DWORD dwIP = HostToIP(lpszHost);
+
+ if(dwIP == INADDR_NONE){
+ m_dwLastError = EC_SOCKERROR;
+ return FALSE;
+ }
+
+ return Connect(dwIP, wPort, dwTimeOut);
+}
+
+const BOOL CSmartSock::Connect(const DWORD dwIP, const WORD wPort, const DWORD dwTimeOut)
+{
+ CHECK_FREESOCK(FALSE);
+
+ // ソケット作成
+ if((m_Socket = ::socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET){
+ m_dwLastError = EC_SOCKERROR;
+ return FALSE;
+ }
+
+ // アドレス設定
+ SOCKADDR_IN SockAddr;
+ SockAddr.sin_family = AF_INET;
+ SockAddr.sin_port = htons(wPort);
+ SockAddr.sin_addr.s_addr = htonl(dwIP);
+
+ // 同期コネクト
+ if(!dwTimeOut){
+ if(::connect(m_Socket, (PSOCKADDR)&SockAddr, sizeof(sockaddr))){
+ Close();
+ m_dwLastError = EC_SOCKERROR;
+ return FALSE;
+ }
+
+ m_dwLastError = EC_NOERROR;
+ return TRUE;
+ }
+
+ // 非同期コネクト
+ u_long nArg;
+ fd_set FdSet;
+ struct timeval TimeVal;
+ TimeVal.tv_sec = 10UL;
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ð
+ nArg = fcntl(m_Socket, F_GETFL, 0);
+ FD_ZERO(&FdSet);
+ FD_SET(m_Socket, &FdSet);
+
+ try{
+ // 非同期に切り替え
+ if(::fcntl(m_Socket, F_SETFL, nArg | O_NONBLOCK) == SOCKET_ERROR)throw (const DWORD)__LINE__;
+
+ // コネクト
+ if(::connect(m_Socket, (PSOCKADDR)&SockAddr, sizeof(sockaddr)) != SOCKET_ERROR)throw (const DWORD)__LINE__;
+
+ if(errno != EAGAIN && errno != EWOULDBLOCK && errno != EINPROGRESS)throw (const DWORD)__LINE__;
+
+ // 接続完了待ち
+ if(!::select(32, NULL, &FdSet, NULL, &TimeVal))throw (const DWORD)__LINE__;
+
+ // タイムアウト判定
+ if(!FD_ISSET(m_Socket, &FdSet)){
+ Close();
+ m_dwLastError = EC_TIMEOUT;
+ return FALSE;
+ }
+
+ // 同期に切り替え
+ if(::fcntl(m_Socket, F_SETFL, nArg) == SOCKET_ERROR)throw (const DWORD)__LINE__;
+ }
+ catch(const DWORD dwLine){
+ // エラー発生
+ Close();
+ m_dwLastError = EC_SOCKERROR;
+ return FALSE;
+ }
+
+ m_bSockType = SOCKTYPE_TCP;
+ m_dwLastError = EC_NOERROR;
+
+ return TRUE;
+}
+
+const BOOL CSmartSock::Listen(const WORD wPort)
+{
+ CHECK_FREESOCK(FALSE);
+
+ // ソケット作成
+ if((m_Socket = ::socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET){
+ m_dwLastError = EC_SOCKERROR;
+ return FALSE;
+ }
+
+ // アドレス設定
+ SOCKADDR_IN SockAddr;
+ SockAddr.sin_family = AF_INET;
+ SockAddr.sin_port = htons(wPort);
+ SockAddr.sin_addr.s_addr = INADDR_ANY;
+
+ try{
+ // 「アドレス使用中」エラーを回避
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
+ // バインド
+ if(::bind(m_Socket, (PSOCKADDR)&SockAddr, sizeof(SockAddr)) == SOCKET_ERROR)throw (const DWORD)__LINE__;
+
+ // 接続受け入れ
+ if(::listen(m_Socket, 5) == SOCKET_ERROR)throw (const DWORD)__LINE__;
+ }
+ catch(const DWORD dwLine){
+ // エラー発生
+ Close();
+ m_dwLastError = EC_SOCKERROR;
+ return FALSE;
+ }
+
+ m_bSockType = SOCKTYPE_TCP;
+ m_dwLastError = EC_NOERROR;
+
+ return TRUE;
+}
+
+CSmartSock * CSmartSock::Accept(void)
+{
+ CHECK_TCPSOCK(FALSE);
+
+ SOCKADDR_IN AddrIn;
+ memset(&AddrIn, 0, sizeof(AddrIn));
+ socklen_t iAddrLen = sizeof(AddrIn);
+
+ // コネクト受け入れ
+ SOCKET SockIn = ::accept(m_Socket, (sockaddr *)&AddrIn, &iAddrLen);
+
+ if(SockIn == INVALID_SOCKET){
+ Close();
+ m_dwLastError = EC_SOCKERROR;
+ return NULL;
+ }
+
+ CSmartSock *pNewSock = new CSmartSock;
+ pNewSock->m_Socket = SockIn;
+ pNewSock->m_bSockType = SOCKTYPE_TCP;
+
+ m_dwLastError = EC_NOERROR;
+
+ return pNewSock;
+}
+
+const BOOL CSmartSock::Send(const BYTE *pBuff, const DWORD dwLen, const DWORD dwTimeOut)
+{
+ CHECK_TCPSOCK(FALSE);
+
+ if(!pBuff || !dwLen){
+ m_dwLastError = EC_PARAMINVALID;
+ return FALSE;
+ }
+
+ // 指定サイズ送信
+ DWORD dwRef = 0UL, dwSend = 0UL;
+
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
+ if(!dwRef) return FALSE;
+ }
+ while((dwSend += dwRef) < dwLen);
+
+ return TRUE;
+}
+
+const BOOL CSmartSock::Recv(BYTE *pBuff, const DWORD dwLen, const DWORD dwTimeOut)
+{
+ CHECK_TCPSOCK(FALSE);
+
+ if(!pBuff || !dwLen){
+ m_dwLastError = EC_PARAMINVALID;
+ return FALSE;
+ }
+
+ // 指定サイズ受信
+ DWORD dwRef = 0UL, dwRecv = 0UL;
+
+ do{
+ if(!(dwRef = RecvOnce(pBuff + dwRecv, dwLen - dwRecv, dwTimeOut)))return FALSE;
+ }
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
+
+ return TRUE;
+}
+
+const DWORD CSmartSock::SendOnce(const BYTE *pBuff, const DWORD dwMaxLen, const DWORD dwTimeOut)
+{
+ CHECK_TCPSOCK(0UL);
+
+ if(!pBuff || !dwMaxLen){
+ m_dwLastError = EC_PARAMINVALID;
+ return FALSE;
+ }
+
+ // タイムアウト設定
+ struct timeval stTimeOut;
+
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
+ stTimeOut.tv_usec = 0UL;
+ if(::setsockopt(m_Socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&stTimeOut, sizeof(struct timeval))){
+ Close();
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
+ return 0UL;
+ }
+
+ // 送信
+ const int iRef = ::send(m_Socket, (const char *)pBuff, dwMaxLen, 0);
+
+ if((iRef == SOCKET_ERROR) || !iRef){
+ if(errno == EAGAIN || errno == EWOULDBLOCK || errno == EINPROGRESS){
+ m_dwLastError = EC_TIMEOUT;
+ return 0UL;
+ }
+ else{
+ Close();
+ m_dwLastError = EC_SOCKERROR;
+ return 0UL;
+ }
+ }
+
+ m_dwLastError = EC_NOERROR;
+
+ return (DWORD)iRef;
+}
+
+const DWORD CSmartSock::RecvOnce(BYTE *pBuff, const DWORD dwMaxLen, const DWORD dwTimeOut)
+{
+ CHECK_TCPSOCK(0UL);
+
+ if(!pBuff || !dwMaxLen){
+ m_dwLastError = EC_PARAMINVALID;
+ return FALSE;
+ }
+
+ // タイムアウト値設定
+ struct timeval stTimeOut;
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
+ stTimeOut.tv_usec = 0UL;
+ if(::setsockopt(m_Socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&stTimeOut, sizeof(struct timeval))){
+ Close();
m_dwLastError = EC_SOCKERROR;
- return 0UL;\r
- }\r
+ return 0UL;
+ }
- // \8eó\90M\r
- int iRef = ::recv(m_Socket, (char *)pBuff, dwMaxLen, 0);\r
-\r
- if((iRef == SOCKET_ERROR) || !iRef){
+ // 受信
+ int iRef = ::recv(m_Socket, (char *)pBuff, dwMaxLen, 0);
+
+ if ( !iRef ) {
+ Close();
+ m_dwLastError = EC_SOCKERROR;
+ return 0UL;
+ }
+
+ if( iRef == SOCKET_ERROR ){
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
+ m_dwLastError = EC_TIMEOUT;
+ return 0UL;
+ }
+ else{
+ Close();
+ m_dwLastError = EC_SOCKERROR;
+ return 0UL;
+ }
+ }
+
+ m_dwLastError = EC_NOERROR;
+
+ return (DWORD)iRef;
+}
+
+const BOOL CSmartSock::GetLocalAddr(DWORD *pdwIP, WORD *pwPort)
+{
+ CHECK_TCPSOCK(FALSE);
+
+ struct sockaddr_in LocalAddr;
+ socklen_t AddrLen = sizeof(LocalAddr);
+
+ // ローカルアドレス取得
+ if(::getsockname(m_Socket, (struct sockaddr *)&LocalAddr, &AddrLen) == SOCKET_ERROR){
+ m_dwLastError = EC_SOCKERROR;
+ return FALSE;
+ }
+
+ if(pdwIP)*pdwIP = htonl(LocalAddr.sin_addr.s_addr);
+ if(pwPort)*pwPort = ntohs(LocalAddr.sin_port);
+
+ m_dwLastError = EC_NOERROR;
+
+ return TRUE;
+}
+
+const BOOL CSmartSock::GetPeerAddr(DWORD *pIP, WORD *pPort)
+{
+ CHECK_TCPSOCK(FALSE);
+
+ struct sockaddr_in PeerAddr;
+ socklen_t AddrLen = sizeof(PeerAddr);
+
+ // ピアアドレス取得
+ if(::getpeername(m_Socket, (struct sockaddr *)&PeerAddr, &AddrLen) == SOCKET_ERROR){
+ m_dwLastError = EC_SOCKERROR;
+ return FALSE;
+ }
+
+ if(pIP)*pIP = htonl(PeerAddr.sin_addr.s_addr);
+ if(pPort)*pPort = ntohs(PeerAddr.sin_port);
+
+ m_dwLastError = EC_NOERROR;
+
+ return TRUE;
+}
+
+const BOOL CSmartSock::Bind()
+{
+ CHECK_FREESOCK(FALSE);
+
+ // UDPソケット作成
+ if((m_Socket = ::socket(PF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET){
+ m_dwLastError = EC_SOCKERROR;
+ return FALSE;
+ }
+
+ // アドレス設定
+ SOCKADDR_IN SockAddr;
+ SockAddr.sin_family = AF_INET;
+ SockAddr.sin_port = 0U;
+ SockAddr.sin_addr.s_addr = INADDR_ANY;
+
+ // バインド
+ if(::bind(m_Socket, (struct sockaddr *)&SockAddr, sizeof(SockAddr)) == SOCKET_ERROR){
+ Close();
+ m_dwLastError = EC_SOCKERROR;
+ return FALSE;
+ }
+
+ m_dwLastError = EC_NOERROR;
+ m_bSockType = SOCKTYPE_UDP;
+
+ return TRUE;
+}
+
+const DWORD CSmartSock::SendTo(const DWORD dwIP, const WORD wPort, const BYTE *pBuff, const DWORD dwLen)
+{
+ CHECK_UDPSOCK(0UL);
+
+ if(!pBuff || !dwLen){
+ m_dwLastError = EC_PARAMINVALID;
+ return 0UL;
+ }
+
+ // アドレス設定
+ SOCKADDR_IN SockAddr;
+ SockAddr.sin_family = AF_INET;
+ SockAddr.sin_port = htons(wPort);
+ SockAddr.sin_addr.s_addr = htonl(dwIP);
+
+ // 送信
+ int iSend = sendto(m_Socket, (const char *)pBuff, dwLen, 0, (struct sockaddr *)&SockAddr, sizeof(SockAddr));
+
+ if(iSend == SOCKET_ERROR){
+ m_dwLastError = EC_SOCKERROR;
+ return 0UL;
+ }
+
+ m_dwLastError = EC_NOERROR;
+
+ return (DWORD)iSend;
+}
+
+const DWORD CSmartSock::SendTo(LPCTSTR lpszHost, const WORD wPort, const BYTE *pBuff, const DWORD dwLen)
+{
+ CHECK_UDPSOCK(0UL);
+
+ if(!lpszHost || !pBuff || !dwLen){
+ m_dwLastError = EC_PARAMINVALID;
+ return 0UL;
+ }
+
+ // アドレス名からIPアドレス取得
+ const DWORD dwIP = HostToIP(lpszHost);
+
+ if(dwIP == INADDR_NONE){
+ m_dwLastError = EC_SOCKERROR;
+ return 0UL;
+ }
+
+ return SendTo(dwIP, wPort, pBuff, dwLen);
+}
+
+const DWORD CSmartSock::RecvFrom(BYTE *pBuff, const DWORD dwLen, DWORD *pdwIP, WORD *pwPort)
+{
+ CHECK_UDPSOCK(0UL);
+
+ if(!pBuff || !dwLen){
+ m_dwLastError = EC_PARAMINVALID;
+ return 0UL;
+ }
+
+ // アドレス設定
+ socklen_t iSockSize = sizeof(SOCKADDR_IN);
+ SOCKADDR_IN SockAddr;
+ SockAddr.sin_family = AF_INET;
+ SockAddr.sin_port = 0U;
+ SockAddr.sin_addr.s_addr = 0UL;
+
+ // 受信
+ const int iRecv = ::recvfrom(m_Socket, (char *)pBuff, dwLen, 0, (struct sockaddr *)&SockAddr, &iSockSize);
+
+ if(iRecv == SOCKET_ERROR){
+ m_dwLastError = EC_SOCKERROR;
+ return 0UL;
+ }
+
+ if(pdwIP)*pdwIP = SockAddr.sin_addr.s_addr;
+ if(pwPort)*pwPort = ntohs(SockAddr.sin_port);
+
+ m_dwLastError = EC_NOERROR;
+
+ return (DWORD)iRecv;
+}
+
+const BOOL CSmartSock::Close()
+{
+ // ソケットクローズ
+ if(m_Socket != INVALID_SOCKET){
+ if(m_bSockType == SOCKTYPE_TCP){
+ char byData;
+ ::shutdown(m_Socket, SD_BOTH);
+ while(::recv(m_Socket, &byData, 1, 0) == 1);
+ }
+
+ ::close(m_Socket);
+ m_Socket = INVALID_SOCKET;
+ }
+
+ m_bSockType = SOCKTYPE_NON;
+ m_dwLastError = EC_NOERROR;
+
+ return TRUE;
+}
+
+const DWORD CSmartSock::HostToIP(LPCTSTR lpszHost)
+{
+#ifdef _UNICODE
+ char szHost[1024] = {"\0"};
+ ::wcstombs(szHost, lpszHost, sizeof(szHost) - 1);
+#else
+ LPCSTR szHost = lpszHost;
+#endif
+
+ // ホスト名からIPアドレス取得
+ const DWORD dwIP = ::inet_addr(szHost);
+
+ if(dwIP == INADDR_NONE){
+ struct hostent *pHost = ::gethostbyname(szHost);
+ if(!pHost){
+ return INADDR_NONE;
+ }
+ else return *((DWORD *)pHost->h_addr_list[0]);
+ }
+ else return htonl(dwIP);
+}
+
+const DWORD CSmartSock::IPToHost(LPTSTR lpszHost, const DWORD dwIP)
+{
+ if(!lpszHost)return FALSE;
+
+ // IPアドレスからホスト名取得
+ const DWORD dwNetIP = htonl(dwIP);
+ struct hostent *pHost = ::gethostbyaddr((const char *)&dwNetIP, sizeof(dwNetIP), AF_INET);
+ if(!pHost)return FALSE;
+
+#ifdef _UNICODE
+ ::mbstowcs(lpszHost, pHost->h_name, ::lstrlenA(pHost->h_name));
+#else
+ ::strcpy(lpszHost, pHost->h_name);
+#endif
+
+ return ::strlen(lpszHost);
+}
+
+const DWORD CSmartSock::GetLastError() const
+{
+ // 最後に発生したエラーを返す
+ return m_dwLastError;
+}
+
+const BOOL CSmartSock::InitWinSock2(void)
+{
+#ifdef _UNICODE
+ ::setlocale(LC_ALL, "japanese");
+#endif
+/*
+ WSADATA WsaData;
+
+ // WinSock2初期化
+ if(::WSAStartup(MAKEWORD(2, 2), &WsaData))return FALSE;
+
+ if((LOBYTE(WsaData.wVersion) != 2U) || (HIBYTE(WsaData.wVersion) != 2U))return FALSE;
+*/
+ return TRUE;
+}
+
+const BOOL CSmartSock::FreeWinSock2(void)
+{
/*
- // WinSock2\8aJ\95ú\r
- return (::WSACleanup())? TRUE : FALSE;\r
+ // WinSock2開放
+ return (::WSACleanup())? TRUE : FALSE;
*/
return TRUE;
-}\r
+}