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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? comm_mon.cpp

?? 比較詳盡的介紹了短信的發(fā)送與接收的實現(xiàn)模塊與程序
?? CPP
字號:

// comm_mon.cpp


#include "stdafx.h"
#include "comm_mon.h"
#include "commspy.h"






GCommMonitor::GCommMonitor()
{
   m_hConn = NULL;
   m_hMPP = NULL;

   m_pConn = NULL;
   m_pMPP = NULL;
}


GCommMonitor::~GCommMonitor()
{
   if(m_pConn && m_pConn->bConnected)
   {
      TRACE(_T("Warning: terminating COMM connection in GCommMonitor::~GCommMonitor()\n"));
      Disconnect();
   }

   if(m_hConn)
   {
      ::GlobalUnlock(m_hConn);
      ::GlobalFree(m_hConn);
   }

   if(m_hMPP)
   {
      ::GlobalUnlock(m_hMPP);
      ::GlobalFree(m_hMPP);
   }
}


BOOL GCommMonitor::IsConnected() const
{
   return (m_pConn && m_pConn->bConnected);
}



BOOL GCommMonitor::Connect(LPTTYSTRUCT lpTTY)
{
   if(m_pConn && m_pConn->bConnected)
      return TRUE;

   // only allocate this guy once
   if(!m_hConn)
   {
      m_hConn = ::GlobalAlloc(GMEM_MOVEABLE, sizeof(CONNECTION));
      m_pConn = (LPCONNECTION)::GlobalLock(m_hConn);
      ZeroMemory(m_pConn, sizeof(CONNECTION));
   }

   // create I/O event used for overlapped reads/writes
   if((m_pConn->osRead.hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL)) == NULL)
      return FALSE;

   if((m_pConn->osWrite.hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL)) == NULL)
      return FALSE;
   
   // open communcations file
   CString strPort;
   if(lpTTY->byCommPort > 3)
   {
      strPort = "\\\\.\\TELNET";
   }
   else
   {
      strPort.Format(_T("COM%d"), lpTTY->byCommPort + 1);
   }

   m_pConn->hCommDev = ::CreateFile(strPort, GENERIC_READ|GENERIC_WRITE, 0,
                                  NULL, OPEN_EXISTING, 
                                  FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, 
                                  NULL);

   if(m_pConn->hCommDev == INVALID_HANDLE_VALUE)
      return FALSE;
   
   BOOL bPurge = FALSE;
   // get any early notifications
   if(::SetCommMask(m_pConn->hCommDev, EV_RXCHAR))
   {
      // setup device buffers
      if(::SetupComm(m_pConn->hCommDev, 4096, 4096))
      {
         // purge any information in the buffer
         if(::PurgeComm(m_pConn->hCommDev, PURGE_TXABORT|PURGE_RXABORT|
                                           PURGE_TXCLEAR|PURGE_RXCLEAR))
         {
            bPurge = TRUE;
         }
      }
   }
   
   if(!bPurge)
   {
      ::CloseHandle(m_pConn->hCommDev);
      return FALSE;
   }

   // set up for overlapped I/O
   COMMTIMEOUTS CommTimeOuts;

   CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
   CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
   CommTimeOuts.ReadTotalTimeoutConstant = 1000;
   CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
   CommTimeOuts.WriteTotalTimeoutConstant = 1000;

   if(!::SetCommTimeouts(m_pConn->hCommDev, &CommTimeOuts))
   {
      ::CloseHandle(m_pConn->hCommDev);
      return FALSE;
   }

   // set up the connect
   DCB dcb;
   ZERO_MEMORY(dcb);
   dcb.DCBlength = sizeof(DCB);

   if(!::GetCommState(m_pConn->hCommDev, &dcb))
   {
      ::CloseHandle(m_pConn->hCommDev);
      return FALSE;
   }

   dcb.BaudRate = lpTTY->dwBaudRate;
   dcb.ByteSize = lpTTY->byByteSize;
   dcb.Parity = lpTTY->byParity;
   dcb.StopBits = lpTTY->byStopBits;

   // setup hardware flow control
   BOOL bSet = (BYTE)((lpTTY->byFlowCtrl & FC_DTRDSR) != 0);
   dcb.fOutxDsrFlow = bSet;
   if(bSet)
      dcb.fDtrControl = DTR_CONTROL_HANDSHAKE;
   else
      dcb.fDtrControl = DTR_CONTROL_ENABLE;

   bSet = (BYTE)((lpTTY->byFlowCtrl & FC_RTSCTS) != 0);
	dcb.fOutxCtsFlow = bSet;
   if(bSet)
      dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
   else
      dcb.fRtsControl = RTS_CONTROL_ENABLE;

   // setup software flow control
   bSet = (BYTE)((lpTTY->byFlowCtrl & FC_XONXOFF) != 0);

   dcb.fInX = dcb.fOutX = bSet;
   dcb.XonChar = ASCII_XON;
   dcb.XoffChar = ASCII_XOFF;
   dcb.XonLim = 100;
   dcb.XoffLim = 100;

   // other various settings
   dcb.fBinary = TRUE;
   dcb.fParity = TRUE;

   if(!::SetCommState(m_pConn->hCommDev, &dcb))
   {
      ::CloseHandle(m_pConn->hCommDev);
      return FALSE;
   }

   m_pConn->bConnected = TRUE;

   return m_pConn->bConnected;
}



