亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? socketserver.cpp

?? 這個動態鏈接庫是Socket通過COm串口實現數據通信
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
{
   CIOBuffer *pBuffer = Allocate();

   pBuffer->SetUserData(IO_Close);

   pSocket->AddRef();

   m_iocp.PostStatus((ULONG_PTR)pSocket, 0, pBuffer);
}


void CSocketServer::Read(
   Socket *pSocket,
   CIOBuffer *pBuffer)
{
   // Post a read request to the iocp so that the actual socket read gets performed by
   // one of our IO threads...

   if (!pBuffer)
   {
      pBuffer = Allocate();
   }
   else
   {
      pBuffer->AddRef();
   }

   pBuffer->SetUserData(IO_Read_Request);

   pSocket->AddRef();

   m_iocp.PostStatus((ULONG_PTR)pSocket, 0, pBuffer);
}

void CSocketServer::Write(
   Socket *pSocket,
   const char *pData,
   size_t dataLength, 
   bool thenShutdown)
{
   // Post a write request to the iocp so that the actual socket write gets performed by
   // one of our IO threads...

   CIOBuffer *pBuffer = Allocate();

   pBuffer->AddData(pData, dataLength);

   pBuffer->SetUserData(IO_Write_Request);

   pSocket->AddRef();

   m_iocp.PostStatus((ULONG_PTR)pSocket, thenShutdown, pBuffer);
}

void CSocketServer::Write(
   Socket *pSocket,
   CIOBuffer *pBuffer, 
   bool thenShutdown)
{
   // Post a write request to the iocp so that the actual socket write gets performed by
   // one of our IO threads...

   pBuffer->AddRef();

   pBuffer->SetUserData(IO_Write_Request);

   pSocket->AddRef();

   m_iocp.PostStatus((ULONG_PTR)pSocket, thenShutdown, pBuffer);
}

void CSocketServer::OnError(
   const _tstring &message)
{
   Output(message);
}
  
///////////////////////////////////////////////////////////////////////////////
// CSocketServer::Socket
///////////////////////////////////////////////////////////////////////////////

CSocketServer::Socket::Socket(
   CSocketServer &server,                                 
   SOCKET theSocket)
   :  m_server(server),
      m_socket(theSocket),
      m_ref(1)
{
   if (INVALID_SOCKET == m_socket)
   {
      throw CException(_T("CSocketServer::Socket::Socket()"), _T("Invalid socket"));
   }
}

CSocketServer::Socket::~Socket()
{
}

void CSocketServer::Socket::Attach(
   SOCKET theSocket)
{
   if (INVALID_SOCKET != m_socket)
   {
      throw CException(_T("CSocketServer::Socket::Attach()"), _T("Socket already attached"));
   }

   m_socket = theSocket;

   SetUserData(0);
}

void CSocketServer::Socket::AddRef()
{
   ::InterlockedIncrement(&m_ref);
}

void CSocketServer::Socket::Release()
{
   if (0 == ::InterlockedDecrement(&m_ref))
   {
      m_server.ReleaseSocket(this);
   }
}

void CSocketServer::Socket::Shutdown(
   int how /* = SD_BOTH */)
{
   Output(_T("CSocketServer::Socket::Shutdown() ") + ToString(how));

   if (INVALID_SOCKET != m_socket)
   {
      if (0 != ::shutdown(m_socket, how))
      {
         m_server.OnError(_T("CSocketServer::Server::Shutdown() - ") + GetLastErrorMessage(::WSAGetLastError()));
      }

      Output(_T("shutdown initiated"));
   }
}

void CSocketServer::Socket::Close()
{
   CCriticalSection::Owner lock(m_server.m_listManipulationSection);

   if (INVALID_SOCKET != m_socket)
   {
      if (0 != ::closesocket(m_socket))
      {
         m_server.OnError(_T("CSocketServer::Socket::Close() - closesocket - ") + GetLastErrorMessage(::WSAGetLastError()));
      }

      m_socket = INVALID_SOCKET;

      m_server.OnConnectionClosed(this);

      Release();
   }
}

