18,356
社区成员
发帖
与我相关
我的任务
分享
// 这函数用于创建IOCP的ServerSocket.
void IocpServerSocket::startServer(DataManage * elem)
{
this -> IocpServerSocket::setDataManage(elem); // 按照最传统的流程来的啦~
this -> IocpServerSocket::createIocpHandle();
this -> IocpServerSocket::createWordThread();
this -> BaseSocket::createTcpSocket();
this -> ServerSocket::sbind();
this -> ServerSocket::slisten();
this -> IocpServerSocket::createAcceptClientThread();
return;
}
// 用于接收客户端Socket的线程
DWORD WINAPI IocpServerSocket::acceptClientThread(LPVOID IpParam)
{
IocpServerSocket * myIocp = (IocpServerSocket *) IpParam;
BaseSocket accClient;
while(true){
if(myIocp -> acceptClientSocket(accClient)){ // 接收客户端
myIocp -> connectClientIocp(accClient); // 客户端连接IOCP
myIocp -> createSocketRevRequest(accClient); // 创建从客户端的IOCP接收数据请求
if(NULL != myIocp->dataManage){
myIocp->dataManage->afterAcceSock(accClient);
}
}
}
return 0;
}
int IocpServerSocket::connectClientIocp(const BaseSocket & elem)
{
// 创建用来和套接字关联的单句柄数据信息结构
BaseSocket * information = new BaseSocket(elem); // 再创指针是因为得将信息存放于(内存)堆中,删除操作将在数据获取函数中进行处理
// 将接受套接字和完成端口关联
HANDLE result = CreateIoCompletionPort((HANDLE)(information->getSocket()), completionPort, (DWORD)information, 0);
// ...
return 1;
}
int IocpServerSocket::createSocketRevRequest(const BaseSocket & elem)
{
// 为投递I/O操作指定OVERLAPPED结构,在堆中创建好对象,准备在接收数据时再读取这对象的首地址
PerIoData * data = new PerIoData();
data -> operationType = PerIoData::readData;
data -> dataBuff.buf = data -> charBuf;
data -> dataBuff.len = PerIoData::defaultBufSize;
data -> dataByte = PerIoData::defaultBufSize;
DWORD Flags = 0; // 这数据很重要,在传参时不能删除,
int r = WSARecv(elem.getSocket(), &(data->dataBuff), 1, &data->dataByte, &Flags, &(data -> overlapped), NULL);
if(SOCKET_ERROR == r){
// #ifdef IO_STANDARD_STREAM_INFORMATION
std::cerr << "createSocketRevRequest Error:" << GetLastError() << std::endl;
system("pause");
// #endif
}
return r;
}
class PerIoData
{
public:
enum optType{
readData, // 读数据
writeData, // 写数据
rAwData, // 读写数据
undoData // 禁止操作
};
enum defaultPara{
defaultBufSize = 1024
};
public:
OVERLAPPED overlapped;
WSABUF dataBuff;
DWORD dataByte;
char charBuf[defaultBufSize];
int operationType;
int sn; // 数据成员记录序列号
public:
PerIoData();
PerIoData(const PerIoData &);
PerIoData(const OVERLAPPED &, const WSABUF &, DWORD, char buf[defaultBufSize], int &);
void setCharBuf(const char buf[defaultBufSize], int); // 设置charBuf
char * getCharBuf(char buf[defaultBufSize], int); // 获取charBuf
// 类复制
void ownDeepCopy(const PerIoData&);
PerIoData & operator = (const PerIoData &);
~PerIoData();
};