标签: iocp

是否有基于I/O完成端口的Delphi组件?

我知道Indy,ICS,SynapseClever InetSuite,它们都不支持IOCP.还有什么吗?

编辑:我找到了iocpclasses,它是用Delphi5编写的.我想,总比没有好.

delphi iocp

8
推荐指数
3
解决办法
4456
查看次数

Windows 2012 R2 closesocket()在侦听套接字上挂起

我在生产服务器上有一个奇怪的情况.

我们有在C++上编写的网络应用程序,它通过使用IOCP编写的TCP为用户提供请求.

两天前,我们更新了Windows 2012 R2(它安装了最新的安全更新.之前的更新是在6个月前).在尝试停止服务的更新后,我们在日志中看到服务器在调用时挂起关闭侦听套接字

closesocket(session->listen_socket);
Run Code Online (Sandbox Code Playgroud)

停止网络系统的模式是下一个:

  1. PostQueuedCompletionStatus(m_completion_port, 0, NULL, NULL); x工作线程数

  2. 等待所有工作线程完成他们的工作

  3. CloseHandle(m_completion_port);

  4. closesocket(session->accept_socket);

    closesocket(session->listen_socket);

这在过去4年中表现良好,但在Windows 2012 R2更新后突然停止服务器永久挂起 closesocket(session->listen_socket);

我已经尝试作为一个解决方案来设置LINGER选项,0超时以使得关闭,但它没有帮助.

所有想法如何解决这个问题或进行任何其他诊断?

c++ sockets windows networking iocp

8
推荐指数
1
解决办法
1224
查看次数

并行ping多个网络设备的最佳方法是什么?

我通过迭代ping在网络中调查了很多设备(超过300个).

程序按顺序轮询设备,因此速度很慢.我想提高民意调查的速度.

在Delphi 7中有一些方法可以做到这一点:

  1. 每个设备都有一个执行ping的线程.手动管理线程.
  2. 学习和使用Indy 10.需要举例.
  3. 根据窗口消息使用重叠I/O.
  4. 根据事件使用完成端口.

什么是更快,更容易?请举例说明一些示例或链接.

delphi network-programming ping polling iocp

7
推荐指数
3
解决办法
9442
查看次数

从I/O完成端口删除句柄以及有关IOCP的其他问题

CreateIoCompletionPort功能允许创建新的I/O完成端口以及将文件句柄注册到现有I/O完成端口.

然后,我可以使用任何函数,如recv在套接字上或ReadFile在具有OVERLAPPED结构的文件上启动异步操作.

我必须检查函数调用是否同步返回,尽管它是用OVERLAPPED结构调用的,在这种情况下直接处理它.在另一种情况下,当ERROR_IO_PENDING返回时,我可以使用GetQueuedCompletionStatus在操作完成时通知的功能.

出现的问题是:

  • 如何从I/O完成端口删除句柄?例如,当我向IOCP添加套接字时,如何删除已关闭的套接字?我应该用相同的完成键重新注册另一个套接字吗?

  • 另外,有没有办法使调用始终通过I/O完成端口并且不同步返回?

  • 最后,例如可以recv异步但send同步吗?例如,当实现一个简单的echo服务时:我可以等待recv新数据的异步但是send以同步方式响应,以便降低代码复杂性吗?在我的情况下,recv在处理第一个请求之前,我不会第二次.

  • 如果ReadFile已经请求了异步,但在完成之前,WriteFile应该处理相同的文件.是否会ReadFile被错误消息取消,我必须在写入完成后立即重新启动读取过程?或者我必须ReadFile在写作之前手动取消?这个问题与通信设备结合产生; 因此,如果同时发生,写入和读取不应该出现问题.

c sockets windows file iocp

7
推荐指数
2
解决办法
5510
查看次数

Windows 对每台机器同时打开的套接字/连接数的限制