void CSocketServer::Socket::AbortiveClose()
{
   m_server.PostAbortiveClose(this);
}

void CSocketServer::Socket::Read(
   CIOBuffer *pBuffer /* = 0 */)
{
   m_server.Read(this, pBuffer);
}

void CSocketServer::Socket::Write(
   const char *pData, 
   size_t dataLength,
   bool thenShutdown /* = false */)
{
   m_server.Write(this, pData, dataLength, thenShutdown);
}

void CSocketServer::Socket::Write(
   CIOBuffer *pBuffer,
   bool thenShutdown /* = false */)
{
   m_server.Write(this, pBuffer, thenShutdown);
}

///////////////////////////////////////////////////////////////////////////////
// CSocketServer::WorkerThread
///////////////////////////////////////////////////////////////////////////////

CSocketServer::WorkerThread::WorkerThread(
   CIOCompletionPort &iocp)
   :  m_iocp(iocp)
{
   // All work done in initialiser list
}

int CSocketServer::WorkerThread::Run()
{
   try
   {
      //lint -e{716} while(1)
      while (true)   
      {
         // continually loop to service io completion packets

         bool closeSocket = false;

         DWORD dwIoSize = 0;
         Socket *pSocket = 0;
         CIOBuffer *pBuffer = 0;
         
         try
         {
            m_iocp.GetStatus((PDWORD_PTR)&pSocket, &dwIoSize, (OVERLAPPED**)&pBuffer);
         }
         catch (const CWin32Exception &e)
         {
            if (e.GetError() != ERROR_NETNAME_DELETED &&
                e.GetError() != WSA_OPERATION_ABORTED)
            {
               throw;
            }
            
            Output(_T("IOCP error - client connection dropped"));

            closeSocket = true;
         }

         if (!pSocket)
         {
            // A completion key of 0 is posted to the iocp to request us to shut down...

            break;
         }

         //lint -e{1933} call to unqualified virtual function
         OnBeginProcessing();

         if (pBuffer)
         {
            const IO_Operation operation = static_cast<IO_Operation>(pBuffer->GetUserData());

            switch (operation)
            {
               case IO_Read_Request :

                  Read(pSocket, pBuffer);
               
               break;
         
               case IO_Read_Completed :

                  if (0 != dwIoSize)
                  {
                     pBuffer->Use(dwIoSize);
                  
                     DEBUG_ONLY(Output(_T("RX: ") + ToString(pBuffer) + _T("\n") + DumpData(reinterpret_cast<const BYTE*>(pBuffer->GetWSABUF()->buf), dwIoSize, 40)));

                     //lint -e{1933} call to unqualified virtual function
                     ReadCompleted(pSocket, pBuffer);
                  }
                  else
                  {
                     // client connection dropped...

                     Output(_T("ReadCompleted - 0 bytes - client connection dropped"));

                     closeSocket = true;
                  }

                  pSocket->Release();
                  pBuffer->Release();

               break;

               case IO_Write_Request :

                  Write(pSocket, pBuffer);

                  if (dwIoSize != 0)
                  {
                     // final write, now shutdown send side of connection
                     pSocket->Shutdown(SD_SEND);
                  }

               break;

               case IO_Write_Completed :

                  pBuffer->Use(dwIoSize);
               
                  DEBUG_ONLY(Output(_T("TX: ") + ToString(pBuffer) + _T("\n") + DumpData(reinterpret_cast<const BYTE*>(pBuffer->GetWSABUF()->buf), dwIoSize, 40)));

                  //lint -e{1933} call to unqualified virtual function
                  WriteCompleted(pSocket, pBuffer);

                  pSocket->Release();
                  pBuffer->Release();

               break;

               case IO_Close :

                  AbortiveClose(pSocket);
            
                  pSocket->Release();
                  pBuffer->Release();

               break;

               default :
                  //lint -e{1933} call to unqualified virtual function
                  OnError(_T("CSocketServer::WorkerThread::Run() - Unexpected operation"));
               break;
            } 
         }
         else
         {
            //lint -e{1933} call to unqualified virtual function
            OnError(_T("CSocketServer::WorkerThread::Run() - Unexpected - pBuffer is 0"));
         }

         if (closeSocket)
         {
            pSocket->Close();
         }

         //lint -e{1933} call to unqualified virtual function
         OnEndProcessing();
      } 
   }
   catch(const CException &e)
   {
      //lint -e{1933} call to unqualified virtual function
      OnError(_T("CSocketServer::WorkerThread::Run() - Exception: ") + e.GetWhere() + _T(" - ") + e.GetMessage());
   }
   catch(...)
   {
      //lint -e{1933} call to unqualified virtual function
      OnError(_T("CSocketServer::WorkerThread::Run() - Unexpected exception"));
   }

   return 0;
}