BOOL GCommMonitor::Disconnect()
{
   if(!m_pConn)
      return TRUE;

   // set connected flag to false
   m_pConn->bConnected = FALSE;
   
   // disable event notification and wait for thread to halt
   SetCommMask(m_pConn->hCommDev, 0);

   // block until thread has been halted
   //while(m_pConn->dwThreadID != 0)
   //{
   //   Sleep(10);
   //}

   // drop DTR 
   EscapeCommFunction(m_pConn->hCommDev, CLRDTR);

   // purge any outstanding reads/writes and close device handle
   PurgeComm(m_pConn->hCommDev, PURGE_TXABORT|PURGE_RXABORT|
                                PURGE_TXCLEAR|PURGE_RXCLEAR);

   ::CloseHandle(m_pConn->hCommDev);
   ::CloseHandle(m_pConn->osRead.hEvent);
   ::CloseHandle(m_pConn->osWrite.hEvent);

   return TRUE;
}





BOOL GCommMonitor::Monitor(LPMONITORPROC lpMonitorProc, LPARAM lParam)
{
   BOOL bMonitor = FALSE;

   // create monitoring thread
   if(m_pConn->bConnected)
   {
      if(lpMonitorProc)
      {
         if(!m_hMPP)
         {
            m_hMPP = ::GlobalAlloc(GMEM_MOVEABLE, sizeof(MONITORPROCPARAMS));
            m_pMPP = (LPMONITORPROCPARAMS)::GlobalLock(m_hMPP);
         }

         m_pMPP->lpConn = m_pConn;
         m_pMPP->lpCallback = lpMonitorProc;
         m_pMPP->lpCallbackParam = lParam;

         // create a secondary thread to watch for an event
         DWORD dwThreadID;
         if(::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)CommMonitorProc,
                           (LPVOID)m_pMPP, 0, &dwThreadID))
         {
            m_pConn->dwThreadID = dwThreadID;

            ::EscapeCommFunction(m_pConn->hCommDev, SETDTR);
            bMonitor = TRUE;
         }
      }
      else
      {
         ASSERT(FALSE);  // not currently implemented
      }
   }

   return bMonitor;
}








DWORD CALLBACK GCommMonitor::CommMonitorProc(LPVOID lpThreadParameter)
{
   HGLOBAL hParams = (HGLOBAL)lpThreadParameter;
   LPMONITORPROCPARAMS pParams = (LPMONITORPROCPARAMS)::GlobalLock(hParams);
   if(!pParams)
      return 0;
   
   HGLOBAL hBuf = ::GlobalAlloc(GMEM_MOVEABLE, MAX_RXBLOCK + 1);
   if(!hBuf)
   {
      ::GlobalUnlock(hParams);
      return 0;
   }

   LPBYTE lpBuffer = (LPBYTE)::GlobalLock(hBuf);
   if(!lpBuffer)
   {
      ::GlobalUnlock(hParams);
      ::GlobalFree(hBuf);
      return 0;
   }

   // create I/O event used for overlapped read
   OVERLAPPED os;
   ::ZeroMemory(&os, sizeof(os));

   os.hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);

   if(os.hEvent == NULL || !SetCommMask(pParams->lpConn->hCommDev, EV_RXCHAR))
   {
      ReportLastError();
      return 0;
   }

   while(pParams->lpConn->bConnected)
   {
      DWORD dwEvtMask = 0;
      int nLength = 0;

      OVERLAPPED ol;
      ::ZeroMemory(&ol, sizeof(ol));
      ol.hEvent = os.hEvent;

      WaitCommEvent(pParams->lpConn->hCommDev, &dwEvtMask, &ol);

      if((dwEvtMask & EV_RXCHAR) == EV_RXCHAR)
      {
         do
         {
            if((nLength = CommReadBlock(pParams->lpConn, lpBuffer, MAX_RXBLOCK)) != 0)
            {
               if(pParams->lpCallback)
                  pParams->lpCallback(hBuf, nLength, pParams->lpCallbackParam);
            }

         } while(nLength > 0);
      }
   }

   ::GlobalUnlock(hBuf);
   ::GlobalFree(hBuf);

   // get rid of event handles
   ::CloseHandle(os.hEvent);

   // clear information in structure (indicates the thread has terminated)
   pParams->lpConn->dwThreadID = NULL;

   ::GlobalUnlock(hParams);
   return 1;
}