假设我有一个带有一个真实网络接口和几个环回接口的 Windows 7。我有启用 IOCP 的服务器,它接受来自客户端的连接。我正在尝试尽可能多地模拟与服务器的真实客户端连接。

我的客户端代码只是建立 X 数量的套接字连接(注意客户端绑定到给定的接口):

        const Int32 remotePort = 12345;
        const Int32 MaxSockets = 60000;

        Socket[] s = new Socket[MaxSockets];
        IPEndPoint bindEndpoint = new IPEndPoint(IPAddress.Parse(args[0]), 0);
        for (Int32 i = 0; i < MaxSockets; i++)
        {
            s[i] = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            s[i].SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
            s[i].Bind(bindEndpoint);
            s[i].Connect(args[1], remotePort);

            IPEndPoint socketInfo = (IPEndPoint)s[i].LocalEndPoint;
            Console.WriteLine(String.Format("Connected socket {0} {1} : {2}", i, socketInfo.Address, socketInfo.Port));
        }
Run Code Online (Sandbox Code Playgroud)

在环回接口上,我有几个用于绑定的 IP。另外,我也是用真实的接口来绑定的。当每台机器打开的套接字数量约为 64K 时,我遇到了一个问题:

未处理的异常:System.Net.Sockets.SocketException:无法对套接字执行操作,因为系统缺少足够的缓冲区空间或队列已满

我已经尝试了一些无助的事情,例如: - 将 MaxUserPort 设置为最大值以及注册表中的一些其他推荐的 TCPIP 设置。- 尝试在不同的接口(真实接口和环回)上运行两个服务器并使用多个客户端。

它是 Windows …

sockets windows networking iocp

7
推荐指数
1
解决办法
2万
查看次数

在 .NET / .NET Core 中的异步 I/O 期间,线程池的完成端口线程如何表现?

.NET / .NET Core 线程池在内部使用两种不同类别的线程:工作线程和 I/O 完成端口 (IOCP) 线程。两者都只是通常的托管线程,但用于不同的目的。通过不同的 API(例如Task.StartThreadPool.QueueUserWorkItem),我可以在工作线程上启动受 CPU 限制的异步操作(不应阻塞,否则线程池可能会创建额外的工作线程)。

但是如何执行受 I/O 限制的异步操作呢?在这些情况下,IOCP 线程的行为究竟如何?具体来说,我有以下问题:

  • 如果我开始一个异步 I/O 操作(例如文件、管道或网络),我怀疑当前线程会分派异步请求。我也知道(通过“CLR via C#”一书)CLR 注册到一个 I/O 完成端口,该端口用于执行重叠异步 I/O。我怀疑这个 IOCP 是绑定到异步操作上的,以便稍后可以将异步操作结果排队到线程池中。因此,我的假设是否正确,即在启动异步请求时没有触及 IOCP 线程?
  • 我怀疑当异步 I/O 操作的结果通过 CLR 的 I/O 完成端口上报时,这就是 IOCP 线程出现的地方。结果被排队到线程池中,并使用一个 IOCP 线程来处理它。但是,当阅读MSDN 上的一些论坛主题时,我觉得 IOCP 线程实际上是用来分派请求然后阻塞直到结果回来。是这种情况吗?当 I/O 操作由对方系统处理时,IOCP 线程是否阻塞?
  • 怎么样async awaitSynchronizationContextIOCP 线程是否处理异步 I/O 响应,然后例如将 UI 线程上的延续排队(假设ConfigureAwait(false)未调用)?
  • Linux / MacOS X 上的 .NET Core 怎么样?没有 I/O 完成端口 - …

.net asynchronous iocp threadpool .net-core

7
推荐指数
1
解决办法
2469
查看次数

IO完成端口密钥混乱

我正在使用ctypes模块在Python中使用Windows DLL API 编写基于IO完成端口的服务器(此处为源代码).但这是API的直接用法,这个问题针对的是那些了解IOCP而不是Python的人.

据我了解CreateIoCompletionPort的文档,当您使用文件句柄(在我的情况下是套接字)调用此函数时,您指定了"用户定义的"完成键,您正在与创建的IOCP关联.当您调用GetQueuedCompletionStatus时,您将获得一个完成键值以及指向重叠对象的指针.完成键应标识重叠的对象和请求已完成的内容.

但是,假设我在带有重叠对象的CreateIoCompletionPort调用中传入100作为完成键.当相同的重叠对象完成其IO并且它通过GetQueuedCompletionStatus返回时,伴随它的完成键要大得多,并且与原始值100没有相似之处.

我误解了完成键是如何工作的,或者我在上面链接的源代码中是否做错了?

python windows ctypes winsock iocp

6
推荐指数
1
解决办法
2546
查看次数

CloseHandle()在串口实际关闭之前返回

我拉着我的头发试图找出一个串口何时完成关闭所以我可以重新打开它.事实证明,CloseHandle()在端口实际解锁之前返回.

我使用打开一个串行端口CreateFile(FILE_FLAG_OVERLAPPED),使用它与一个完成端口关联CreateIoCompletionPort(),读/写使用它ReadFile(),WriteFile()并用关闭它CloseHandle().

我注意到如果我快速关闭并重新打开一个串口,我就会ERROR_ACCESS_DENIED回来CreateFile().尽管我正在等待CloseHandle()返回,然后等待与该句柄相关的所有未完成的读/写操作从完成端口返回,但这种情况正在发生.肯定有更好的方法:)

