在一个使用完成端口模型的服务器程序中,程序已经创建了完成端口并与接受套接字关联
,然后使用  BOOL GetQueuedCompletionStatus(
  HANDLE CompletionPort,       // the I/O completion port of interest
  LPDWORD lpNumberOfBytesTransferred,
                               // to receive number of bytes 
                               // transferred during I/O
  LPDWORD lpCompletionKey,     // to receive file's completion key
  LPOVERLAPPED *lpOverlapped,  // to receive pointer to OVERLAPPED 
                               // structure
  DWORD dwMilliseconds         // optional timeout value
);查询完成状况.CompletionPort 表示创建的完成端口号 lpNumberOfBytesTransferred表示接收的数据,
lpCompletionKey 表示在进行完成端口与接受套接字关联时传入的值,这些都可以理解,
但是 lpOverlapped 是什么呢?  
typedef struct _OVERLAPPED { // o 
    DWORD  Internal; 
    DWORD  InternalHigh; 
    DWORD  Offset; 
    DWORD  OffsetHigh; 
    HANDLE hEvent; 
} OVERLAPPED
但是我们在使用的时候传入的往往是我们自己定义的值,例如:
typedef struct{
OVERLAPPED   overlapped;
char buffer[4096];
int buffrelen;
int operationtype;
}  PER_IO_DATA;
例如传入的是一个PER_IO_DATA 的数据.(见WINDOWS 网络编程) ,在函数返回后PER_IO_DATA 变量的各个字段是被谁填充的呢??
难道是WINDOWS 吗? 操作系统怎么知道该往我定义的结构的各个字段中填充什么呢??

解决方案 »

  1.   

    当然不是了。是由程序填写的,请仔细看看那个ServerWorkerThread.
      

  2.   

    PER_IO_DATA 是前面定义的一个结构体你也在看《windows网络编程》吗?请把前面的部分耐心看完,你就知道这个结构是从哪里来的了:)
      

  3.   

    呵呵,兄弟,这样理解吧,PER_IO_DATA是你绑定到完成端口时传递的值,书上用这个结构传,不爽,我的做法是总是固定值,工作器线程根据这个可以实现完成包的分支处理,至于那个重叠结构,就是你自己随便定义一个结构,第一个元素就是这个东东,重叠IO前先填好标志值,GetQueuedCompletionStatus返回后,指针转换,得到你自己的指针,还不是想干什么就干什么(因为初始状态你在重叠前就已经搞好了)?