void CSocketServer::WorkerThread::InitiateShutdown()
{
   m_iocp.PostStatus(0);         
}

void CSocketServer::WorkerThread::WaitForShutdownToComplete()
{
   // if we havent already started a shut down, do so...

   InitiateShutdown();

   Wait();
}

void CSocketServer::WorkerThread::Read(
   Socket *pSocket,
   CIOBuffer *pBuffer) const
{
   pBuffer->SetUserData(IO_Read_Completed);

   pBuffer->SetupRead();

   DWORD dwNumBytes = 0;
   DWORD dwFlags = 0;

   if (SOCKET_ERROR == ::WSARecv(
      pSocket->m_socket, 
      pBuffer->GetWSABUF(), 
      1, 
      &dwNumBytes,
      &dwFlags,
      pBuffer, 
      NULL))
   {
      DWORD lastError = ::WSAGetLastError();

      if (ERROR_IO_PENDING != lastError)
      {
         Output(_T("CSocketServer::Read() - WSARecv: ") + GetLastErrorMessage(lastError));

         if (lastError == WSAECONNABORTED || 
             lastError == WSAECONNRESET ||
             lastError == WSAEDISCON)
         {
            pSocket->Close();
         }

         pSocket->Release();
         pBuffer->Release();
      }
   }
}

void CSocketServer::WorkerThread::Write(
   Socket *pSocket,
   CIOBuffer *pBuffer) const
{
   pBuffer->SetUserData(IO_Write_Completed);

   pBuffer->SetupWrite();

   DWORD dwFlags = 0;
   DWORD dwSendNumBytes = 0;

   if (SOCKET_ERROR == ::WSASend(
      pSocket->m_socket,
      pBuffer->GetWSABUF(), 
      1, 
      &dwSendNumBytes,
      dwFlags,
      pBuffer, 
      NULL))
   {
      DWORD lastError = ::WSAGetLastError();

      if (ERROR_IO_PENDING != lastError)
      {
         Output(_T("CSocketServer::Write() - WSASend: ") + GetLastErrorMessage(lastError));

         if (lastError == WSAECONNABORTED || 
             lastError == WSAECONNRESET ||
             lastError == WSAEDISCON)
         {
            pSocket->Close();
         }

         pSocket->Release();
         pBuffer->Release();
      }
   }
}

void CSocketServer::WorkerThread::WriteCompleted(
   Socket * /*pSocket*/,
   CIOBuffer *pBuffer)
{
   if (pBuffer->GetUsed() != pBuffer->GetWSABUF()->len)
   {
      //lint -e{1933} call to unqualified virtual function
      OnError(_T("CSocketServer::WorkerThread::WriteCompleted - Socket write where not all data was written"));
   }

   //lint -e{818} pointer pBuffer could be declared const (but not in derived classes...)
}

