刚申请到博客,第一篇随笔(๑•̀ㅂ•́)و✧

关于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完成端口套接字重用注意事项的更多相关文章

  1. 我的Windows核心编程——完成端口+套接字 图解

    ========================声明============================ 本文原创,转载请注明作者和出处,并保证文章的完整性(包括本声明). 本文不定期修改完善,为 ...

  2. 套接字I/O模型-完成端口IOCP

    “完成端口”模型是迄今为止最为复杂的一种I/O模型.然而,假若一个应用程序同时需要管理为数众多的套接字,那么采用这种模型,往往可以达到最佳的系统性能!但不幸的是,该模型只适用于Windows NT和W ...

  3. TCP协议、UDP协议、端口、套接字

    TCP协议优缺点 可靠:反馈数据是否送达 效率低:需要创建连接请求,连接成功后发数据 UDP协议优缺点 不可靠:无任何反馈 效率高:不创建连接请求,直接发数据 端口(0~65535,其中0~1023用 ...

  4. VC++学习之网络编程中的套接字

    VC++学习之网络编程中的套接字 套接字,简单的说就是通信双方的一种约定,用套接字中的相关函数来完成通信过程.应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问 ...

  5. 第十六章:网络IPC 套接字

    一.IP地址和端口 套接字接口可以用于计算机间通信.目前计算机间使用套接字通讯需要保证处于同一网段. 为了查看是否处于同一网段,我们可以使用IP地址判断. IP地址是计算机在网络中的唯一标识.IP地址 ...

  6. TCP套接字端口复用SO_REUSEADDR

    下面建立的套接字都是tcp套接字 1.进程创建监听套接字socket1,邦定一个指定端口,并接受了若干连接.那么进程创建另外一个套接口socket2,并试图邦定同一个端口时候,bind错误返回“Add ...

  7. WebSocket异常 通常每个套接字地址(协议/网络地址/端口)只允许使用一次

    websocket的实例:http://blog.csdn.net/for_cxc/article/details/51500185 问题: 新建一个连接通信没有问题,但是如果关闭再建立就会报错:通常 ...

  8. Apache报错信息之通常每个套接字地址(协议/网络地址/端口)只允许使用一次(could not bind to address 0.0.0.0:80)

    我们常常在执行 httpd –k restart 重启Apache时报错提示: (OS 10048)通常每个套接字地址(协议/网络地址/端口)只允许使用一次.  : AH00072: make_soc ...

  9. 《UNIX网络编程》之多客户连接服务端,可重用套接字对

    该网络编程之客户端与服务端程序模板支持: 1. 多客户端同时连接服务端,即服务程序可以同时为多个客户端服务: 2. 服务端支持套接字对重用,即即使处于TIME_WAIT状态,仍可支持服务端重启: 3. ...

随机推荐

  1. 从零开始开发IM(即时通讯)服务端(二)

    好消息:IM1.0.0版本已经上线啦,支持特性: 私聊发送文本/文件 已发送/已送达/已读回执 支持使用ldap登录 支持接入外部的登录认证系统 提供客户端jar包,方便客户端开发 github链接: ...

  2. get和post请求方式的区别

    1.用途方面: get是向服务器请求数据,post是向服务器发送数据. 2.大小方面: get发送数据上有大小限制,post理想上无大小限制,实际上有限制. 3.安全方面: get请求的数据会显示在地 ...

  3. UGUI_创建旋转物体,使用Slider控制小球旋转速度

    using System.Collections; using System.Collections.Generic; using UnityEngine; public class Player : ...

  4. application.properties 乱码 (已验证)

    1.打开Eclipse或MyEclipse 2.选择window-Preferences-content Types-Text-Java Properties File 3.将Java Propert ...

  5. Hadoop入门 之 Hadoop常识

    1.Hadoop是什么? 答:Hadoop是开源的分布式存储和分布式计算平台. 2.Hadoop的组成是什么? 答:Hadoop由HDFS和MapReduce这两个核心部分组成. HDFS(Hadoo ...

  6. Python集训营45天—Day07 (面向对象编程进阶)

    目录 1. @property装饰器 2. 魔法方法 3. 类属性和实例属性 4.静态方法和类方法 5. 单继承和多继承 6. 多态 7. del 方法 序言:上个章节我们了解了面向对象的基础知识,这 ...

  7. 在wxml中直接写js代码(wxs)

    我们在h5开发中,很多时候要在html中写到js代码,这个很容易实现.但是在微信小程序开发中,是不能直接在wxml中写js代码的,因此就有了wxs.在wxml中用wxs代码,有以下几种方式(在小程序文 ...

  8. 部署Tomcat 环境

    部署Tomcat 环境(mysql+tomcat+jdk) 1.下载Tomcat 软件包 2.通过xftp创建root 连接,然后将Tomcat 软件包拖拽到/opt目录下 3.在xshell 上ro ...

  9. springmvc(二)

    请求信息转换 异步发送表单数据到JavaBean,并响应JSON文本返回 操作步骤:(1)加入Jackson2或fastjson框架包,springmvc默认支持Jackon2,不需要做任何操作,而f ...

  10. Spring Environment的加载

     这节介绍environment,默认环境变量的加载以及初始化.  之前在介绍spring启动过程讲到,第一步进行环境准备时就会初始化一个StandardEnvironment.下图为Environm ...