问题标签 [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.

0 投票
4 回答
233 浏览

c++ - 包定时问题

我有一个客户端,每 8 秒将向服务器发送一个数据包。如果服务器检测到数据包发送速度过快,它将断开客户端。在客户端我调用 Sleep(8000); 在发送数据包之前。在服务器端,我使用 GetTickCount(); 计算数据包之间的时间。我希望这可以正常工作,但我一直断开连接。

我使用 WireShark 检查数据包时间,这就是我得到的:Packet# Time 17 8.656064 72 16.957240 115 24.764741

24.764741 - 16.957240 = 7.807501 < 8 是我断开连接的原因。我不明白这一点,因为在客户端我调用 Sleep(8000); 所以它应该每 8 秒或更长时间发送一次数据包。

第二个数据包晚了 0.3 秒,第三个数据包早了大约 0.2 秒。有没有办法及时发送这些数据包?

0 投票
1 回答
1101 浏览

c++ - Winsock IOCP 服务器压力测试问题

我有一个使用 TCP IP 连接用 C++ 编写的 winsock IOCP 服务器。我已经在本地测试了这个服务器,使用环回地址和客户端模拟器。我已经能够毫不费力地接待超过 60,000 名客户。我遇到的问题是当我在我家运行服务器和在朋友家运行客户端模拟器时。一切正常,直到我们达到大约 3700 个连接,之后每次调用 connect() 从客户端失败并返回 10060(这是 winsock 超时错误)。昨晚这个数字是3700,之前一直在300左右,我们也看到接近1000。但是不管是什么数字,每次我们尝试模拟它,它都会在这个数字附近失败(在10左右) .

两台计算机都使用 Windows 7 Ultimate。我们还将 TCPIP 注册表设置 MaxTcpConnections 修改为 1600 万左右。我们还将 MaxUserPort 设置从默认值 5000 更改为 65k。事件查看器中没有显示任何有用的信息。我们还观察了我们的资源监视器,我们甚至没有达到 1% 的网络利用率,CPU 也接近 0% 的使用率。

我们刚刚和我们的 ISP 通了电话,他们说他们并没有以任何方式限制我们,但那家伙有点不确定,最终在 30 分钟的等待时间后挂断了我们......

我们正在尽一切努力解决这个问题,但无法提出解决方案。如果有人可以帮助我们解决这个问题,我将非常感激。

PS 两台计算机都在 Verizon FIOS 上,使用相同的 verizon 路由器。还有一点需要注意,服务器使用的是 WSAAccept 而不是 AcceptEx。客户端模拟器试图在几秒钟内连接,所以我很确定连接没有积压。我们试图改变客户端模拟器的连接速度,无论它设置什么速度,它每次都会失败大约相同的数字。

更新我们在网络 A 上模拟了 2 个独立的客户端(在 2 台不同的机器上)。服务器在网络 B 上运行。每个客户端只能连接一半(大约 1600 个)到服务器的连接。我们最初使用低于 1,000 的端口,现在已更改为高于 50,000。两台机器上的路由器日志都没有显示。我们都在使用 Actiontec MI424WR verizon FIOS 路由器。这让我相信问题不在于客户端代码。服务器不会引发错误,也不会出现意外行为。这可能是 ISP/路由器问题吗?

更新已找到解决方案。我们使用的 verizon 路由器(MI424WR 修订版 C)无法处理超过 3700 个连接,我们使用一组单独的网络对此进行了测试。谢谢你们的帮助!

谢谢 - 里克

0 投票
2 回答
4853 浏览

c - 在 Windows 上学习 IOCP 的资源

我最近在 Windows 上意识到了这个叫做 IOCP 的东西,我开始搜索关于它的更多信息,但我找不到任何最新的东西(大多数例子都是在将近 5 年前的 codeproject 上)并且没有太多的指南或教程。任何人都可以以在线教程或示例项目(您编写并可以分享或其他开源项目)的形式推荐任何关于它的最新资源,甚至是一本关于它的书,因为如果它和听起来一样好,我打算使用它广泛,所以我会投资它。

谢谢你。

0 投票
1 回答
1244 浏览

iocp - 使用 IOCP 时 wsarecv 出现问题

我是 IOCP 的新手,过去几周一直在为此苦苦挣扎。我在下面粘贴了与 IOCP 相关的代码的一些核心部分。这可能无法完美执行,因为我剪掉了一些部分以使其易于理解。我在接收数据时很挣扎。当涉及到工作线程中的 wsarecv 时,wsarecv 返回 WSA_IO_PENDING 错误代码,所以我调用 WSAGetOverlappedResult 来检查要完成的操作。Twist 来到这里,而是在 WSAGetOverlappedResult 之后继续并调用我的本地函数 ProcessTelegramData ,代码的相同部分(再次调用 wsarecv)由另一个尝试调用 ProcessTelegramData 的工作线程再次执行,并且缓冲区值在其中无效。我无法理解为什么另一个线程在调用 WSAGetOverlappedResult 时再次调用 wsarecv 以及为什么缓冲区值变得无效?

0 投票
1 回答
1700 浏览

c++ - iocp 错误,有时无法接收消息

iocp 代码如下:

上面的函数在一个线程中运行,与逻辑线程不同。正常情况下是不会打印错误日志的,但是当游戏服务器运行的时候,收不到客户端消息,也不能给客户端发送消息,但是过了一会儿,服务器会自动恢复正常,可以接收消息,并且可以发送消息,当某个时间过去时,服务器无法发送消息和接收消息.....这种情况会定期发生,错误日志如下:

2011-09-13 04:48:41 GetQueuedCompletionStatus 返回false,errno = 64,addr = 227492836,type = 2,sockfd = 4294967295

2011-09-13 04:48:41 GetQueuedCompletionStatus 返回false,errno = 64,addr = 227492836,type = 2,sockfd = 4294967295

2011-09-13 04:48:41 GetQueuedCompletionStatus 返回false,errno = 64,addr = 227492836,type = 2,sockfd = 4294967295

...更多相同的...

2011-09-13 04:48:41 GetQueuedCompletionStatus 返回false,errno = 64,addr = 227492836,type = 2,sockfd = 4294967295

以上只是日志文件的一部分,可以看到,错误日志打印了这么多,错误号是64,socket描述符是4294967295(0xffffffff),打印错误日志的时候,服务器不能发消息,收不到消息。我想知道如何解决这个问题,谢谢!

0 投票
1 回答
15839 浏览

winapi - CreateFile() 返回 INVALID_HANDLE_VALUE 但 GetLastError() 是 ERROR_SUCCESS

我正在使用CreateFile()打开一个串行端口。我有一个测试用例(太复杂而无法重新分发),它始终会导致CreateFile()returnINVALID_HANDLE_VALUEGetLastError()return ERROR_SUCCESS。从表面上看,只有当一个线程在另一个端口关闭它的同时打开该端口时,才会出现此错误。打开端口的线程遇到了这个问题。

我不知道这是否会有所不同,但稍后在代码中,我使用CreateIoCompletionPort将端口与 CompletionPort 相关联。

这是我的代码:

我很确定这种事情不应该发生。我做错什么了吗?如何让 API 返回正确的结果?


更多详细信息:此代码取自我开发的串行端口库:JPeripheral

这是实际的(未经处理的)源代码:

这是我得到的实际输出:

0 投票
1 回答
399 浏览

winsock - 多个立即数 WSASend 调用和数据发送顺序

如您所知,WSASend-completion-WSASend-...(repeat) 保证按顺序发送数据。但是,听说 WSASend-WSASend-WSASend-completion-completion-completion 也保证按顺序发送数据,虽然完成的顺序没有。是对的吗?

请回复。提前致谢。

裴贤治

0 投票
1 回答
816 浏览

windows - 没有 ConnectEx 的 Windows 上的非阻塞套接字连接

我需要在单个进程中启动 1000 个客户端连接,我需要解决的关键限制是驱动程序不支持 ConnectEx,因此我无法拥有纯 IOCP 解决方案。

我的第一个想法是处理连接的线程池,其中每个句柄可以使用普通的连接/选择语义处理多达 64 个连接,一旦连接就继续使用 IOCP。但这行不通;一旦选择运行,我就不能向 FD_SET 添加另一个套接字。所以我必须将套接字设置为非阻塞并轮询它们。
最好的解决方案可能是最简单的;每个线程一个连接客户端。假设我可以保持合理的连接率,池中的线程数可能会很小。

这是一个奇怪的情况,理想情况下,驱动程序会支持 ConnectEx,但它(目前)不支持,我需要以最好的方式解决它。

还有其他方法吗?

0 投票
1 回答
440 浏览

windows - Winsock SPI中如何实现ConnectEx、AcceptEx

这些是 Microsoft 特定的扩展,我想知道是否可以在第三方驱动程序中实现它们。它们都是实现纯 IOCP 客户端和服务器代码所必需的。SPI页面中的功能扩展机制信息有点薄......

0 投票
2 回答
467 浏览

asp.net - 将多个 HTTP 请求等待同一个 I/O 完成端口

我的应用程序从 Web 服务和“Application_Start”异步加载大量信息。

如果用户请求想要使用该信息,并且它还没有准备好,则线程将被 Monitor.Wait 阻塞。当信息准备好后,缓存对象会Monitor.Pulse所有等待的线程。这应该没问题,因为信息需要十几秒钟,并且必须将用户重定向到登录页面,发布登录信息,然后再次重定向。

问题是 Monitor.Wait 会阻塞 CLR ThreadPool 线程,据我所知,如果有大量请求到达要求“大信息”,应用程序可能会被 CLR ThreadPool 饥饿阻塞(我有点乱与当前的 IIS/ASP.NET 线程门控)。

由于大部分信息来自我异步调用的 Web 服务,因此我拥有该操作的 IAsyncResult。

那么,有没有办法告诉 CLR ThreadPool 线程“等待这个 IOCP”,以便线程池线程可以开始参加其他调用?

我觉得这没有得到很好的解释,如果不清楚我在问什么,请告诉我。

问候。

PS:虽然赏金已经结束,但如果有人知道如何做到这一点,我会提出一个新的并授予作者。