BOOL CALLBACK GCommMonitor::CommReadBlock(LPCONNECTION lpConn, LPBYTE lpszBlock, 
                                                                          int nLen)
{
   // only try to read number of bytes in queue
   DWORD dwErrorFlags;
   COMSTAT ComStat;

   ::ClearCommError(lpConn->hCommDev, &dwErrorFlags, &ComStat);
   DWORD dwLength = min((DWORD)nLen, ComStat.cbInQue);

   if(dwLength > 0)
   {
      BOOL bReadStat = ReadFile(lpConn->hCommDev, lpszBlock, dwLength,
                                &dwLength, &lpConn->osRead);

      if(!bReadStat)
      {
         if(GetLastError() == ERROR_IO_PENDING)
         {
            OutputDebugString("\n\rIO Pending");
            // we have to wait for read to complete.  This function will timeout
            // according to the CommTimeOuts.ReadTotalTimeoutConstant variable
            // Every time it times out, check for port errors
            while(!GetOverlappedResult(lpConn->hCommDev, &lpConn->osRead,
                                       &dwLength, TRUE))
            {
               DWORD dwError = GetLastError();
               if(dwError == ERROR_IO_INCOMPLETE)
               {
                  // normal result if not finished
                  continue;
               }
               else
               {
                  // CAN DISPLAY ERROR MESSAGE HERE
                  // an error occured, try to recover
                  ::ClearCommError(lpConn->hCommDev, &dwErrorFlags, &ComStat);
                  if(dwErrorFlags > 0)
                  {
                     // CAN DISPLAY ERROR MESSAGE HERE
                  }

                  break;
               }
            }
            
         }
         else
         {
            // some other error occured
            dwLength = 0;
            ClearCommError(lpConn->hCommDev, &dwErrorFlags, &ComStat);
            if(dwErrorFlags > 0)
            {
               // CAN DISPLAY ERROR MESSAGE HERE
            }
         }
      }
   }

   return dwLength;
}





