// IOCP_Learn.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <WinSock2.h>
// 根據某結構體中一個成員的地址,計算出外層結構體的地址
//CONTAINING_RECORD
class CTest_CONTAINING_RECORD
{
public:
void Test()
{
CTest_CONTAINING_RECORD* pTest = CONTAINING_RECORD(&m_i, CTest_CONTAINING_RECORD, m_i);
std::cout << reinterpret_cast<unsigned int>(this) << std::endl;
std::cout << reinterpret_cast<unsigned int>(pTest) << std::endl;
}
private:
int m_i;
};
//OVERLAPPED
namespace iocp
{
enum EM_IOCP_OP_TYPE
{
emIOCP_POST_SEND = 0,
emIOCP_POST_ASYNC_RECV,
emIOCP_POST_ACCEPT,
emIOCP_DISSCONNECT
};
};//~ end of namespace iocp
// 直接繼承OVERLAPPED,根據C++對象的內存布局可以確定stIOCP_OVERLAPPED和static_cast<OVERLAPPED>(obj_stIOCP_OVERLAPPED)
// 是一樣的
struct stIOCP_OVERLAPPED : public OVERLAPPED
{
WSABUF wsabuf;
EM_IOCP_OP_TYPE optype;
};
// 還有一個是關聯的key,沒有提到,以及關聯socket句柄和完成提示
int _tmain(int argc, _TCHAR* argv[])
{
CTest_CONTAINING_RECORD test;
test.Test();
return 0;
}