问题标签 [iocp]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
connect - IOCP 可以接受和保持的最大连接数是多少
我做了一些 IOCP 服务器和客户端测试。IOCP 服务器接受客户端的连接,除了从客户端接收数据包之外什么都不做。客户端连接服务器并将数据包发送到无限循环中的服务器。
我设置了一个柜台。当服务器接受客户端时它会增加,当套接字关闭时它会减少。
这是一个问题:计数器增加到 32261 并且不再增加。服务器无法接受更多连接,GetLastError() 返回 10055, WSAENOBUF。
我的操作系统是 Windows XP,内存是 4GB。我已经检查了非分页内存。我想我的记忆力已经足够了。
什么限制了最大连接数?如何扩大最大连接数?
c - 是否有可能不会收到 WSASend 调用的完成?
就像标题所说的那样,在与 I/O 完成端口关联的套接字上成功 WSASend
调用是否有可能因为线程结束以外的任何原因不发布完成?
我有一个奇怪的情况,看起来没有为 a 发布完成WSASend
,这导致套接字泄漏;应用程序认为套接字的发送仍处于挂起状态并拒绝释放它。
发送代码如下:
c++ - IOCP C++ TCP 客户端
我在实现 TCP IOCP 客户端时遇到了一些麻烦。我已经在 Mac OSX 上实现了 kqueue,所以希望在 Windows 上做类似的事情,我的理解是 IOCP 是最接近的事情。主要问题是 GetCompetetionStatus 永远不会返回并且总是超时。我假设在创建要监视的句柄时我遗漏了一些东西,但不确定是什么。这是我到目前为止得到的地方:
我的连接例程:(为了清楚起见,删除了一些错误处理)
这是发送例程:(为了清楚起见,还删除了一些错误处理)
}
任何见解将不胜感激。
c++ - GetQueuedCompletionStatus 延迟
我已经编写了用于管理基于 iocp 机制的网络通信的复杂库。问题是,当服务器通过调用 API 方法 closesocket() 关闭连接时,此信息有时会延迟数秒甚至数分钟传输到客户端。我用于检测连接关闭的代码如下所示(简化):
为什么会这样?我需要立即了解连接关闭才能连接到备份服务器(负载不那么重 - 因此发生断开连接)。
c++ - 数据包延迟变化 (PDV)
我目前正在实现视频流应用程序,其目标是利用尽可能多的千兆以太网带宽
- 应用协议建立在 tcp/ip 之上
- 网络库使用异步iocp机制
- 只需要通过 LAN 流式传输
- 数据包无需通过路由器
这简化了很多事情。不过,我遇到了数据包延迟变化的问题。
这意味着例如应该每 20 毫秒到达的视频帧(1280 x 720p 50Hz 视频信号)有时会延迟数十毫秒到达。更多的:
- 保持平均帧率
- 最大视频帧延迟取决于网络利用率
- LAN 上的数据越多,最大视频帧延迟越高
例如,当带宽使用为 800mbps 时,PDV 约为 45 - 50 ms。
对于我的问题:
- 降低该值的实际界限是什么?
- 您知道有关此问题的互联网测量报告吗?
我想知道我的应用程序中是否存在一些细微的错误(可能是过度锁定),或者没有办法使用当前技术使数字变得更好。
c# - .NET IOCP 线程池开销与异步 UDP 操作
我开发了一个 VoIP 媒体服务器,它与远程 SIP 端点交换 RTP 数据包。它需要很好地扩展——虽然我最初担心我的 C# 实现不会接近它所取代的 C++ 版本,但我使用了各种分析器来磨练实现并且性能非常接近。
我通过创建可重用对象池来限制大多数对象分配,我正在使用 ReceiveFromAsync 和 SendToAsync 来发送/接收数据报,并且我正在使用生产者/消费者队列在系统中传递 RTP 数据包。在具有 2 个 2.4GHz Xeon 处理器的机器上,我现在可以处理大约 1000 个并发流,每个流每秒发送/接收 50 个数据包。然而,迭代的配置文件/调整/配置文件让我着迷——我相信那里的效率更高!
触发处理的事件是在 SocketAsyncEventArgs 上调用的 Completed 委托——它反过来通过处理管道发送 RTP 数据包。
剩下的挫败感是 IOCP 线程池中似乎有很大的开销。分析器显示只有 72% 的包容性采样时间在“我的代码”中——之前的时间似乎是线程池开销(下面的堆栈帧)。
所以,我的问题是:
- 我的理解是否遗漏了什么?
- 是否有可能减少这种开销?
- 是否可以替换异步套接字函数使用的线程池以使用开销更少的自定义轻量级线程池?
windows - 做 I/O 完成端口时是否需要在 OVERLAPPED 结构上设置 hEvent?
我在 Windows 上使用 I/O 完成端口进行串行端口通信(我们可能会大量使用串行端口)。我已经完成了通常的操作,创建了 IOCP,启动了 I/O 线程,并将我的CreateFile()
句柄与 IOCP 相关联(CreateFile()
用 调用FILE_FLAG_OVERLAPPED
)。这一切都很好。我已将COMMTIMEOUTS
all 设置为 0,除了ReadIntervalTimeout
设置为MAXDWORD
完全异步。
在我的 I/O 线程中,我注意到GetQueuedCompletionStatus()
无限期地阻塞。我正在使用INFINITE
超时。因此,我在将ReadFile()
句柄与 IOCP 关联后立即拨打电话。现在GetQueuedCompletionStatus()
由于某种原因导致立即释放,传输了 0 个字节,但没有错误(它返回 true,GetLastError() 报告 0)。如果它无事可做,我显然希望它阻止。如果我ReadFile()
在 GetQueuedCompletionStatus() 之后放置另一个,那么池中的另一个线程将在传输 0 字节且没有错误的情况下拾取它。
在我看到和遵循的示例中,我没有看到任何人在使用 IOCP 时设置hEvent
结构OVERLAPPED
。那有必要吗?我不在乎阻塞 IOCP 线程——所以我永远不会对CreateEvent(...) | 1
.
如果没有必要,可能导致问题的原因是什么?GetQueuedCompletionStatus()
需要阻塞,直到数据到达串行端口。
有没有好的 IOCP 串口示例?我还没有找到完整的串行端口+ IOCP 示例。它们中的大多数是用于套接字的。理论上,它应该适用于串口、文件、套接字等。
c - 从 I/O 完成端口中删除句柄以及有关 IOCP 的其他问题
该CreateIoCompletionPort
函数允许创建新的 I/O 完成端口并将文件句柄注册到现有的 I/O 完成端口。
然后,我可以使用任何函数,例如recv
套接字上的 a 或ReadFile
具有结构的文件上的 aOVERLAPPED
来启动异步操作。
我必须检查函数调用是否同步返回,尽管它是用OVERLAPPED
结构调用的,在这种情况下直接处理它。在另一种情况下,当ERROR_IO_PENDING
返回时,我可以使用该GetQueuedCompletionStatus
函数在操作完成时得到通知。
出现的问题是:
如何从 I/O 完成端口移除句柄?例如,当我向 IOCP 添加套接字时,如何删除已关闭的套接字?我应该用相同的完成键重新注册另一个套接字吗?
另外,有没有办法让调用总是通过 I/O 完成端口并且不同步返回?
最后,是否有可能例如
recv
异步但send
同步?例如,当实现一个简单的回显服务时:我可以异步等待recv
新数据,但send
以同步方式响应,从而降低代码复杂性吗?recv
就我而言,在处理第一个请求之前,我不会再做第二次了。如果
ReadFile
已请求异步,但在完成之前,WriteFile
应处理同一文件的 a,会发生什么情况。是否会因ReadFile
错误消息而取消,并且我必须在写入完成后立即重新启动读取过程?还是我必须ReadFile
在写之前手动取消?这个问题与通信设备结合出现;因此,如果同时发生,写入和读取不应该有问题。
c++ - C++ 中的可扩展服务器框架
我正在寻找用 C++ 编写一个服务器应用程序,旨在同时处理数以万计的客户端。它应该在 Windows 和 Linux 下运行。我一直在寻找框架和库,并遇到了 Boost Asio,这似乎是一个非常成熟且广泛使用的替代方案。我只是在绞尽脑汁/线程池时遇到了麻烦,主要是因为有数百万个模板。我的背景主要是 C,所以不太习惯 Boost 似乎充满的模板混乱。我试图找人围绕 Boost Asio 开发一个相对较薄的包装器,它可以使用 strands、bind 等来处理线程/同步方面,但一直无法找到可以在我的预算范围内做到这一点的人(2 或300 美元)。
你们中的任何人都可以推荐任何其他可扩展的库以及 Boost Asio(例如,Windows 上的 IOCP 和 Linux 上的 epoll 等),或者我可能会找到有经验的 Boost 开发人员正在寻找较小的自由职业者的资源吗?
非常感谢您的任何帮助。
亲切的问候,
菲利普·班尼法尔
windows - Node.js 是否可以在 Windows 上用于生产?
在新的 0.5.1 分支中,有一个 Node.js 的官方 Windows 可执行文件。Linux 版本的 Node.js 使用已建立的库,例如 v8、libev、libeio。
由于 libev 和 libeio 适用于 *NIX 平台;Node.js 的 Windows 端口是否已准备好用于生产,还是仅用于开发?