winsock完成端口套接字重用注意事项
刚申请到博客,第一篇随笔(๑•̀ㅂ•́)و✧
关于DisconnectEx的一个问题,目前主要发现在windows10中出现了这个问题,winserver2008 win7都没有这个问题。
被DisconnectEx成功重用后的套接字,再次被AcceptEx事件返回之后,会有可能出现一种明明已经投递了WSARecv,客户端也确实正在WSASend,但是无法收到通知。
所有日志都符合预期的结果。
产生这个bug时,调用WSARecv明显的返回了ERROR_IO_PENDING,证明代码是没有问题的。
我使用了一个定时器检查投递标志,也确实是正在处理WSARecv投递,并没有返回。
并且,我把服务端设置为单线程,只有一个套接字,也就是完全不存并发因素在里面,也依旧是这样子。
服务端同一时间只存在一个投递事件,并且所有事件使用的重叠结构都是不同的,也就是证明了逻辑绝对没有问题。
我找出了重现这个bug的方法(不太确定是否真的如此):
服务端只投递1个套接字进行AcceptEx,
客户端使用4,5个线程去进行发送数据,一个线程负责接收数据,也就是将客户端的IO行为当成异步模式来写,目的是实现让服务端大部分时候,都在处理WSASend,也即是让服务端处于高并发状态,单线程不处理业务,随便发送点数据给客户端,能达到10万+IO并发(我的CPU默认频率4g)。
然后,只要在服务端处于WSASend时,关闭掉客户端,让服务端调用WSASend时,返回错误代码WSAECONNRESET (10054)。
然后服务端会顺利的DisconnectEx,并在收到通知之后AcceptEx。
此时重新开启客户端再去连接时,AcceptEx事件会正常返回,然后接着服务端调用WSARecv,也正常。
但此时客户端发送数据,就一直卡着了,客户端处于WSASend处理中,服务端处于WSARecv处理中,大家都不返回完成通知,但是此时再次关闭客户端时,WSARecv返回通知了,能正常重用套接字之后一系列的操作,再次连上,还是一样,WSARecv不能返回通知。
然后我感觉可能在重用套接字后,需要重新将套接字添加到完成端口,也就是要再次CreateIoCompletionPort,但事实证明这其实是我的感觉。
这中间,经历了差不多两天的纠结,我仔细检查校对过所有代码,并没有问题,之后把服务端丢到不同的操作系统去,也没有问题,就是用来写代码的win10专业版,产生了这个bug,希望有相同经历的朋友可以分享下关于这个问题的具体问题到底是如何导致的。虽然我目前的测试结果是只在win10有这个问题,但实际上,其他系统都是虚拟机,并发量达不到物理机的级别,所以并不好说到底是不是系统的原因。
winsock完成端口套接字重用注意事项的更多相关文章
- 我的Windows核心编程——完成端口+套接字 图解
========================声明============================ 本文原创,转载请注明作者和出处,并保证文章的完整性(包括本声明). 本文不定期修改完善,为 ...
- 套接字I/O模型-完成端口IOCP
“完成端口”模型是迄今为止最为复杂的一种I/O模型.然而,假若一个应用程序同时需要管理为数众多的套接字,那么采用这种模型,往往可以达到最佳的系统性能!但不幸的是,该模型只适用于Windows NT和W ...
- TCP协议、UDP协议、端口、套接字
TCP协议优缺点 可靠:反馈数据是否送达 效率低:需要创建连接请求,连接成功后发数据 UDP协议优缺点 不可靠:无任何反馈 效率高:不创建连接请求,直接发数据 端口(0~65535,其中0~1023用 ...
- VC++学习之网络编程中的套接字
VC++学习之网络编程中的套接字 套接字,简单的说就是通信双方的一种约定,用套接字中的相关函数来完成通信过程.应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问 ...
- 第十六章:网络IPC 套接字
一.IP地址和端口 套接字接口可以用于计算机间通信.目前计算机间使用套接字通讯需要保证处于同一网段. 为了查看是否处于同一网段,我们可以使用IP地址判断. IP地址是计算机在网络中的唯一标识.IP地址 ...
- TCP套接字端口复用SO_REUSEADDR
下面建立的套接字都是tcp套接字 1.进程创建监听套接字socket1,邦定一个指定端口,并接受了若干连接.那么进程创建另外一个套接口socket2,并试图邦定同一个端口时候,bind错误返回“Add ...
- WebSocket异常 通常每个套接字地址(协议/网络地址/端口)只允许使用一次
websocket的实例:http://blog.csdn.net/for_cxc/article/details/51500185 问题: 新建一个连接通信没有问题,但是如果关闭再建立就会报错:通常 ...
- Apache报错信息之通常每个套接字地址(协议/网络地址/端口)只允许使用一次(could not bind to address 0.0.0.0:80)
我们常常在执行 httpd –k restart 重启Apache时报错提示: (OS 10048)通常每个套接字地址(协议/网络地址/端口)只允许使用一次. : AH00072: make_soc ...
- 《UNIX网络编程》之多客户连接服务端,可重用套接字对
该网络编程之客户端与服务端程序模板支持: 1. 多客户端同时连接服务端,即服务程序可以同时为多个客户端服务: 2. 服务端支持套接字对重用,即即使处于TIME_WAIT状态,仍可支持服务端重启: 3. ...
随机推荐
- Linux下编译提示arm-none-linux-gnueabi-gcc: command not found
自己的Linux系统中已经正确安装了交叉编译器arm-2009q3,路径设置正常. 但是在使用arm-none-linux-gnueabi-gcc编译时提示 arm-none-linux-gnuea ...
- idea解决This file is indented with tabs instead of 4 spaces
idea上面总是弹出 解决方法: File -> Settings -> Editor -> Code Style -> Java -> Tabs and Indents ...
- SqlServer 2014 Enterprise 企业版安装程序下载与安装教程
场景 SqlServer2014 企业版比标准版 多一些功能,比如在企业版中能使用分区函数,但是在标准版Express 中就不能使用. SqlServer 2014 企业版安装包下载: 关注公众号: ...
- Java位运算实现加减乘除四则运算
本文是继<一文了解有趣的位运算>的第二篇文章. 我们知道,计算机最基本的操作单元是字节(byte),一个字节由8个位(bit)组成,一个位只能存储一个0或1,其实也就是高低电平.无论多么复 ...
- 数据库高级:SQL-CREATE-TABLE语句
作者:松软科技(www.sysoft.net.cn) 发布时间:2019/3/17 9:34:51 CREATE TABLE 语句 CREATE TABLE 语句用于创建数据库中的表. SQL CRE ...
- ReactNative之Redux详解
用redux有一段时间了,感觉还是有必要把其相关的知识点系统的总结一下的,毕竟好记性不如烂笔头.上篇博客更新了关于<ES6中的迭代器.Generator函数以及Generator函数的异步操作& ...
- Spark比MR快是因为在内存中计算?错!
MapReduce 就像一台又慢又稳的老爷车,虽然距离 MapReduce 面市到现在已经过去了十几年的时间,但它始终没有被淘汰,任由大数据技术日新月异.蓬蓬勃勃.花里胡哨地发展,这个生态圈始终有它的 ...
- [Linux] CentOS 显示 -bash: vim: command not found
转载自:https://www.cnblogs.com/wenqiangwu/p/3288349.html i. 那么如何安裝 vim 呢?输入rpm -qa|grep vim 命令, 如果 vim ...
- JavaScript之深入对象(二)
上一篇随笔讲解了构造函数.原型及原型链相关的知识,今天让我们一起来探讨另一个问题:this. 一 this 的指向 1, 函数预编译过程中,this指向window 我们在讲解函数预编译过程 ...
- java工具方法
仅记录所遇到并使用的工具方法. 1.md5加密 /** * 对传入的字符串数据进行MD5加密 * @param source 字符串数据 * @param code 字符编码 * @return 加密 ...