?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲一区二区不卡免费| 精品亚洲porn| 不卡一区二区在线| 国产亚洲综合在线| 国产一区二区三区四区五区美女 | 久久伊99综合婷婷久久伊| 日本va欧美va瓶| 91精品国产综合久久小美女| 亚洲国产精品一区二区尤物区| 色婷婷综合久色| 亚洲精品国产a久久久久久| 91麻豆蜜桃一区二区三区| 亚洲欧美日韩久久| 日本精品视频一区二区| 一区二区三区在线视频免费观看| 色偷偷成人一区二区三区91| 韩国视频一区二区| 欧美一区二区三区免费在线看| 午夜不卡av免费| 日韩视频一区二区在线观看| 久久99精品国产麻豆婷婷洗澡| 337p日本欧洲亚洲大胆精品 | 五月天丁香久久| 91精品久久久久久久99蜜桃 | 国产乱国产乱300精品| 国产香蕉久久精品综合网| 岛国精品在线观看| 亚洲色图19p| 欧美日韩国产在线观看| 免费高清在线一区| 国产亚洲污的网站| 99久久精品国产麻豆演员表| 一二三四社区欧美黄| 欧美日本一区二区三区四区| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲福利一二三区| 精品少妇一区二区三区免费观看| 国产成人亚洲精品青草天美| 亚洲欧美aⅴ...| 欧美丰满高潮xxxx喷水动漫| 久久99国产精品久久| 国产精品色哟哟| 欧美制服丝袜第一页| 免费成人在线播放| 国产精品―色哟哟| 欧美视频一区二区三区四区| 裸体在线国模精品偷拍| 国产精品免费视频观看| 欧美午夜理伦三级在线观看| 另类中文字幕网| 国产精品乱码人人做人人爱| 欧美三级在线看| 国产一区二区三区在线观看精品| 亚洲三级在线观看| 日韩欧美一卡二卡| 91视视频在线观看入口直接观看www | 国产午夜精品久久久久久免费视| 91浏览器在线视频| 美女脱光内衣内裤视频久久网站 | 国产女人aaa级久久久级 | 国产欧美日韩在线| 欧美性生活影院| 国产精品99久久久久久似苏梦涵| 亚洲欧美日韩国产中文在线| 欧美电影精品一区二区| 91成人在线精品| 国产精一区二区三区| 亚洲一区二区在线免费看| 久久婷婷久久一区二区三区| 在线观看一区不卡| 国产成人免费在线视频| 亚洲bt欧美bt精品777| 久久精品欧美一区二区三区不卡| 欧美三级视频在线播放| 成人三级伦理片| 奇米四色…亚洲| 一区二区免费视频| 国产亚洲成av人在线观看导航| 欧美日韩日日骚| 成人午夜激情影院| 另类中文字幕网| 亚洲chinese男男1069| 综合激情成人伊人| 久久久综合九色合综国产精品| 欧美特级限制片免费在线观看| 岛国一区二区三区| 激情综合五月天| 亚洲成av人片一区二区梦乃| 亚洲欧洲www| 26uuu精品一区二区| 欧美精品黑人性xxxx| 色播五月激情综合网| 粉嫩av亚洲一区二区图片| 九九久久精品视频| 日韩主播视频在线| 一区二区三区日韩欧美| 久久久久久久久久久电影| 在线播放91灌醉迷j高跟美女| 99re热这里只有精品视频| 国产九色精品成人porny | 国产一区二区三区久久久| 日韩综合在线视频| 亚洲第一会所有码转帖| 亚洲免费观看视频| ●精品国产综合乱码久久久久| 国产网站一区二区三区| 精品成人一区二区三区| 日韩一区二区高清| 4438亚洲最大| 欧美人与禽zozo性伦| 欧日韩精品视频| 色94色欧美sute亚洲线路一久| 99久久久精品| 丁香六月久久综合狠狠色| 国产麻豆视频一区二区| 狠狠色丁香婷综合久久| 久久国产精品一区二区| 奇米影视在线99精品| 蜜桃传媒麻豆第一区在线观看| 日韩中文字幕区一区有砖一区| 午夜精品一区在线观看| 婷婷亚洲久悠悠色悠在线播放| 亚洲一区二区三区激情| 亚洲电影一级片| 午夜精品福利久久久| 无吗不卡中文字幕| 日日摸夜夜添夜夜添亚洲女人| 午夜精品福利一区二区三区av| 婷婷一区二区三区| 欧美日韩高清一区二区三区| 欧美网站大全在线观看| 欧美午夜精品理论片a级按摩| 欧美性xxxxxx少妇| 欧美三级电影网| 欧美精三区欧美精三区| 这里只有精品视频在线观看| 欧美一区二区大片| 亚洲精品一区二区三区99| 国产午夜亚洲精品不卡| 中文子幕无线码一区tr | 久久毛片高清国产| 国产农村妇女精品| 国产精品久久777777| |精品福利一区二区三区| 亚洲精品高清视频在线观看| 亚洲一区二区高清| 日韩av一区二区在线影视| 美女国产一区二区| 国产乱理伦片在线观看夜一区 | 国产毛片精品国产一区二区三区| 国产福利一区二区三区在线视频| 成人午夜视频网站| 在线视频中文字幕一区二区| 欧美精品精品一区| 欧美精品一区二区三区在线 | 亚洲影院理伦片| 日本sm残虐另类| 国模一区二区三区白浆| 成人夜色视频网站在线观看| 色综合天天综合在线视频| 欧美日韩国产综合一区二区| 日韩欧美的一区| 国产午夜精品在线观看| 怡红院av一区二区三区| 日本少妇一区二区| 国产福利91精品一区| 色欧美88888久久久久久影院| 69堂成人精品免费视频| 久久久久9999亚洲精品| 亚洲精品视频在线| 日本中文字幕一区二区视频 | 欧美精品v国产精品v日韩精品| 26uuu亚洲综合色欧美 | 国产精品你懂的在线| 一区二区久久久| 国产专区欧美精品| 91女厕偷拍女厕偷拍高清| 91麻豆精品国产91久久久使用方法| 久久影视一区二区| 亚洲一区二区偷拍精品| 黑人巨大精品欧美黑白配亚洲| 99久久99久久免费精品蜜臀| 欧美日产国产精品| 国产精品拍天天在线| 日韩电影免费在线| 99精品久久99久久久久| 日韩一级完整毛片| 亚洲天堂精品视频| 精品一区中文字幕| 在线视频你懂得一区二区三区| 精品国产一二三区| 一区二区久久久久| 风流少妇一区二区| 337p亚洲精品色噜噜噜| 国产精品人成在线观看免费| 奇米精品一区二区三区在线观看| 91丨九色porny丨蝌蚪| 日日夜夜精品免费视频| 99精品热视频| 精品国产免费一区二区三区香蕉|