问题标签 [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.
c++ - WSARecv 一次可以接收的最大字节数是多少?
我正在使用 std::vector 来表示每个 IO 数据结构中的缓冲区:
我想在调用 WSARecv() 后指定最大大小并在 m_vecBuffer 上执行“缩小以适应”。
我已经查看了此页面,但无法找到我正在寻找的信息。
c++ - 如何处理在同一个socket上发布多个操作的情况
我正在开发一个管理一个套接字的客户端应用程序。我正在使用 IOCP 来管理异步 I/O。
这是网络编程书中的一句话:
所有重叠的操作都保证按照应用程序发出它们的顺序执行。但是,不保证从完成端口返回的完成通知的顺序相同。也就是说,如果应用程序发布两个重叠的 WSARecv 操作,一个具有 10 KB 缓冲区,下一个具有 12 KB 缓冲区,则首先填充 10 KB 缓冲区,然后填充 12 KB 缓冲区。应用程序的工作线程可能会在 10 KB 操作的完成事件之前收到来自 GetQueuedCompletionStatus 的 12 KB WSARecv 通知。当然,这只是在一个套接字上发布多个操作时的问题。
那么我该如何处理这个案子呢?
c++ - 如何正确关闭为使用 IOCP 而创建的工作线程
以下是Microsoft Windows 网络编程的代码片段:
我不明白为什么样本会直接关闭线程句柄。是否不需要存储它们(例如在 std::vector 中),以便稍后退出程序时终止所有工作线程?
c++ - IOCP 和覆盖缓冲区
好吧,我制作了一个 IOCP 来处理具有以下详细信息的客户端连接:
所以我正在尝试调试传入的数据包,它的工作原理就像一个魅力,除了一点但令人讨厌的细节......我在 WorkersThread 函数上设置了一个断点(我在哪里接收数据包)我正在用数据包观察缓冲区我recv,当缓冲区突然被我从客户端获得的新数据包覆盖时。
这是为什么?根据我读到的内容,IOCP 应该等到我处理数据包,在接收任何其他数据包之前向客户端发送响应。所以我在我的套接字上下文上设置了一个名为“处理”的标志,并且仍然得到了带有传入数据包的覆盖缓冲区。所以它根本不允许我调试,它让我发疯
在我设置断点时让其他线程运行的 ollydbg(调试器)故障是否存在?还是我的 IOCP 实施中有一些错误?
这是我的 WorkerThread 的编码方式:
查看clientinfo->RecvContext.Buffer时出现问题。我正在观察数据包,几秒钟后,缓冲区被一个新数据包覆盖。
谢谢 !
c++ - 将调用线程置于警报等待状态
我的主线程创建了多个 I/O 工作线程。然后我通过执行以下操作从我的主线程发起一个 I/O 请求:
在我的一个 I/O 工作线程中的某个时刻,请求已完成,并且我的 IoRequest 对象的缓冲区中填充了有效的响应数据。
如何在调用 WSASend() 后将我的主线程置于警报等待状态,并使其在准备好时接收响应数据?
c++ - 使用 IOCP 时,我应该将 WSAOVERLAPPED 的 hEvent 设置为 NULL 还是设置为 WSAEVENT 对象的有效句柄?
根据MSDN:
hEvent:如果在没有 I/O 完成例程的情况下发出重叠 I/O 操作(操作的 lpCompletionRoutine 参数设置为 null),则此参数应包含 WSAEVENT 对象的有效句柄或为 null。
当我使用 IOCP 时,当我调用 WSASend() 或 WSARecv() 时,我将 NULL 传递给它们的最后一个参数(即 lpCompletionRoutine):
我的“每个 I/O 数据”类 (pIoRequest) 看起来像:
即使我注释掉上面标记为 A、B 和 C 的行,它似乎对我的程序的行为也没有任何影响。
那么您如何决定何时调用 WSACreateEvent() 或简单地将 hEvent 设置为 NULL?
c++ - Can I use std::shared_ptr to wrap per I/O data in IOCP?
I'm working on a client application that uses IOCP.
My per I/O data class is derived from WSAOVERLAPPED:
And when performing asynchronous I/O operations, I use it like this:
I reuse my IoRequest instance in my worker thread routine. I wonder, will there be any problem using std::shared_ptr instead of a raw pointer to manage my per I/O data?
So for WSASend(), something like:
Cheers
c++ - 如果最初发出 IO 的线程在 Windows 8 下的 ReadFile 中阻塞,则 GetQueuedCompletionStatus 无法从 IOCP 出列 IO
我的应用程序在切换到 Windows 8 后停止工作。我花了几个小时来调试问题,发现 IOCP 在 Windows 8 和以前的版本之间的行为不同。我提取了必要的代码来演示和重现问题。
该程序在端口 1999 上侦听并发出 async accpet 然后读取阻塞管道。我已经在 Windows 7、8、XP、2003、2008 上测试了这个程序,在“telnet 127.0.0.1 1999”之后,“dequeued an IO\n”将打印在除 Windows 8 之外的控制台上。
关键是最初发出异步操作的线程不能在 ReadFile 中阻塞,否则 GetQueuedCompletionStatus 永远不会使该 IO 出队,直到 ReadFile 在 Windows 8 上返回。
我还使用“scanf”而不是读取管道进行了测试,结果是相同的,因为“scanf”最终会调用 ReadFile 来读取控制台。我不知道 ReadFile 是唯一受影响的功能还是可能有其他功能。
我能想到的是使用专用线程来发出异步操作,并且所有业务逻辑都与该专用线程通信以执行接受/发送/接收。但是额外的层意味着额外的开销,有什么方法可以在 windows 8 上实现与以前版本的 windows 相同的性能?
.net - SocketAsyncEventArgs.Completed 在 Windows 8 中不会触发
当我在安装了 Windows 7 Ultimate 和 .NET 4 的机器上编译此代码时,它工作得很好,但是当我在安装了 Windows 8 RTM 和 .NET 4.5 的机器上尝试它时,Complete 事件永远不会触发。
有趣的是,如果我在这一行设置断点并对其进行调试:
并在继续执行之前使用Hercules连接此服务器,它就像一个魅力。我一开始就这样做,然后神奇地调用 OnAccepted 并写入“Accepted”。在每个连接上到控制台。我在装有 Windows 7 和 .NET 4 的机器上使用相同的代码和相同的程序 (Hercules),但它始终有效。
- 难道我做错了什么?
- 如果不是,它是我的操作系统或 .NET Framework 4.5 版的已知错误吗?
- 任何人都可以重现这个吗?
编辑:两个操作系统都是 64 位的。
编辑 2 :我在此处将其报告为 Microsoft Connect 上的错误。
编辑 3:找到一种解决方法并将其发布到 Connect(只需创建一个虚假的第一个连接)。
编辑 4:如果有人可以重现此问题,请加入 Connect 中的问题。
编辑 5:我看到了Thomas 提到的问题,我测试了是否Console.ReadLine
导致了这个问题。原来是这样。如果我在通话前添加并Thread.Sleep(3000)
在Console.ReadLine
运行程序后 3 秒内尝试连接,它就像一个魅力。同样,奇怪的是我只需要在调用Console.ReadLine
. 如果我在打电话之前建立一个连接Console.ReadLine
然后每个连续的连接都有效,即使在Console.ReadLine
被调用之后也是如此。我将在连接页面中提到这一点。
编辑6:我将另一个问题的链接添加到连接页面,并添加了另一个解决方法,涉及在调用Thread.Sleep
之前调用,Console.ReadLine
就像我在上面的编辑中提到的那样。
c# - 如何调试与低级 API(如 I/O 完成端口)交互的代码?
我编写了一个控制台应用程序,它使用 Socket
's 的*Async
一组方法,它时不时地崩溃。它没有向我显示它在哪里引发了同步代码等异常,控制台只是关闭了,我不知道我做错了什么。
当涉及到这样的异步操作时,有没有办法在不知道将try
/catch
块放在哪里的情况下检测异常?
我只需要知道代码的哪一部分导致我的应用程序崩溃。
编辑:
未处理异常的常见情况是,当您使用 Visual Studio 调试代码时,它会暂停执行并向您显示导致异常的代码行(或至少是异常消息)。但是在某些情况下(例如与像 IOCP 这样的低级 API 交互),您的程序只会崩溃,并且调试结束时没有任何关于其原因的信息。
我需要的是一种查看特定异常的方法:
“发生了什么或在哪里(以哪种方法)发生了,所以我的程序崩溃了?”
所以我不会问“我做错了什么?”,我会问“我怎么才能知道我做错了什么?”
- 我可以在抛出异常的地方中断执行吗?
- 我可以在崩溃后查看调用堆栈以识别导致它的方法吗?
- 你能提供任何建议来避免这种情况吗?