void CSocketServer::WorkerThread::AbortiveClose(
   Socket *pSocket)
{
   // Force an abortive close.

   LINGER lingerStruct;

   lingerStruct.l_onoff = 1;
   lingerStruct.l_linger = 0;

   if (SOCKET_ERROR == ::setsockopt(pSocket->m_socket, SOL_SOCKET, SO_LINGER, (char *)&lingerStruct, sizeof(lingerStruct)))
   {
      //lint -e{1933} call to unqualified virtual function
      OnError(_T("CSocketServer::Socket::AbortiveClose() - setsockopt(SO_LINGER) - ")  + GetLastErrorMessage(::WSAGetLastError()));
   }

   pSocket->Close();
}

void CSocketServer::WorkerThread::OnError(
   const _tstring &message)
{
   Output(message);
}
                                          
///////////////////////////////////////////////////////////////////////////////
// Static helper methods
///////////////////////////////////////////////////////////////////////////////

static size_t CalculateNumberOfThreads(size_t numThreads)
{
   if (numThreads == 0)
   {
      CSystemInfo systemInfo;
   
      numThreads = systemInfo.dwNumberOfProcessors * 2;
   }

   return numThreads;
}

///////////////////////////////////////////////////////////////////////////////
// Namespace: JetByteTools::Win32
///////////////////////////////////////////////////////////////////////////////

} // End of namespace Win32
} // End of namespace JetByteTools 

