完成端口例子

转载 2006年05月18日 18:04:00

完成端口例子

                                      

 

#include "stdafx.h"

 

#include <iostream.h>

 

#include

 

#include

 

#include

 

 

#define PORT 5150

 

#define DATA_BUFSIZE 8192

 

 

typedef struct

 

{

 

  OVERLAPPED OVerlapped;

 

  WSABUF DATABuf;

 

  CHAR Buffer[DATA_BUFSIZE];

 

  DWORD BytesSend,BytesRecv;

 

}PER_IO_OPERATION_DATA, *LPPER_IO_OPERATION_DATA;

 

 

typedef struct

 

 {

 

  SOCKET Socket;

 

}PER_HANDLE_DATA,*LPPER_HANDLE_DATA;

 

 

 

DWORD WINAPI ServerWorkerThread(LPVOID ComlpetionPortID);

 

 

int main(int argc, char* argv[])

 

{

 

       SOCKADDR_IN InternetAddr;

 

  SOCKET Listen,Accept;

 

  HANDLE CompetionPort;

 

  SYSTEM_INFO SystenInfo;

 

  LPPER_HANDLE_DATA PerHandleData;

 

  LPPER_IO_OPERATION_DATA PerIOData;

 

  int i;

 

  DWORD RecvBytes;

 

  DWORD Flags;

 

  DWORD ThreadID;

 

  WSADATA wsadata;

 

  DWORD Ret;

 

 

 

  if (Ret = WSAStartup(0x2020,&wsadata) != 0)

 

  {

 

    printf("WSAStartup failed with error %d/n",Ret);

 

    return 0;

 

  }

 

 

 

   //打开一个空的完成端口

 

  if ((CompetionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,0,0)) == NULL)

 

  {

 

    printf("CreateIoCompletionPort failed with error %d/n",GetLastError());

 

    return 0;

 

  }

 

 

 

  GetSystemInfo(&SystenInfo);

 

  

 

  // 开启cpu个数的2倍个的线程

 

  for (i=0; i < SystenInfo.dwNumberOfProcessors*2; i++)

 

  {

 

    HANDLE ThreadHandle;

 

    //创建服务器工作线程,并且向线程传送完成端口

 

    if ((ThreadHandle = CreateThread(NULL,0,ServerWorkerThread,CompetionPort,0,&ThreadID)) == NULL)

 

    {

 

      printf("CreateThread failed with error %d/n" ,GetLastError());

 

      return 0;

 

    }

 

    CloseHandle(ThreadHandle);

 

  }

 

 

 

  //打开一个服务器socket

 

  if ((Listen = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET)

 

  {

 

    printf("WSASocket() failed with error %d/n", WSAGetLastError());

 

    return 0;

 

  }

 

 

 

  InternetAddr.sin_family = AF_INET;

 

  InternetAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

 

  InternetAddr.sin_port = htons(PORT);

 

 

 

  if (bind(Listen,(LPSOCKADDR)&InternetAddr,sizeof(InternetAddr)) == SOCKET_ERROR)

 

  {

 

    printf("bind failed with error %d/n",WSAGetLastError());

 

    return 0;

 

  }

 

 

  if (listen(Listen,5) == SOCKET_ERROR)

 

  {

 

    printf("listen failed with error %d/n",WSAGetLastError());

 

    return 0;

 

  }

 

 

  //接收连接并且分发给完成端口

 

  while (TRUE)

 

  {

 

    if ((Accept = WSAAccept(Listen,NULL,NULL,NULL,0)) == SOCKET_ERROR)

 

    {

 

      printf("WSAAccept failed with error %d/n",WSAGetLastError());

 

      return 0;

 

    }

 

 

    //创建与套接字相关的套接字信息结构

 

    if ((PerHandleData = (LPPER_HANDLE_DATA)GlobalAlloc(GPTR,sizeof(PER_HANDLE_DATA))) == NULL)

 

    {

 

      printf("GlobalAlloc failed with error %d/n",GetLastError());

 

      return 0;

 

    }

 

   

 

    // Associate the accepted socket with the original completion port.

 

    printf("Socket number %d connected/n",Accept);

 

    PerHandleData->Socket = Accept;//结构中存入接收的套接字

 

   

 

    //与我们的创建的那个完成端口关联起来,将关键项也与指定的一个完成端口关联

 

    if ((CreateIoCompletionPort((HANDLE)Accept,CompetionPort,(DWORD)PerHandleData,0)) == NULL)

 

    {

 

      printf("CreateIoCompletionPort failed with error%d/n",GetLastError());

 

      return 0;

 

    }

 

 

    // 创建同下面的WSARecv调用相关的IO套接字信息结构体

 

    if ((PerIOData = (LPPER_IO_OPERATION_DATA)GlobalAlloc(GPTR,sizeof(PER_IO_OPERATION_DATA))) = NULL)

 

    {

 

      printf("GlobalAloc failed with error %d/n",GetLastError());

 

      return 0;

 

    }

 

    ZeroMemory(&(PerIOData->OVerlapped),sizeof(OVERLAPPED));

 

    PerIOData->BytesRecv = 0;

 

    PerIOData->BytesSend = 0;

 

    PerIOData->DATABuf.len = DATA_BUFSIZE;

 

    PerIOData->DATABuf.buf = PerIOData->Buffer;

 

    Flags = 0;

 

 

    if (WSARecv(Accept,&(PerIOData->DATABuf),1,&RecvBytes,&Flags,&(PerIOData->OVerlapped),NULL) == SOCKET_ERROR)

 

    {

 

     if (WSAGetLastError() != ERROR_IO_PENDING)

 

     {

 

       printf("WSARecv() failed with error %d/n",WSAGetLastError());

 

       return 0;

 

     }

 

    }

 

  }

 

  return 0;

 

}

 

 工作者线程见下文