如何同步关闭串口?请不要重试循环,睡眠()或其他一些廉价的黑客攻击.

编辑:也许这与我使用完成端口和FILE_FLAG_OVERLAPPED有关.当读/写操作完成时,我得到一个回调.端口关闭是否有某种回调?

windows winapi serial-port iocp io-completion-ports

6
推荐指数
1
解决办法
4909
查看次数

GetQueuedCompletionStatusEx() 不返回每个 OVERLAPPED 错误代码

我正在使用GetQueuedCompletionStatusEx()API,我刚刚意识到它确实可以在 1 个系统调用中读取 N 个 OVERLAPPED 数据包,而不是像 那样只能读取 1 个 OVERLAPPED 数据包,GetQueuedCompletionStatus()但我担心的是我无法知道有关每个 OVERLAPPED 错误代码的任何信息。

虽然GetQueuedCompletionStatus()每次调用仅返回 1 个 OVERLAPPED,但它使我能够通过调用 来检查GetLastError()当前 OVERLAPPED 数据包的最后一个错误。

我怎样才能做到这一点,GetQueuedCompletionStatusEx()实际上返回 N 个重叠数据包,但不返回 N 个错误代码?

我已经阅读过通过调用GetOverlappedResult()您可以实现这一点,但我的观点是:如果我调用GetQueuedCompletionStatusEx()以获取 N 个重叠数据包,然后我必须为每个数据包调用另一个系统调用,则调用 1 个系统调用以获取 N 个重叠数据包的好处是毫无意义,因为你将调用 1+N 系统调用。此时,我可以简单地保留GetQueuedCompletionStatus()并仅调用 N 个系统调用(对于 N 个重叠),而不是 1+N。

有人知道更多吗?

c c++ windows winapi iocp

6
推荐指数
1
解决办法
1840
查看次数

TCP/IP IOCP received data sometimes corrupt - Visual C++ on Windows

I am writing a simple test ICOP client and server to ensure I am using the API correctly and that the data the client sending is being received correctly by the server. I have included all the code for this question.

This is where I ran into some problems, that the data within the receive buffers sometimes seems to be corrupted (corrupted in that sometimes chunks of data within buffers can be out of order or missing). To be clear, …

c++ sockets tcp corrupt iocp

6
推荐指数
1
解决办法
2258
查看次数