IpSocket.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:10k
源码类别:

模拟服务器

开发平台:

C/C++

  1. ////////////////////////////////////////////////////////////////////////////////
  2. //  
  3. //  FileName    :   IpSocket.h
  4. //  Version     :   1.0
  5. //  Creater     :   Linsuyi
  6. //  Date        :   2002-01-16  16:41:53
  7. //  Comment     :   Tcp/ip socket class for internet source file
  8. //  
  9. ////////////////////////////////////////////////////////////////////////////////
  10. #include "Stdafx.h"
  11. #include "IpSocket.h"
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. CIPSocket::CIPSocket()
  16. {
  17.     m_nSckType  = SOCK_UNKNOWN;
  18.     m_nSckProto = IPPROTO_IP;
  19.     
  20.     m_nSckFlags  = 0;
  21.     m_hSckHandle = INVALID_SOCKET;
  22.     
  23.     m_nBlockMode = true;
  24.     
  25.     m_nLastError = 0;
  26. }
  27. CIPSocket::~CIPSocket()
  28. {
  29. }
  30. int CIPSocket::Create()
  31. {
  32.     if (m_hSckHandle != INVALID_SOCKET)
  33.     {
  34.         ASSERT(FALSE);
  35.         return false;
  36.     }
  37.     
  38.     m_hSckHandle = ::socket(AF_INET, m_nSckType, m_nSckProto);
  39.     if (INVALID_SOCKET == m_hSckHandle)
  40.     {
  41.         ASSERT(FALSE);
  42.         return false;
  43.     }
  44.     
  45.     if (!m_nBlockMode)
  46.     {
  47.         int nRetCode = 0;
  48.         int nIsNonBlock = !m_nBlockMode;
  49.         
  50.         nRetCode = ::ioctlsocket(m_hSckHandle, FIONBIO, (ULONG *)&nIsNonBlock);
  51.         ASSERT(0 == nRetCode);
  52.         
  53.         if (nRetCode != 0)
  54.             m_nBlockMode = true;
  55.     }
  56.     
  57.     return true;
  58. }
  59. void CIPSocket::Destroy()
  60. {
  61.     int nRetCode = false;
  62.     
  63.     if (m_hSckHandle != INVALID_SOCKET)
  64.     {
  65.         nRetCode = ::closesocket(m_hSckHandle);
  66.         m_hSckHandle = INVALID_SOCKET;
  67.     }
  68. }
  69. int CIPSocket::ShutDown(int nModeHow)
  70. {
  71.     int nResult = false;
  72.     int nRetCode = 0;
  73.     
  74.     if (INVALID_SOCKET == m_hSckHandle)
  75.         goto Exit0;
  76.     
  77.     nRetCode = ::shutdown(m_hSckHandle, nModeHow);
  78.     nResult = CheckError(nRetCode);
  79.     
  80. Exit0:
  81.     return nResult;
  82. }
  83. int CIPSocket::Attach(HSOCKET hInetSocket)
  84. {
  85.     Destroy();
  86.     
  87.     m_hSckHandle = hInetSocket;
  88.     return true;
  89. }
  90. HSOCKET CIPSocket::Detach()
  91. {
  92.     HSOCKET hSckReturn = m_hSckHandle;
  93.     
  94.     m_hSckHandle = INVALID_SOCKET;
  95.     return hSckReturn;
  96. }
  97. HSOCKET CIPSocket::GetSafeHandle()
  98. {
  99.     ASSERT_POINTER(this, CIPSocket);
  100.     
  101.     return ((this != NULL) ? m_hSckHandle : INVALID_SOCKET);
  102. }
  103. void CIPSocket::OnSendHandler(int nBufSize, const unsigned char *pbySendBuf)
  104. {
  105.     return;
  106. }
  107. void CIPSocket::OnReceiveHandler(int nBufSize, const unsigned char *pbyReceiveBuf)
  108. {
  109.     return;
  110. }
  111. void CIPSocket::OnErrorHandler()
  112. {
  113.     return;
  114. }
  115. int CIPSocket::GetLastError()
  116. {
  117.     return m_nLastError;
  118. }
  119. int CIPSocket::SetLastError(int nErrorNum)
  120. {
  121.     m_nLastError = nErrorNum;
  122.     return m_nLastError;
  123. }
  124. int CIPSocket::SetBlockMode(int nIsBlock)
  125. {
  126.     int nResult = 0;
  127.     int nRetCode = 0;
  128.     
  129.     if (!nIsBlock != !m_nBlockMode)
  130.     {
  131.         if (INVALID_SOCKET == m_hSckHandle)
  132.             m_nBlockMode = (nIsBlock != 0);
  133.         else
  134.         {
  135.             int nIsNonBlock = !nIsBlock;
  136.             
  137.             nRetCode = ::ioctlsocket(m_hSckHandle, FIONBIO, (ULONG *)&nIsNonBlock);
  138.             
  139.             nResult = CheckError(nRetCode);
  140.             if (0 == nResult)
  141.             {
  142.                 m_nBlockMode = !nIsNonBlock;
  143.             }
  144.         }
  145.     }
  146.     
  147.     return nResult;
  148. }
  149. int CIPSocket::GetSocketAddress(const char *pcszAddr, INET_ADDRESS *pSocketAddr)
  150. {
  151.     int nResult = false;
  152.     ULONG ulAddrIp = inet_addr(pcszAddr);
  153.     
  154.     ASSERT_POINTER(pSocketAddr, INET_ADDRESS);
  155.     
  156.     if (INADDR_NONE == ulAddrIp)
  157.     {
  158.         HOSTENT *pHostEnt = NULL;
  159.         
  160.         pHostEnt = gethostbyname(pcszAddr);
  161.         if (NULL == pHostEnt)
  162.             goto Exit0;
  163.         
  164.         ulAddrIp = (*(ULONG *)(pHostEnt->h_addr));
  165.     }
  166.     
  167.     pSocketAddr->sin_family = AF_INET;
  168.     pSocketAddr->sin_port   = 0;
  169.     pSocketAddr->sin_addr.s_addr = ulAddrIp;
  170.     
  171.     nResult = true;
  172.     
  173. Exit0:
  174.     return nResult;
  175. }
  176.     
  177. int CIPSocket::GetLocalAddress(HSOCKET hInetSocket, INET_ADDRESS *psaAddrLocal)
  178. {
  179.     int nResult = false;
  180.     int nAddrLength = sizeof(INET_ADDRESS);
  181.     
  182.     ASSERT_POINTER(psaAddrLocal, INET_ADDRESS);
  183.     
  184.     nResult = ::getsockname(
  185.         hInetSocket,
  186.         (sockaddr *)psaAddrLocal,
  187.         &nAddrLength
  188.     );
  189.     
  190.     return nResult;
  191. }
  192. int CIPSocket::GetRemoteAddress(HSOCKET hInetSocket, INET_ADDRESS *psaAddrRemote)
  193. {
  194.     int nResult = false;
  195.     int nAddrLength = sizeof(INET_ADDRESS);
  196.     
  197.     ASSERT_POINTER(psaAddrRemote, INET_ADDRESS);
  198.     
  199.     nResult = ::getpeername(
  200.         hInetSocket,
  201.         (sockaddr *)psaAddrRemote,
  202.         &nAddrLength
  203.     );
  204.     
  205.     return nResult;
  206. }
  207. int CIPSocket::GetLocalAddress(INET_ADDRESS *psaAddrLocal)
  208. {
  209.     int nResult = false;
  210.     int nRetCode = 0;
  211.     
  212.     ASSERT(IsSocketOK());
  213.     
  214.     nRetCode = GetLocalAddress(m_hSckHandle, psaAddrLocal);
  215.     nResult = CheckError(nRetCode);
  216.     
  217.     return nResult;
  218. }
  219. int CIPSocket::GetRemoteAddress(INET_ADDRESS *psaAddrRemote)
  220. {
  221.     int nResult = false;
  222.     int nRetCode = 0;
  223.     
  224.     ASSERT(IsSocketOK());
  225.     
  226.     nRetCode = GetRemoteAddress(m_hSckHandle, psaAddrRemote);
  227.     nResult = CheckError(nRetCode);
  228.     
  229.     return nResult;
  230. }
  231. int CIPSocket::Select(int nReadReady, int nWriteReady, int nErrorReady, int nTimeOut)
  232. {
  233.     int nResult = 0;
  234.     int nRetCode = 0;
  235.     
  236.     FD_SET *pReadFds = NULL;
  237.     FD_SET *pWriteFds = NULL;
  238.     FD_SET *pErrorFds = NULL;
  239.     TIMEVAL *pTimeVal = NULL;
  240.     FD_SET fdsRead, fdsWrite, fdsError;
  241.     TIMEVAL tvTimeOut = { 0 };
  242.     
  243.     ASSERT(m_hSckHandle != INVALID_SOCKET);
  244.     
  245.     if (nReadReady)
  246.     {
  247.         pReadFds = &fdsRead;
  248.         
  249.         FD_ZERO(pReadFds);
  250.         FD_SET(m_hSckHandle, pReadFds);        
  251.     }
  252.     if (nWriteReady)
  253.     {
  254.         pWriteFds = &fdsWrite;
  255.         
  256.         FD_ZERO(pWriteFds);
  257.         FD_SET(m_hSckHandle, pWriteFds);
  258.     }
  259.     if (nErrorReady)
  260.     {
  261.         pErrorFds = &fdsError;
  262.         
  263.         FD_ZERO(&pErrorFds);
  264.         FD_SET(m_hSckHandle, pErrorFds);
  265.     }
  266.     if (nTimeOut >= 0)
  267.     {
  268.         if (nTimeOut != 0)
  269.         {
  270.             tvTimeOut.tv_sec = nTimeOut / 1000;
  271.             tvTimeOut.tv_usec = nTimeOut % 1000;
  272.         }
  273.         
  274.         pTimeVal = &tvTimeOut;
  275.     }
  276.     
  277.     nRetCode = ::select((int)m_hSckHandle + 1, pReadFds, pWriteFds, pErrorFds, pTimeVal);
  278.     nResult = CheckError(nRetCode);
  279.     
  280.     return nResult;
  281. }
  282. int CIPSocket::Bind(const INET_ADDRESS *pAddrLocal)
  283. {
  284.     int nResult = false;
  285.     int nRetCode = 0;
  286.     
  287.     ASSERT(IsSocketOK());
  288.     
  289.     ASSERT_POINTER(pAddrLocal, INET_ADDRESS);
  290.     
  291.     nRetCode = ::bind(
  292.         m_hSckHandle,
  293.         (const sockaddr *)pAddrLocal,
  294.         sizeof(INET_ADDRESS)
  295.     );
  296.     nResult = CheckError(nRetCode);
  297.     
  298.     return nResult;
  299. }
  300. int CIPSocket::Send(int nBufSize, const unsigned char *pbyBuffer)
  301. {
  302.     int nResult = false;
  303.     int nRetCode = 0;
  304.     
  305.     ASSERT(IsSocketOK());
  306.     
  307.     ASSERT(nBufSize > 0);
  308.     ASSERT(pbyBuffer != NULL);
  309.     
  310.     nRetCode = ::send(
  311.         m_hSckHandle,
  312.         (const char *)pbyBuffer,
  313.         nBufSize,
  314.         m_nSckFlags
  315.     );
  316.     
  317.     nResult = CheckError(nRetCode);
  318.     if (nResult > 0)
  319.     {
  320.         OnSendHandler(nResult, pbyBuffer);
  321.     }
  322.     
  323.     return nResult;
  324. }
  325. int CIPSocket::Receive(int nBufSize, unsigned char *pbyBuffer)
  326. {
  327.     int nResult = false;
  328.     int nRetCode = 0;
  329.     
  330.     ASSERT(IsSocketOK());
  331.     
  332.     ASSERT(nBufSize > 0);
  333.     ASSERT(pbyBuffer != NULL);
  334.     
  335.     nRetCode = ::recv(
  336.         m_hSckHandle,
  337.         (char *)pbyBuffer,
  338.         nBufSize,
  339.         m_nSckFlags
  340.     );
  341.     
  342.     nResult = CheckError(nRetCode);
  343.     if (nResult > 0)
  344.     {
  345.         OnReceiveHandler(nResult, pbyBuffer);
  346.     }
  347.     
  348.     return nResult;
  349. }
  350. int CIPSocket::SendTo(int nBufSize, const unsigned char *pbyBuffer, const INET_ADDRESS *pAddrTo)
  351. {
  352.     int nResult = false;
  353.     int nRetCode = 0;
  354.     
  355.     ASSERT(IsSocketOK());
  356.     
  357.     ASSERT(nBufSize > 0);
  358.     ASSERT(pbyBuffer != NULL);
  359.     ASSERT_POINTER(pAddrTo, INET_ADDRESS);
  360.     
  361.     nRetCode = ::sendto(
  362.         m_hSckHandle,
  363.         (const char *)pbyBuffer,
  364.         nBufSize,
  365.         m_nSckFlags,
  366.         (sockaddr *)pAddrTo,
  367.         sizeof(INET_ADDRESS)
  368.     );
  369.     
  370.     nResult = CheckError(nRetCode);
  371.     if (nResult > 0)
  372.     {
  373.         OnSendHandler(nResult, pbyBuffer);
  374.     }
  375.     
  376.     return nResult;
  377. }
  378. int CIPSocket::ReceiveFrom(int nBufSize, unsigned char *pbyBuffer, const INET_ADDRESS *pAddrFrom)
  379. {
  380.     int nResult = false;
  381.     int nRetCode = 0;
  382.     int nAddrSize = sizeof(INET_ADDRESS);
  383.     
  384.     ASSERT(IsSocketOK());
  385.     
  386.     ASSERT(nBufSize > 0);
  387.     ASSERT(pbyBuffer != NULL);
  388.     ASSERT_POINTER(pAddrFrom, INET_ADDRESS);
  389.     
  390.     nRetCode = ::recvfrom(
  391.         m_hSckHandle,
  392.         (char *)pbyBuffer,
  393.         nBufSize,
  394.         m_nSckFlags,
  395.         (sockaddr *)pAddrFrom,
  396.         &nAddrSize
  397.     );
  398.     
  399.     nResult = CheckError(nRetCode);
  400.     if (nResult > 0)
  401.     {
  402.         OnReceiveHandler(nResult, pbyBuffer);
  403.     }
  404.     
  405.     return nResult;
  406. }
  407. int CIPSocket::GetProtocol()
  408. {
  409.     return m_nSckProto;
  410. }
  411. int CIPSocket::SetProtocol(int nProtocol)
  412. {
  413.     int nOldProto = m_nSckProto;
  414.     
  415.     ASSERT(INVALID_SOCKET == m_hSckHandle);
  416.     
  417.     m_nSckProto = nProtocol;
  418.     return nOldProto;
  419. }
  420. int CIPSocket::GetWorkFlags()
  421. {
  422.     return m_nSckFlags;
  423. }
  424. int CIPSocket::SetWorkFlags(int nSocketFlags)
  425. {
  426.     int nOldFlags = m_nSckFlags;
  427.     
  428.     m_nSckFlags = nSocketFlags;
  429.     
  430.     return nOldFlags;
  431. }
  432. int CIPSocket::IsSocketOK()
  433. {
  434.     return (m_hSckHandle != INVALID_SOCKET);
  435. }
  436. int CIPSocket::CheckError(int nRetValue)
  437. {
  438.     int nResult = 0;
  439.     
  440.     nResult = nRetValue;
  441.     
  442.     if (SOCKET_ERROR == nRetValue)
  443.     {
  444.         SetLastError(::WSAGetLastError());
  445.         
  446.         OnErrorHandler();
  447.     }
  448.     
  449.     return nResult;
  450. }