1.这个类型实际是由你自己指定的,因为投递的时候你可以传递一个对象,你完全可以在这个对象结构里面设置,首先你要创建一个结构体,
这个结构体第一个变量需要是OVERLAPPED类型,然后第二个变量你可以用来指定你投递的类型,例如下面这样:
typedef struct
{
OVERLAPPED overlapped;
int operationType; //0读数据,1写数据,2新的连接
WSABUF databuff;
char *buffer;
u_long BufferLen;
}PER_IO_OPERATEION_DATA,*LPPER_IO_OPERATION_DATA,*LPPER_IO_DATA,PER_IO_DATA;
具体使用方式:
1)
LPPER_IO_OPERATION_DATA PerIoData=new PER_IO_OPERATEION_DATA;
ZeroMemory(&(PerIoData->overlapped),sizeof(OVERLAPPED));
PerIoData->operationType=2;//我设置了一个投递消息,这个消息是接收新连接,其他参数设置省略
//调用函数投递接收新连接的消息,可以看到这个结构作为最后一个参数传递进了函数。
lpfnAcceptEx(listenSocket, AcceptSocket, PerIoData->buffer,
0,sizeof (sockaddr_in) + 16, sizeof (sockaddr_in) + 16,
&dwBytes, &PerIoData->overlapped);
2)当你调用GetQueuedCompletionStatus接收到一个消息的时候
GetQueuedCompletionStatus(m_hIocp, &BytesTransferred, (PULONG_PTR)&info, (LPOVERLAPPED*)&IpOverlapped, 500);
PerIoData = (LPPER_IO_DATA)CONTAINING_RECORD(IpOverlapped, PER_IO_DATA, overlapped);
这样就得到你投递的结构,你会发现PerIoData. operationType==2,你就知道这是一个新连接请求。
2:如1,当GetQueuedCompletionStatus函数返回的PerIoData. operationType==0你知道这是可读消息投递,可读的数据存放是在调用WSARecv时指定的。
3.读或写的数据应该放在 LPPER_IO_OPERATION_DATA结构。
4. lpfnAcceptEx、WSARecv、WSASend都可以叫做投递消息,当你调用lpfnAcceptEx函数,那么当有新的连接来临时,会通过
GetQueuedCompletionStatus函数获取到,这时候你应该调用WSARecv接收此套接字的读信号,同时投递一个lpfnAcceptEx等待新的
套接字连接。