现在的位置: 首页 > 综合 > 正文

IOCP一小例

2013年08月22日 ⁄ 综合 ⁄ 共 2659字 ⁄ 字号 评论关闭

完成端口模型可以让我们基于传递overlapped数据的思想分解异步操作,让操作系统帮我们做线程间的数据传递。基于这个思想,可以把bsdsocket改造成异步模型,尽管这样做效率上意义不大,但对于想模拟ms完成端口都网络模型的人来说,可以小圆梦想了。

  1. static  HANDLE  g_hiocp;  
  2.   
  3.   
  4.   
  5. static      DWORD   WINAPI  worker(LPVOID pvd);  
  6.   
  7.   
  8.   
  9. static  const   int BUF_LEN = 256;  
  10.   
  11. struct myPerIoData  
  12.   
  13. {  
  14.   
  15.     OVERLAPPED  ov;  
  16.   
  17.     char        bf[BUF_LEN];  
  18.   
  19. };  
  20.   
  21.   
  22.   
  23. int _tmain(int argc, _TCHAR* argv[])  
  24.   
  25. {  
  26.   
  27.     g_hiocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,NULL,0);  
  28.   
  29.   
  30.   
  31.     CreateThread(NULL,0,worker,NULL,0,NULL);  
  32.   
  33.   
  34.   
  35.     BOOL    bgqcs;  
  36.   
  37.     DWORD   transed;  
  38.   
  39.     DWORD   comkey;  
  40.   
  41.     myPerIoData*    pov;  
  42.   
  43.     int     cnt = 0;  
  44.   
  45.     while (true)  
  46.   
  47.     {  
  48.   
  49.         transed = 0;  
  50.   
  51.         pov     = NULL;  
  52.   
  53.         bgqcs   = GetQueuedCompletionStatus(g_hiocp,&transed,&comkey,(LPOVERLAPPED*)&pov,INFINITE);  
  54.   
  55.         if (NULL == pov)  
  56.   
  57.         {  
  58.   
  59.             printf("sorry,you lost your snake/n");  
  60.   
  61.             break;  
  62.   
  63.         }  
  64.   
  65.         printf("%s/n",pov->bf);  
  66.   
  67.         delete  pov;  
  68.   
  69.     }  
  70.   
  71.     return 0;  
  72.   
  73. }  
  74.   
  75.   
  76.   
  77. DWORD   WINAPI worker( LPVOID pvd )  
  78.   
  79. {  
  80.   
  81.     int cnt = 0;  
  82.   
  83.     while (true)  
  84.   
  85.     {  
  86.   
  87.         Sleep(3000);  
  88.   
  89.         ++cnt;  
  90.   
  91.         if (cnt <= 5)  
  92.   
  93.         {  
  94.   
  95.             myPerIoData*    pov = new myPerIoData;  
  96.   
  97.             memset(pov,0,sizeof(myPerIoData));  
  98.   
  99.             sprintf_s(pov->bf,BUF_LEN,"yes,it's snake : %d",cnt);  
  100.   
  101.             PostQueuedCompletionStatus(g_hiocp,0,NULL,&pov->ov);  
  102.   
  103.         }  
  104.   
  105.         else  
  106.   
  107.         {  
  108.   
  109.             PostQueuedCompletionStatus(g_hiocp,0,NULL,NULL);  
  110.   
  111.         }  
  112.   
  113.     }  
  114.   
  115.     return  0L;  
  116.   
  117. }  

  程序输出是这样的:

  1. yes,it's snake:1  
  2.   
  3. yes,it's snake:2  
  4.   
  5. yes,it's snake:3  
  6.   
  7. yes,it's snake:4  
  8.   
  9. yes,it's snake:5  
  10.   
  11. sorry,you lost your snake  

抱歉!评论已关闭.