首页>
知识库>
详情

请教iocp封装的getmessage()怎么实现

2020-08-04 来源:CloudBest 阅读量: 0
关键词:

    大家好,我是新手我在对完成端口进行学习时遇到一个没有想明白的[来源:GameRes.com]问题望知道的达人指出小的不明白这处。先上一代伪代码

    bool CNetServer::Create(int iPort)

    {

    WSADATA wsaData;

    WSAStartup(MAKEWORD(2,2), &wsaData);

    CreateIoCompletionPort(INVALID_HANDLE_value, NULL, 0, 0 );

    _beginthreadex(0, 0, WorkerThread , this, CREATE_SUSPENDED, &nThreadID);

    //创建服务器

    SOCKET ListenSocket;

    struct sockaddr_in ServerAddress;

    ListenSocket = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);

    ZeroMemory((char *)&ServerAddress, sizeof(ServerAddress));

    ServerAddress.sin_family = AF_INET;

    ServerAddress.sin_addr.s_addr = INADDR_ANY;

    ServerAddress.sin_port = htons(iPort);

    bind(ListenSocket, (struct sockaddr *) &ServerAddress, sizeof(ServerAddress)))

    listen(ListenSocket, SOMAXCONN))

    g_hAcceptThread = CreateThread(0, 0, AcceptThread, (void *)ListenSocket, 0, &nThreadID);

    return true;

    }

    unsigned int __stdcall CNetServer::WorkerThread(LPVOID pParam)

    {

    while(true)

    {

    BOOL bReturn = GetQueuedCompletionStatus(

    g_hIOCompletionPort,

    &dwBytesTransfered,

    (LPDWORD)&lpContext,

    &pOverlapped,

    INFINITE);

    switch (pClientContext->GetOpCode())

    {

    case OP_READ:

    {

    //读到数据(此处得到的数据,可以送至应用屋处理)

    //下次投递

    nBytesRecv = WSARecv(pClientContext->GetSocket(), p_wbuf, 1,&dwBytes, &dwFlags, p_ol, NULL);

    }

    break;

    case OP_WRITE:

    {

    //发送数据

    nBytesSent = WSASend(pClientContext->GetSocket(), p_wbuf, 1, &dwBytes, dwFlags, p_ol, NULL);

    }

    break;

    default:

    break;

    } //end switch

    } //end while

    }

    Bool  CNetServer::SendMsg(pClientContext->GetSocket(), pvoid Msg, int nSize)

    {

    PostQueuedCompletionStatus(OP_SEND);

    }

    Bool  CNetServer::GetMsg()

    {

    }

    以上是我初步构想…Getmsg()和SendMsg()为应用屋收发数据时的接口…请问这两个接口该怎么实现(),WorkerThread()线程在接收到数据时为主动推送…但我想由应用层来触发调用…我似乎对这个模型理解有误…忘大牛们解释一下。不甚感激…