VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 130|回复: 8

关于AccpetEx的问题,老大帮一下小弟吧

[复制链接]
35_avatar_middle
最佳答案
0 
online_vip 发表于 2020-2-23 18:53:54 | 显示全部楼层 |阅读模式
完成端口的时候,使用了AccpetEx。

        我发现一些源码,初始化的时候
for( int i=0;i<2000;i++)
{
     SCOKET m_ClientScoket = WASaccpet(.....);
     PRE_IO_DATA* pIO = new PRE_IO_DATA
     ~~~~~~
     ~~~~~~
     pIO->typefale = SO_ACCPET;
     AccpetEx(m_ListenSocket,m_ClientScoket ,...........,&pIO->vo);
}

这个是预先申请客户端套接字,来的时候直接上就好了。

现在有一个问题想请教一下:
       如果初始化我只申请一个客户端套接字(注意:我只申请一个),就这样子一直不断的有客户端链接过来,完全正常,没问题。过了一会以后,第1500个客户链接的时候链接成功了,套接字关联端口也成功了,但是在SO_ACCPET出现了AccpetEx函数失败,那我请问一下,第1501个客户链接过来的话,会成功吗?




上一篇:取消按钮的回复
下一篇:C++第五课问题。
51_avatar_middle
最佳答案
74 
online_admins 发表于 2020-2-23 19:01:27 | 显示全部楼层
AccpetEx函数失败了,那么就调用下 WSAGetLastError 看看错误码是多少,这样能大概定位一下问题
35_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-2-23 20:18:39 | 显示全部楼层
Syc 发表于 2020-2-23 19:01
AccpetEx函数失败了,那么就调用下 WSAGetLastError 看看错误码是多少,这样能大概定位一下问题

老大,如果说,如果失败了,而且WSAGetLastError() != WSA_IO_PENDING,我就是看了您的代码的。
直接返回false,我就直接关闭m_AccSocket了,这样的话,第1501的客户,还能链接过来吗?如果不能的话,第1502,1503,1504..........怎么办?可以做一个循环
while(true)
   AcceptEx(.....);
成功的话,再返回可以吗?
51_avatar_middle
最佳答案
74 
online_admins 发表于 2020-2-23 20:56:23 | 显示全部楼层
这个跟 WSARecv 是一样的道理,可以接受成功一个客户端之后马上投递一个 Accept 请求,这样下次再有客户端连接也可以再次接受成功
35_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-2-23 21:34:56 | 显示全部楼层
Syc 发表于 2020-2-23 20:56
这个跟 WSARecv 是一样的道理,可以接受成功一个客户端之后马上投递一个 Accept 请求,这样下次再有客户端 ...


WSARecv的话,如果失败了,我直接关闭也行。

但会不会出现投递一个 Accept 失败的情况?如果投递一个 Accept真的失败怎么处理呢?
51_avatar_middle
最佳答案
74 
online_admins 发表于 2020-2-23 21:36:42 | 显示全部楼层
cheating_plugin 发表于 2020-2-23 21:34
WSARecv的话,如果失败了,我直接关闭也行。

但会不会出现投递一个 Accept 失败的情况?如果投递一 ...

投递一个 Accept 失败不代表接受客户端失败,应该投递 Accept 是先于接受客户端连接。所以投递一个 Accept 失败了,那么就再次投递一个
35_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-2-23 21:49:25 | 显示全部楼层
Syc 发表于 2020-2-23 21:36
投递一个 Accept 失败不代表接受客户端失败,应该投递 Accept 是先于接受客户端连接。所以投递一个 Accep ...

我在百度问题上看见别人和我一样的问题:

IOCP服务端运行一段时间,客户端连不上了,但Telnet能成功,Connect能执行成功,发送数据失败,有点像是GetQueuedCompletionStatus没返回,但各个工作线程正常.AcceptEx投递时第四个参数有一个数据头大的数据。运行5-6个小时候会出现上述情况,请问题怎么回事,有什解决办法呀?
再加点日志看看,之前遇到过这种情况:
在Windows2003上完成AcceptEX投递后,直接返回错误,而错误处理逻辑中有个分支
没有再次投递足够的AcceptEx出去,导致客户端连不上。
根据listen的第二个参数,用telnet连接此属两个连接,如果超出数量后连接失败,则很有可能是AcceptEx没有被投递

51_avatar_middle
最佳答案
74 
online_admins 发表于 2020-2-23 22:05:16 | 显示全部楼层
cheating_plugin 发表于 2020-2-23 21:49
我在百度问题上看见别人和我一样的问题:

IOCP服务端运行一段时间,客户端连不上了,但Telnet能成功, ...

单纯听你这么说我还真不确定是哪里的问题啊。。。
35_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-2-24 01:48:59 | 显示全部楼层
Syc 发表于 2020-2-23 22:05
单纯听你这么说我还真不确定是哪里的问题啊。。。

按您的说法来看的话,就是如果WSARecv失败的话,我就直接CloseSocket,delete ov /pres了,而AccpetEx失败,我直接再一次投递,这样号码?
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-6-2 09:14

Powered by CcTry.CoM

© 2009-2020 cctry.com

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