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. ...
随机推荐
- SpringCloud超简单的入门(1)--一些简单的介绍
简介 简单来说,springcloud的就是由一组springboot应用(服务)组成,相互之间通过REST等方式进行通信. 两个springboot应用,其中一个作为服务提供者,一个作为服务消费者, ...
- Django-开放静态资源-获取请求携带的数据-pychram连接数据库-修改Django默认数据库-DjangoORM操作--表管理-记录管理-01
目录 关于静态资源访问 为什么要配置静态文件才能获取静态资源 常见的静态文件种类 如何配置来开启访问权限 禁用浏览器缓存 django的自动重启机制(热启动) 静态文件接口动态解析 向服务器发送数据 ...
- 记录一次oracle的坑
背景:程序正常运行中,突然技术支持人员反映数据库数据好久没有增加,于是乎各种排查问题,但是一直没有找到原因,由于代码比较久,也不是本人所写,更气的是居然用的是oracle数据库,并且是通过java代码 ...
- FastReport安装包下载、安装、去除使用限制以及工具箱中添加控件
场景 FastReport .NET 2019是一款适用于Windows Forms, ASP.NET和MVC框架的功能齐全的报表分析解决方案.可用在Microsoft Visual Studio 2 ...
- thinkphp6 常用方法文档
请求变量 use think\facade\Request; Request::param('name'); Request::param();全部请求变量 返回数组 Request::param([ ...
- 各种浏览器UA值
UA User-Agent:用户代理,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本.CPU 类型.浏览器及版本.浏览器引擎.浏览器语言.浏览器插件等. 标准格式为: 浏览器标识 ...
- 安装Winservices服务出现“设置服务登录”
安装服务时出现 设置服务登录 窗口 别紧张 将serviceProcessInstaller1 Account 设置为LocalSystem 即可
- C++ const 引用 指针
先简单回忆一下常量的性质: int main() { const int buffSize = 512; buffsize = 512; //× buffSize是常量 } 初始化时: const i ...
- 自定义 Alamofire 的 response serializer
Alamofire 的 DataRequest 类针对二进制数据.字符串.json.属性列表提供了一系列方便解析的方法(内部实际上使用的是 Response Serializer),现在我们要针对服务 ...
- Ubuntu18.04 显卡驱动+Cuda安装踩坑记录 以及Ubuntu虚拟内存的添加
前几天买了张亮机卡,终于把主显卡成功直连到Unraid OS的虚拟机上了.然后就开始安装ubuntu系统开始配置环境,遇到了不少坑,特此记录. gcc版本问题 在安装显卡驱动的时候,不要修改gcc版本 ...