完成端口

来源:互联网 发布:什么是软件系统 编辑:程序博客网 时间:2024/06/05 03:14

CreateIoCompletionPort:

CreateIoCompletionPort函数关联一个已打开的文件实例和新建的或已存在的I/0完成端口,或者创建一个未关联任何文件的I/O完成端口。

该函数两个明显作用:

1. 用于创建一个完成端口对象。
2. 将一个句柄同完成端口关联到一起,
创建一个I/O完成端口对象,用它面向任意数量的套接字句柄,管理多个I/O请求

即该函数的两个明显作用是:即可以用该函数创建一个完成端口对象(该IO对象可以在创建时不关联任何对象),又可以用该函数将一个已经创建的对象关联到完成端口上。

MSDN解释:

     The CreateIoCompletionPort function can associate an instance of an opened file with a newly created or an existing input/output (I/O) completion port; or it can create an I/O completion port without associating it with a file.

FileHandle
Handle to a file opened for overlapped I/O completion. You must specify the FILE_FLAG_OVERLAPPED flag when using theCreateFile function to obtain the handle.

If FileHandle specifies INVALID_HANDLE_VALUE, CreateIoCompletionPort creates an I/O completion port without associating it with a file. In this case, theExistingCompletionPort parameter must be NULL, and theCompletionKey parameter is ignored.

CompletionKey
      与 CreateIoCompletionPort 中的 LpCompletionKey 对应。
      lpCompletionKey 也被叫成“每句柄数据”, 它与句对应,一個句柄一个结构体。
      lpOverlapped 也叫 "每IO数据",也就是每次 IO 用一個
      lpCompletionKey  保存一些连接相关的数据,lpOverlapped 保存操作相关的数据。

      比如一個 socket 连接,它上面可能有N个异步的 WSARecv 或 WSASend....

      指定一个句柄唯一(PER_HANDLE)数据,它将与FILEHANDLE套接字句柄关联在一起,应用程序可以在此存储任意类型的信息,通常是一个指针。CompletionKey通常用来描述与套接字相关的信息,所以它为句柄唯一(per_handle)数据。

PER_IO_DATA和PER_HANDLE_DATA

typedef struct _PER_HANDLE_DATA  
{  
    SOCKET sock;  
    sockaddr_in si;  
}PER_HANDLE_DATA,*PPER_HANDLE_DATA;  
 
 
typedef struct _PER_IO_DATA  
{  
    OVERLAPPED overlapped;  
    WSABUF wsabuf;  
    char buffer[BUFFER_SIZE];  
    int operationType;  
}PER_IO_DATA,*PPER_IO_DATA; 

原创粉丝点击