///////////////////////////////////////////////////////////////////////////////
// Lint options
//
//lint -restore
//
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
// End of file...
///////////////////////////////////////////////////////////////////////////////

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产盗摄一区二区| 久久精品综合网| 色女孩综合影院| 99久久777色| 99riav久久精品riav| 91网站黄www| 9色porny自拍视频一区二区| 成人综合在线观看| 成人动漫精品一区二区| 成人激情动漫在线观看| 不卡一区二区三区四区| 不卡电影免费在线播放一区| 成人精品鲁一区一区二区| av中文字幕不卡| 一本一道久久a久久精品综合蜜臀| 99re视频精品| 在线影院国内精品| 欧美老肥妇做.爰bbww视频| 91麻豆精品国产自产在线观看一区 | 日韩高清不卡一区二区三区| 日韩电影免费一区| 久久99精品久久久久久国产越南 | 国产精品一级在线| 国产不卡免费视频| 91麻豆精东视频| 欧美亚洲精品一区| 日韩免费性生活视频播放| 久久蜜臀中文字幕| 综合精品久久久| 亚洲福利视频导航| 久久国产人妖系列| 成人av午夜影院| 色综合亚洲欧洲| 91精品欧美一区二区三区综合在| 欧美成人一区二区| 国产精品传媒入口麻豆| 亚洲一区二区视频在线观看| 青娱乐精品视频| 国产精品一线二线三线精华| jiyouzz国产精品久久| 欧美日韩黄色一区二区| 日韩美女一区二区三区| 午夜亚洲国产au精品一区二区| 日韩中文字幕不卡| 国产精品中文字幕一区二区三区| av在线不卡电影| 日韩欧美视频在线| 亚洲三级在线观看| 韩国欧美国产一区| 色哟哟一区二区三区| 精品久久久久久亚洲综合网| 亚洲欧洲三级电影| 久久精品国产999大香线蕉| 成人性生交大合| 91精品国产麻豆国产自产在线| 久久久久久免费毛片精品| 亚洲一区二区三区四区五区黄| 国产一区二区视频在线播放| 欧美性视频一区二区三区| 久久久国产精华| 丝袜a∨在线一区二区三区不卡| 国产精品中文有码| 3d成人h动漫网站入口| 国产精品嫩草影院av蜜臀| 琪琪一区二区三区| 日本久久电影网| 精品国产一区a| 亚洲成人av免费| 成人看片黄a免费看在线| 日韩一区和二区| 亚洲男人的天堂av| 国产91精品免费| 91精品综合久久久久久| 一区二区日韩av| 成人综合婷婷国产精品久久蜜臀| 91精品国产免费| 亚洲一区在线观看免费观看电影高清 | 国产乱码精品一品二品| 欧美理论片在线| 一区二区三区中文字幕在线观看| 国产老女人精品毛片久久| 欧美欧美欧美欧美首页| 亚洲精品欧美在线| 成人av在线资源| 久久久久国产精品免费免费搜索| 日韩电影在线观看网站| 欧美色区777第一页| 亚洲欧美视频一区| av在线不卡网| 国产精品乱人伦中文| 国产福利91精品一区二区三区| 日韩亚洲欧美在线观看| 视频在线观看91| 欧美日本在线一区| 亚洲成av人在线观看| 欧美午夜一区二区| 亚洲小少妇裸体bbw| 欧美怡红院视频| 一级女性全黄久久生活片免费| 91污片在线观看| 一区二区三区中文字幕电影| 99久久免费视频.com| 国产精品久久夜| 99久久综合精品| 综合亚洲深深色噜噜狠狠网站| 国产成人综合亚洲网站| 国产亚洲欧美一级| 成人一二三区视频| 国产精品免费观看视频| eeuss鲁片一区二区三区| 国产精品毛片久久久久久久| 成人av午夜电影| 综合av第一页| 色综合久久综合网97色综合| 夜夜嗨av一区二区三区| 欧美日韩免费视频| 奇米色一区二区三区四区| 欧美一区二区三区四区在线观看 | 91久久香蕉国产日韩欧美9色| 亚洲人妖av一区二区| 色久综合一二码| 亚洲与欧洲av电影| 欧美一二三四在线| 国产精品一色哟哟哟| 国产精品电影一区二区| 91黄视频在线| 天天av天天翘天天综合网色鬼国产| 在线播放中文字幕一区| 精品一区二区免费视频| 中文字幕国产精品一区二区| 色欧美88888久久久久久影院| 亚洲高清视频在线| 精品嫩草影院久久| 成人午夜av电影| 亚洲激情图片一区| 日韩午夜在线播放| 粉嫩久久99精品久久久久久夜| 亚洲女人的天堂| 51久久夜色精品国产麻豆| 国产夫妻精品视频| 一区二区三国产精华液| 日韩一区二区电影| 成人性生交大片免费看中文| 亚洲你懂的在线视频| 日韩视频一区二区| 99热这里都是精品| 日韩二区在线观看| 国产精品久久久久影视| 欧美丝袜丝nylons| 国产精品123| 亚洲线精品一区二区三区八戒| 欧美一级理论片| 91丨porny丨国产| 日本不卡一二三| 亚洲欧美日韩成人高清在线一区| 在线播放一区二区三区| 成人18视频在线播放| 日韩激情在线观看| 国产精品―色哟哟| 日韩三级在线免费观看| 91欧美一区二区| 国产原创一区二区三区| 一区二区成人在线视频 | 久久99久久精品| 亚洲男人的天堂av| 久久久久久久久久电影| 欧美午夜不卡视频| 粉嫩av一区二区三区| 美腿丝袜亚洲色图| 亚洲一区在线观看网站| 国产精品久久久久桃色tv| 91精品国产手机| 欧美在线视频你懂得| 懂色中文一区二区在线播放| 美女在线视频一区| 亚洲第一福利一区| 亚洲欧美一区二区三区孕妇| 欧美精品一区二区三区蜜桃视频| 欧美这里有精品| 成人网在线播放| 激情综合网天天干| 免费看欧美女人艹b| 亚洲一二三区视频在线观看| 国产精品久久久久久久久免费樱桃 | 一区二区三区免费看视频| 国产清纯在线一区二区www| 日韩欧美www| 欧美色图片你懂的| 91色在线porny| 成人av网站大全| 懂色av一区二区三区免费观看| 麻豆极品一区二区三区| 亚州成人在线电影| 亚洲国产aⅴ成人精品无吗| 一区二区三区在线观看国产| 国产精品二三区| 亚洲欧洲色图综合| 国产精品天天摸av网| 久久色成人在线| 久久先锋影音av|