VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 653|回复: 9

IOCP中,为什么 我的 GetQueuedCompletionStatus 不返回?

[复制链接]

2

主题

6

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-1-19 19:20:01 | 显示全部楼层 |阅读模式
我用
(1)accept 接受了连接
(2)CreateIoCompletionPort()把连接加入 完成端口
为什么客户端(telnet)连上后, GetQueuedCompletionStatus 不返回?

回复

使用道具 举报

0

主题

70

帖子

42.00

积分

新手上路

Rank: 1

积分
42.00
发表于 2020-1-27 10:54:01 | 显示全部楼层
服务器端接受了客户端的连接以后投递了接收操作吗?
回复

使用道具 举报

2

主题

6

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
 楼主| 发表于 2020-1-27 18:27:01 | 显示全部楼层
请教楼上的,何为: "投递了接收操作"?
回复

使用道具 举报

0

主题

70

帖子

42.00

积分

新手上路

Rank: 1

积分
42.00
发表于 2020-1-27 20:18:01 | 显示全部楼层
WSARecv 操作,你做了吗
回复

使用道具 举报

0

主题

24

帖子

19.00

积分

新手上路

Rank: 1

积分
19.00
发表于 2020-2-2 11:27:01 | 显示全部楼层
代码呢?
可以读一下Windows网络编程
或访问
www.codeproject.com/internet
回复

使用道具 举报

2

主题

6

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
 楼主| 发表于 2020-2-6 23:00:02 | 显示全部楼层
兄弟们,贴代码很多,太烦,我用了 爱德华德 的建议,现流程变成
1. 当有连接时 accept
2. WSARecv()  -- 返回 997
3. 调用 CreateIoCompletionPort() 把 acceptedSock 加入到 完成端口

4. 在工作线程中, GetQueuedCompletionStatus()返回后,调用 WSARecv(), 总是返回997

何解?
回复

使用道具 举报

0

主题

70

帖子

42.00

积分

新手上路

Rank: 1

积分
42.00
发表于 2020-2-7 02:45:01 | 显示全部楼层
WSARecv 返回 997 是正常的
回复

使用道具 举报

0

主题

70

帖子

42.00

积分

新手上路

Rank: 1

积分
42.00
发表于 2020-2-7 06:30:01 | 显示全部楼层
不是错误,这是完成端口的特性
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-2-15 10:15:01 | 显示全部楼层
1. 当有连接时 accept
2. WSARecv()  -- 返回 997
3. 调用 CreateIoCompletionPort() 把 acceptedSock 加入到 完成端口

==>

1. 当有连接时 accept
2. 调用 CreateIoCompletionPort() 把 acceptedSock 加入到 完成端口
3. WSARecv()  -- 返回 997
回复

使用道具 举报

2

主题

6

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
 楼主| 发表于 2020-2-21 14:00:01 | 显示全部楼层
谢谢大家的帮忙,我终于想前进了一大步,可以接收到客户端的数据了。我发现在accept之后调用的WSARecv()  相当于设置缓冲区等东西,GetQueuedCompletionStatus 就利用这些东西填补缓冲。 如果缓冲区够大,GetQueuedCompletionStatus() 之后的 WSARecv() 都不是必须的,反之如果缓冲不够大,WSARecv()就是必须的了,而且每次WSARecv()之后就会影响 GetQueuedCompletionStatus() 的缓冲。
还没有搞清楚 IOCP 的所有内幕,但是已经是向前进了。

to  xop000:
  我也觉得应该是你说顺序,但是我按照前一个顺序还是可以执行。估计是 Winsock 的函数足够聪明 ? 在 WSARecv()调用时在系统中存了信息,所以之后调用 CreateIoCompletionPort() 也能够正常 IO ?
  有高手来分享一下内幕吗?



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表