湖南-VC(215735031) 21:58:46
GetQueuedCompletionStatus
你怎么理解这个函数的lpCompletionKey参数的
吉林-小伙 21:59:36
这个?
吉林-小伙 21:59:46
一个I/O完成了
吉林-小伙 21:59:52
这个函数就不阻塞了
湖南-VC(215735031) 22:00:09
再聚焦一下
湖南-VC(215735031) 22:00:29
我指的第三个参数
吉林-小伙 22:00:32
然后这个参数传过来的 就是你投递的那个请求的 对应的那个参数
吉林-小伙 22:00:41
那个结构的指针
武汉-Error<errorcpp@qq.com> 22:00:44
这是接口
吉林-小伙 22:00:50
我也不懂 哈哈
武汉-Error<errorcpp@qq.com> 22:01:06
为了让你舒服点
吉林-小伙 22:01:13
CreateIoCompletionPort 这个指定的
武汉-Error<errorcpp@qq.com> 22:01:26
如果没有这个参数 你肯定会想办法实现类似的效果
湖南-VC(215735031) 22:01:54
我明白它的用途
吉林-小伙 22:01:59
我就用这个参数得到完成I/O的那个socket的
吉林-小伙 22:02:09
你说说
我学学
湖南-VC(215735031) 22:02:12
但还是觉得没有一个形象的词语记住它
吉林-小伙 22:02:14
我对完成端口 完全不会
湖南-VC(215735031) 22:02:28
说键值对,不准确
南昌-贝贝(1125591) 22:02:30
lpCompletionKey : 携带和IO句柄相关的数据
lpOverlapped : 携带和当前这次IO相关的数据
湖南-VC(215735031) 22:02:34
更像是键键
吉林-小伙 22:02:57
贝神 笔记
吉林-小伙 22:02:58
呵呵
湖南-VC(215735031) 22:03:25
key其实比较形象
湖南-VC(215735031) 22:03:28
钥匙,
杭州 -(_少(26062281) 22:03:50
咋又玩上IOCP了
吉林-小伙 21:57:11
靠人格魅力
吉林-小伙 21:57:12
哈哈
湖南-VC(215735031) 21:57:17
算起来我比你开支还多9毛,我喝果粒橙,大瓶的
吉林-小伙 21:57:23
靠激情
吉林-小伙 21:57:50
不吹牛逼了
湖南-VC(215735031) 21:58:46
GetQueuedCompletionStatus
你怎么理解这个函数的lpCompletionKey参数的
吉林-小伙 21:59:36
这个?
吉林-小伙 21:59:46
一个I/O完成了
吉林-小伙 21:59:52
这个函数就不阻塞了
湖南-VC(215735031) 22:00:09
再聚焦一下
湖南-VC(215735031) 22:00:29
我指的第三个参数
吉林-小伙 22:00:32
然后这个参数传过来的 就是你投递的那个请求的 对应的那个参数
吉林-小伙 22:00:41
那个结构的指针
武汉-Error<errorcpp@qq.com> 22:00:44
这是接口
吉林-小伙 22:00:50
我也不懂 哈哈
武汉-Error<errorcpp@qq.com> 22:01:06
为了让你舒服点
吉林-小伙 22:01:13
CreateIoCompletionPort 这个指定的
武汉-Error<errorcpp@qq.com> 22:01:26
如果没有这个参数 你肯定会想办法实现类似的效果
湖南-VC(215735031) 22:01:54
我明白它的用途
吉林-小伙 22:01:59
我就用这个参数得到完成I/O的那个socket的
吉林-小伙 22:02:09
你说说
我学学
湖南-VC(215735031) 22:02:12
但还是觉得没有一个形象的词语记住它
吉林-小伙 22:02:14
我对完成端口 完全不会
湖南-VC(215735031) 22:02:28
说键值对,不准确
南昌-贝贝(1125591) 22:02:30
lpCompletionKey : 携带和IO句柄相关的数据
lpOverlapped : 携带和当前这次IO相关的数据
湖南-VC(215735031) 22:02:34
更像是键键
吉林-小伙 22:02:57
贝神 笔记
吉林-小伙 22:02:58
呵呵
湖南-VC(215735031) 22:03:25
key其实比较形象
湖南-VC(215735031) 22:03:28
钥匙,
杭州 -(_少(26062281) 22:03:50
咋又玩上IOCP了
湖南-VC(215735031) 22:03:50
关联file handle的时候,指定一把钥匙
武汉-Error<errorcpp@qq.com> 22:04:06
贝贝就是贝贝
湖南-VC(215735031) 22:04:10
收到通知的时候,系统还回这把钥匙
武汉-Error<errorcpp@qq.com> 22:04:24
有了这个以后 就不需要自己做map了
武汉-Error<errorcpp@qq.com> 22:04:57
我觉得是这样的 socket handle 要和一个更加抽象的handle 关联起来
湖南-VC(215735031) 22:05:10
map 跟 keyvalue 有得一拼啊
湖南-VC(215735031) 22:05:44
如果hsocket是key, 一个更丰满的结构体是value
武汉-Error<errorcpp@qq.com> 22:05:57
扩展下话题吧
湖南-VC(215735031) 22:06:02
那么系统完成通知后,返回一个丰满的value?
吉林-小伙 22:06:15
今天你可别发会议记录了
吉林-小伙 22:06:16
呵呵
吉林-小伙 22:06:22
我该丢人啦
吉林-小伙 22:06:28
哈哈 不懂完成端口
武汉-Error<errorcpp@qq.com> 22:06:39
异步的socket分成两类
一类是以 socket句柄作为key
一类是以 每次IO动作为key
武汉-Error<errorcpp@qq.com> 22:06:48
貌似我最近半年就这收获
湖南-VC(215735031) 22:06:51
GetQueuedCompletionStatus 有 WSARecv, WSASend驱动
武汉-Error<errorcpp@qq.com> 22:07:04
贝贝刚刚一句话点通了很多
湖南-VC(215735031) 22:07:08
而WSARecv又必须传入有效的hSocket,
武汉-Error<errorcpp@qq.com> 22:07:21
IOCP 对 两种模型 都有key
湖南-VC(215735031) 22:07:20
而这个hSocket又是之前的keyvalue的键
武汉-Error<errorcpp@qq.com> 22:07:29
是滴
武汉-Error<errorcpp@qq.com> 22:08:00
听贝一席话,胜写十年代码
湖南-VC(215735031) 22:08:12
说到底,都是围绕hSocket,
武汉-Error<errorcpp@qq.com> 22:08:35
恩,但是IOCP
武汉-Error<errorcpp@qq.com> 22:08:47
还需要 对每次的投递 标记
武汉-Error<errorcpp@qq.com> 22:08:57
所以就有了 后面那个参数了
武汉-Error<errorcpp@qq.com> 22:09:26
看过一个网络项目的代码
武汉-Error<errorcpp@qq.com> 22:09:32
他是给每个socket句柄
武汉-Error<errorcpp@qq.com> 22:09:41
配一个inbuffer 一个outbuffer
南昌-贝贝(1125591) 22:10:08
完成端口又不是专给 socket 用的
武汉-Error<errorcpp@qq.com> 22:10:13
创建完成端口的时候 把这个对象的地址最为key
杭州 -(_少(26062281) 22:10:25
那还给什么用的
武汉-Error<errorcpp@qq.com> 22:10:41
所有的handle都可以好像
吉林-小伙 22:10:42
我用的时候
吉林-小伙 22:10:45
就弄一个buffer
南昌-贝贝(1125591) 22:10:51
所有IO操作都可以用
湖南-VC(215735031) 22:10:53
说到底都围绕一个file handle
吉林-小伙 22:11:02
嗯
武汉-Error<errorcpp@qq.com> 22:11:02
还可以当作线程池用
杭州 -(_少(26062281) 22:11:09
用 recv send 这些函数 可以吗
南昌-贝贝(1125591) 22:11:22
recv send 是同步的
武汉-Error<errorcpp@qq.com> 22:11:49
recv是伯克利标准的
南昌-贝贝(1125591) 22:11:48
管道我也用IOCP
湖南-VC(215735031) 22:12:10
我想到一个形象点的比喻了。
武汉-Error<errorcpp@qq.com> 22:12:23
啥
杭州 -(_少(26062281) 22:12:32
不是有个函数可以设置的吗
杭州 -(_少(26062281) 22:13:43
难怪上次有个人和我说iocp 不要拘泥于socket
杭州 -(_少(26062281) 22:14:01
学习了 感谢贝神
武汉-Error<errorcpp@qq.com> 22:14:58
LPOVERLAPPED *lpOverlapped,
武汉-Error<errorcpp@qq.com> 22:15:01
这个参数
吉林-小伙 22:15:02
在我还没接触IOCP的时候
这个群里
武汉-Error<errorcpp@qq.com> 22:15:16
一般咋设计的
湖南-VC(215735031) 22:15:17
系统接收一个外部链接套接字,可以比作一张纸条,上面1表示一个编号,把这张纸贴在一个瓶子上,这个瓶子就相当于completionKey, 当系统完成某个动作,相当于把瓶子里注满水,GetQueuedCompletionStatus 的时候是连整个瓶子扔回来的,瓶子上自然有那个sock1标签。
吉林-小伙 22:15:19
就说过N次IOCP不只用于网络
武汉-Error<errorcpp@qq.com> 22:15:20
大伙儿
南昌-贝贝(1125591) 22:15:46
重叠结构由微软内部使用,俺们农村的一般不知道里面干啥的
吉林-小伙 22:15:49
?
湖南-VC(215735031) 22:16:34
哈哈,讨论一下,就加深了印象。 下次再有什么抽象的再跟你们讨论谈论
湖南-VC(215735031) 22:17:19
一系列的操作都是围绕那张纸进行的。
武汉-Error<errorcpp@qq.com> 22:17:31
本期的主题就是 《 IOCP lpCompletionKey湖南VC哥丢失的标签》
吉林-小伙 22:17:33
理解不上去
湖南-VC(215735031) 22:17:40
得, error,别写我。
湖南-VC(215735031) 22:17:45
小伙 哪里不理解
武汉-Error<errorcpp@qq.com> 22:17:47
还没完咧
吉林-小伙 22:17:59
我根本就不懂完成端口
武汉-Error<errorcpp@qq.com> 22:18:00
还没说 怎么标记 每次,,,
吉林-小伙 22:18:02
一点都不懂
武汉-Error<errorcpp@qq.com> 22:18:13
你刚刚标记了 瓶子
湖南-VC(215735031) 22:18:22
hSocket 纸条
lpCompletionKey 瓶子
武汉-Error<errorcpp@qq.com> 22:18:25
现在要标记每次打水的动作
湖南-VC(215735031) 22:18:37
当纸条贴到瓶子的时候,,,
湖南-VC(215735031) 22:18:52
对的
武汉-Error<errorcpp@qq.com> 22:18:55
这个应该是 lpOverlapped的工作了
湖南-VC(215735031) 22:19:05
我想想再怎么把WSARecv关联进来
湖南-VC(215735031) 22:19:29
阿姨,我要一瓶水。
湖南-VC(215735031) 22:19:46
WSARecv ,向系统请求一瓶水
杭州 -(_少(26062281) 22:19:48
我看了一部分关于iocp的资料
武汉-Error<errorcpp@qq.com> 22:20:06
IOCP要用,,,看没什么用的,
杭州 -(_少(26062281) 22:20:18
但是 书上没有 vc 讲的那么生动
湖南-VC(215735031) 22:20:30
你不找阿姨要水, GetQueuedCompletionStatus 怎么会事先知道你要水?还把水瓶丢回给你?
武汉-Error<errorcpp@qq.com> 22:21:01
vc至少沉淀了 6 7年了
恩,要是 post动作
武汉-Error<errorcpp@qq.com> 22:22:55
应该是调酒师
北京—文文(15692091) 22:23:13
北京小程序员求职。。。
有没有要招人的~
吉林-小伙 22:23:11
你们说下这个完成端口的原理呗
吉林-小伙 22:23:19
让我系统学习学习
北京—文文(15692091) 22:23:26
完成端口?
湖南-VC(215735031) 22:23:23
这里阿姨的地方有个小细节
吉林-小伙 22:23:25
用过几次 也不得要领
武汉-Error<errorcpp@qq.com> 22:23:29
你每次要调不同的酒水 都要下单
吉林-小伙 22:23:40
嗯
武汉-Error<errorcpp@qq.com> 22:23:49
每个客户 有自己的杯子
湖南-VC(215735031) 22:24:00
你要,如果之前你要过一次,她没给完,这次她就会告诉你,0,还有水你没接完呢
吉林-小伙 22:25:33
MSDN的例子 有木有?
吉林-小伙 22:25:45
IOCP的
吉林-小伙 22:25:43
搜哪个API可以搜到
湖南-VC(215735031) 22:25:54
小伙你哪里不懂
吉林-小伙 22:26:11
我不明白为什么用完成端口 会提高效率
吉林-小伙 22:26:26
咱们从头开始?
武汉-Error<errorcpp@qq.com> 22:26:39
OS维护线程池
湖南-VC(215735031) 22:26:41
最明显的是 ring3 到 ring0的缓存交换
湖南-VC(215735031) 22:27:00
这里至少精简了一些细节
武汉-Error<errorcpp@qq.com> 22:27:04
数据不一定,这个就算不iocp也有办法优化
北京—文文(15692091) 22:27:08
小伙 你找贝贝
北京—文文(15692091) 22:27:27
我那个时候学完成端口也看不懂
武汉-Error<errorcpp@qq.com> 22:27:26
我觉得是线程池
湖南-VC(215735031) 22:27:27
可以从头开始, 按你提问的方式
吉林-小伙 22:27:33
好的
湖南-VC(215735031) 22:27:38
刚我是说给自己,和听得懂的人的
吉林-小伙 22:27:55
首先 我创建一个完成端口
武汉-Error<errorcpp@qq.com> 22:27:58
小伙和VC的基情
湖南-VC(215735031) 22:28:46
恩,返回了一个句柄,创建Ok,
湖南-VC(215735031) 22:28:52
这个没什么疑问把
吉林-小伙 22:29:12
嗯 拿socket说
湖南-VC(215735031) 22:29:42
哪一步了
湖南-VC(215735031) 22:30:08
有外部连接进来,准备关联?
吉林-小伙 22:30:19
稍等
吉林-小伙 22:30:22
我组织下语言
吉林-小伙 22:30:26
杭州 -(_少(26062281) 22:30:33
ACCEPTEX
吉林-小伙 22:30:36
socket我理解成一个文件吧
吉林-小伙 22:30:37
呵呵
湖南-VC(215735031) 22:30:41
可以
吉林-小伙 22:30:44
这样好说一点
吉林-小伙 22:30:44
嗯
杭州 -(_少(26062281) 22:30:44
是不
吉林-小伙 22:31:12
创建完成端口返回那个句柄 就是 对这个文件进行IO的一个通道
吉林-小伙 22:31:28
比如文件是一个瓶子
吉林-小伙 22:31:39
那这个句柄就是瓶口的标志
吉林-小伙 22:31:48
这样理解有问题不?
湖南-VC(215735031) 22:32:07
问题是没有,只是接下去会很复杂
杭州 -(_少(26062281) 22:32:35
关联端口
杭州 -(_少(26062281) 22:32:43
是不
吉林-小伙 22:33:05
没事 继续
湖南-VC(215735031) 22:33:13
你文件是一个瓶子,那你跟创建完成的端口关联的时候的关系很模糊
湖南-VC(215735031) 22:33:38
你上面的例子,瓶子不是独立的,把完成端口当成瓶口, 牵扯太复杂了
吉林-小伙 22:33:40
文件就是一个容器
广州-FEEL(515873448) 22:33:47
哈哈哈哈哈哈…
(来自iPhone QQ:http://mobile.qq.com/v/)
武汉-Error<errorcpp@qq.com> 22:33:51
是句柄
吉林-小伙 22:33:52
用来存储各样的数据的
吉林-小伙 22:34:17
要不咱俩私聊吧
吉林-小伙 22:34:18
哈哈
湖南-VC(215735031) 22:34:16
恩,
这是对的
湖南-VC(215735031) 22:34:23
只是你换个比喻形式
吉林-小伙 22:34:24
怕有些人烦
杭州 -(_少(26062281) 22:34:52
我也学习下
杭州 -(_少(26062281) 22:35:00
我有些地方没看懂
杭州 -(_少(26062281) 22:35:04
书上
吉林-小伙 22:35:05
创建完成后
杭州 -(_少(26062281) 22:35:12
vc 写的很生动 哈哈
吉林-小伙 22:35:20
要用一个线程来等待客户端的请求
武汉-Error<errorcpp@qq.com> 22:35:31
今天的mvp
杭州 -(_少(26062281) 22:35:37
这个一般算是主线程把
杭州 -(_少(26062281) 22:35:46
用来启动 其他的线程
吉林-小伙 22:35:49
少 不要纠结那些小事
吉林-小伙 22:35:54
杭州 -(_少(26062281) 22:35:55
额
杭州 -(_少(26062281) 22:35:56
好
吉林-小伙 22:36:20
客户端请求连接了 然后呢?
吉林-小伙 22:36:33
然后WSARecv投递请求?
湖南-VC(215735031) 22:36:41
你关联这块还没解释清楚呢
湖南-VC(215735031) 22:36:47
跳过去,会越来越模糊的
吉林-小伙 22:37:01
把完成端口和文件关联起来
吉林-小伙 22:37:07
用的不就是Createxxxxxxxxxxxx吗?
湖南-VC(215735031) 22:37:08
就是接收连接后,准备工作要做好
湖南-VC(215735031) 22:37:34
恩,你说的是“关联”,还是真的能具体到细节呢
吉林-小伙 22:37:50
具体细节
吉林-小伙 22:38:00
私聊吧
吉林-小伙 22:38:03
这里说太烦了
湖南-VC(215735031) 22:38:05
我反问你,为什么要关联,关联以后在哪里使用
吉林-小伙 22:38:12
OK
湖南-VC(215735031) 22:38:25
可以
武汉-Error<errorcpp@qq.com> 22:39:49
火神大大的坏
武汉-Error<errorcpp@qq.com> 22:39:53
一个去学了,,,
吉林-小伙 22:40:04
武汉-Error<errorcpp@qq.com> 22:40:36
就这么点我先发博客去算了
武汉-Error<errorcpp@qq.com> 22:40:36
就这么点我先发博客去算了
杭州 -(_少(26062281) 22:40:56
关联以后 就为什么要WSARECV
杭州 -(_少(26062281) 22:41:09
不是有线程吗
南昌-贝贝(1125591) 22:41:39
读是被动的
南昌-贝贝(1125591) 22:41:50
被动操作要投递请求
武汉-Error<errorcpp@qq.com> 22:43:13
貌似只有IOCP 和 overlaped 的 发送
武汉-Error<errorcpp@qq.com> 22:43:17
是投递的
武汉-Error<errorcpp@qq.com> 22:43:30
其他几个异步 发送都是同步
杭州 -(_少(26062281) 22:44:18
杭州 -(_少(26062281) 22:44:34
杭州 -(_少(26062281) 22:44:42
书上的代码
杭州 -(_少(26062281) 22:44:57
一个是主线程中的
北京—文文(15692091) 22:45:07
贝贝 为啥当初我问你的时候你就只给我两页代码让我自己看呢~~
杭州 -(_少(26062281) 22:45:07
一个是线程里面的
杭州 -(_少(26062281) 22:45:21
::WSARecv(pPerHandle->s, &buf, 1, &dwTrans, &nFlags, &pPerIO->ol, NULL);
杭州 -(_少(26062281) 22:45:28
都有这个函数
南昌-贝贝(1125591) 22:45:28
完成端口吗? re:文文
武汉-Error<errorcpp@qq.com> 22:45:30
应为缺乏讨论环境
杭州 -(_少(26062281) 22:45:37
接受有什么不同
武汉-Error<errorcpp@qq.com> 22:45:39
这也是为啥我喜欢在群里边说
武汉-Error<errorcpp@qq.com> 22:45:48
不喜欢私聊的原因
杭州 -(_少(26062281) 22:45:58
我就卡在这个地方 其他都理解了
武汉-Error<errorcpp@qq.com> 22:46:00
群聊是发散的
杭州 -(_少(26062281) 22:46:07
求教
武汉-Error<errorcpp@qq.com> 22:46:33
我的个人理解
南昌-贝贝(1125591) 22:46:39
投递一个异步读,在完成时会添加完成端口队列
武汉-Error<errorcpp@qq.com> 22:46:55
你post以后 由OS后台去帮你 做实际的操作
武汉-Error<errorcpp@qq.com> 22:47:09
然后你通过Get××× 获取到这个结果
武汉-Error<errorcpp@qq.com> 22:47:17
如果不用IOCP
武汉-Error<errorcpp@qq.com> 22:47:46
你就要自己维护post队列 自己用线程池操作 自己枷锁 然后还是类似的 自己写一个 Get××
杭州 -(_少(26062281) 22:47:57
也就是说 主线程中的WSARecv 是投递到队列中的
武汉-Error<errorcpp@qq.com> 22:48:30
贝贝比较权威
南昌-贝贝(1125591) 22:49:43
所有被动操作,心须保持总是存在请求,(完成了立即投递新请求)
杭州 -(_少(26062281) 22:49:50
这个句话 要记录下来
杭州 -(_少(26062281) 22:50:58
对照代码看
杭州 -(_少(26062281) 22:51:02
我理解下
武汉-Error<errorcpp@qq.com> 22:51:16
你们说伙神是不是大大的坏