weixin_44999711
黑名_單
2019-05-13 15:45
采纳率: 100%
浏览 360

iocp网络编程问题,流程不太清楚

请教一下各位,我看那个iocp有点看不懂,整理几个问题,麻烦知道的高手指导一下,谢谢。

1:工作线程在GetQueuedCompletionStatus得到事件了以后,事件的种类比如说发送或接收是在哪里设定的,很困惑。

2:如果工作线程想要接收数据他是调用WSARecv函数接收呢还是iocp会自己去接收然后接收到了再通知工作线程?

3:在有多个客户端的情况下,工作线程是怎么区分每个不同的客户端的工作的,比如说有些要上传,有些要下载,难道是每次从GetQueuedCompletionStatus获取数据以后,这样的每个数据里面还有工作指令来表示他是上传或是下载?

4:投递请求是什么意思,是指对iocp调用非阻塞函数调用了马上返回剩下的工作交给iocp去做是吗?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • jonahking2012
    十一夜飞天 2019-05-14 11:16
    已采纳

    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等待新的
    套接字连接。
    
    点赞 评论
  • dabocaiqq
    dabocaiqq 2019-05-13 23:44
    点赞 评论

相关推荐