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

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

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

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

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

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

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

  • 写回答

2条回答 默认 最新

  • 十一夜飞天 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等待新的
    套接字连接。
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