windows下完成連接埠的的使用

來源:互聯網
上載者:User

最近在windows下用udp接收資料,查了下百度,說用完成連接埠比較好用,在學習windows下完成連接埠的的使用,開始以為很複雜,真正搞好了發現還是比較容易使用的,

完成連接埠使用在main函數中先初始化並建立一個線程:

 g_hCompletionPort = CreateIoCompletionPort ( INVALID_HANDLE_VALUE, NULL, 0, 0 ) ; 
    CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)WorkThread,
            NULL, 0, NULL);

需要定義一個用於接收資料的結構:

typedef struct _PER_HANDLE_DATA         
{
SOCKET s;                           
sockaddr_in addr;                    
char buf[BUFFER_SIZE];               
int nOperationType;                  
} PER_HANDLE_DATA;    

然後分配一個PER_HANDLE_DATA,使用CreateIoCompletionPort將接收的socket控制代碼添加到完成連接埠中:

PER_HANDLE_DATA *pPerHandle =(PER_HANDLE_DATA *)malloc (sizeof(PER_HANDLE_DATA));

 pPerHandle->s =socket(AF_INET,SOCK_DGRAM,0);
 memset(&pPerHandle->addr,0,sizeof(struct sockaddr_in));
 pPerHandle->addr.sin_family=AF_INET;
 pPerHandle->addr.sin_port=8888;  //udp連接埠號碼
 pPerHandle->nOperationType = 1;

 bind(pPerHandle->s ,(struct sockaddr *)&pPerHandle->addr,sizeof(struct sockaddr));

 CreateIoCompletionPort((HANDLE)pPerHandle->s, g_hCompletionPort, (ULONG_PTR)pPerHandle, 0);

在分配一個OVERLAPPED,使用WSARecv接收資料

 OVERLAPPED *pol = (OVERLAPPED *)malloc(sizeof(OVERLAPPED));
 WSABUF buf;
 buf.buf = pPerHandle->buf;
 buf.len = BUFFER_SIZE;
 DWORD dwRecv;
 DWORD dwFlags = 0;

 ret = ::WSARecv(pPerHandle->s, &buf, 1, &dwRecv, &dwFlags, pol, NULL);
 if (ret <0)
  errCode =  WSAGetLastError();

while(1)

{

 

}

線程函數中使用GetQueuedCompletionStatus擷取完成連接埠狀態並處理

void* WorkThread(void* name)
{
 DWORD dwTrans;
 OVERLAPPED *pOverlapped;
 PER_HANDLE_DATA* pPerHandle;
// OVERLAPPEDPLUS *lpPlus;
 while (1)
 {
  BOOL bOK = GetQueuedCompletionStatus(g_hCompletionPort,&dwTrans,(PULONG_PTR)&pPerHandle,&pOverlapped,0);
  if(!bOK)
  {
   Sleep(1);
   continue;
  }
  if (pPerHandle->nOperationType==1)  //只處理接收資料,pPerHandle->buf就是接收到資料的內容,dwTrans為接收到的資料長度
 {

ProcessRecv(pPerHandle->buf,dwTrans);
   WSABUF buf;
   buf.buf = pPerHandle->buf ;
   buf.len = BUFFER_SIZE;//參數2
   pPerHandle->nOperationType = 1;
   DWORD nFlags = 0;//參數4
   ::WSARecv(pPerHandle->s, &buf, 1, &dwTrans, &nFlags, pOverlapped, NULL); //繼續使用WSARecv接收資料

   Sleep(1);
 }

}

這樣一個簡單的使用完成連接埠實現udp接收資料的程式就寫好了

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.