完成端口通信例子

 代码贴上来以后慢慢修改 服务端代码: #include #define BUFFER_SIZE 1024 #define OP_READ 18 #define OP_WRITE ...
  • cuijinquan
  • cuijinquan
  • 2014年01月20日 14:31
  • 990

完成端口(iocp)的一个例子

 来自微软的完成端口例子,就讲解一下它的使用套路吧反正编程这个玩意,只要用过,自然就知道什么回事,一次不会再看一次,学习这个玩意,无他,勤奋而已。奢谈效率等等,那只是孰能生巧上的功夫。  这个例子是在...
  • lincyang
  • lincyang
  • 2010年08月25日 16:02
  • 2062

IOCP完整例子

本文是我在学习IOCP的时候,第一次写一个完整的例子出来,当然了,参考了CSDN上一些朋友的博客,大部分都是按照他们的思路写的,毕竟我是初学者,参考现成的学起来比较快。当然了,真正用到项目中的IOCP...
  • zhujunxxxxx
  • zhujunxxxxx
  • 2014年02月28日 09:58
  • 2287

socket编程之完成端口(附一个简单的IOCP例子)

“完成端口”模型是迄今为止最为复杂的—种I/O模型。然而。假若—个应用程序同时需要管理为数众多的套接字,那么采用这种模型。往往可以达到最佳的系统性能,然而不幸的是,该模型只适用于以下操作系统(微软的)...
  • yangfm315
  • yangfm315
  • 2011年06月17日 17:49
  • 2634

来自微软的完成端口例子C++

来自微软的完成端口例子,就讲解一下它的使用套路吧 反正编程这个玩意,只要用过,自然就知道什么回事,一次不会再看一次,学习这个玩意,无他,勤奋而已。 奢谈效率等等,那只是孰能生巧上的功夫。 ...
  • syy063
  • syy063
  • 2011年08月09日 14:32
  • 1166

完成端口的Win32实例及ACE实现对比

 完成端口(IOC)是用来实现高性能服务的一种常用方法,主要是通过操作系统提供的异步调用功能实现IO操作,可以通过很少的线程数实现高性能的并发服务。ACE的前摄器(Proactor)模式在Window...
  • stephenxu111
  • stephenxu111
  • 2008年05月15日 19:11
  • 3911

IOCP 浅析与实例

这一年半来一直在做游戏项目逻辑层,学会了不少东西,觉得自己应该看看服务器底层的东西了,主要的东西就是网络模块,网络模块是沿用以前项目的,在 我们项目中被我们头改动过几次,现在还是比较稳定的。因为是Wi...
  • liujiayu2
  • liujiayu2
  • 2015年06月10日 19:15
  • 586

I/O完成端口简单例子

转载于:http://www.cnblogs.com/pen-ink/articles/1834088.html HANDLE WINAPI CreateIoCompletionPort(   _...
  • afei198409
  • afei198409
  • 2013年12月17日 17:16
  • 482

用完成端口(iocp) 写的一个简单的服务端例子

下面是用完成端口写的一个简单的 例子, 完成端口和重叠io 一样都是异步io。 代码如下。欢迎大家建议 改进、...
  • billiejeannotmylover
  • billiejeannotmylover
  • 2014年01月11日 00:54
  • 1423

IOCP例子二

#include #include #include #include #include #include #pragma comment(lib, "ws2_32.lib") #prag...
  • qq125096885
  • qq125096885
  • 2016年05月22日 00:02
  • 239
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:完成端口例子
举报原因:
原因补充:

(最多只允许输入30个字)