在一个使用完成端口模型的服务器程序中,程序已经创建了完成端口并与接受套接字关联
,然后使用 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 吗? 操作系统怎么知道该往我定义的结构的各个字段中填充什么呢??
,然后使用 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 吗? 操作系统怎么知道该往我定义的结构的各个字段中填充什么呢??
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货