Articles of iocp

testingI / O完成端口支持

我在SMTP邮件服务器( LumiSoft邮件服务器 )的代码中find以下代码。 根据方法名称,testing平台是否支持I / O完成端口 。 /// <summary> /// Gets if IO completion ports supported by OS. /// </summary> /// <returns></returns> public static bool IsIoCompletionPortsSupported() { Socket s = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp); try{ SocketAsyncEventArgs e = new SocketAsyncEventArgs(); e.SetBuffer(new byte[0],0,0); e.RemoteEndPoint = new IPEndPoint(IPAddress.Loopback,111); s.SendToAsync(e) return true; } catch(NotSupportedException nX){ string dummy = nX.Message; return […]

IOCP和ReadFileEx用法

我正在玩IOCP。 我试图编写简单的应用程序,asynchronous读取主线程中的文件的数据。 不过,我在ReadFileEx函数中收到错误(ERROR_INVALID_PARAMETER),但似乎我做得很好。 我究竟做错了什么? 这是我的例子: #include "stdafx.h" #include <windows.h> #include <assert.h> #include <stdint.h> VOID CALLBACK ReadCb(DWORD dwErrorCode,DWORD dwNumberOfBytesTransfered,LPOVERLAPPED lpOverlapped) { fprintf(stderr,"i was here\n"); } int _tmain(int argc, _TCHAR* argv[]) { HANDLE main_io,file_i; HANDLE file_handle; DWORD bytes_recvd; ULONG_PTR data = 0; OVERLAPPED overlapped; LPOVERLAPPED poverlapped = &overlapped; uint8_t read_data[1024]; DWORD err; main_io = CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,0,0); assert(main_io != […]

重叠的I / O:如何唤醒完成端口事件或正常事件的线程?

我想使用线程池来启动/取消重叠的读取操作 – 分别使用ReadFile()和CancelIo() – 以及在读取操作完成时处理任何完成端口事件。 任何线程都可以启动读取操作 任何线程都可以处理读完成事件 只有启动读取的线程才能取消它(这是一个CancelIo()限制) 我不知道如何实现这一点。 一个通常调用GetQueuedCompletionStatus()等待完成端口事件和WaitForSingleObject()等待正常事件,但不清楚如何混合两者。 如果PostQueuedCompletionStatus()会让我指定一个特定的线程来唤醒我会被设置。 有任何想法吗? 更新 :解决scheme必须在Windows XP上运行。 不幸的是,这排除了使用CancelIoEx()或GetQueuedCompletionStatusEx() 。

I / O完成端口可以帮助数据库而不是文件写入?

我正在阅读IOCP,从我目前了解的情况来看,asynchronous写入仅适用于写入文件的上下文。 通过“文件”,我不是只是磁盘文件,而是Windows上的“文件”types的输出设备。 我打算以某种方式使用IOCP来实现从客户端接收消息的服务器,然后将这些消息asynchronous地写入数据库(MySQL或SQLite)。 但据我所知,IOCP中的asynchronous写入涉及将数据写入设备驱动程序 – 而“设备驱动程序”的提及似乎排除了使用IOCP和asynchronous写入数据库的可能性,因为存在从应用程序编写者的angular度来看,没有涉及到写入数据库的“设备驱动程序”。 那么,IOCP真的可以帮助实现写入数据库的服务器吗? 我有一种唠叨的感觉,我误解了一些东西。 如果IOCP在这种情况下无法提供帮助,那么对于实现在Windows上对数据库执行asynchronous写入的服务器,我应该看看有什么build议吗?

在没有ConnectEx的情况下,Windows上的非阻塞套接字连接

我需要在单个进程中启动1000个客户端连接,我需要解决的关键限制是驱动程序不支持ConnectEx,所以我不能拥有纯粹的IOCP解决scheme。 我的第一个想法是一个线程池来处理连接,每个句柄可以使用普通连接/select语义处理多达64个连接,一旦连接继续IOCP。 但是这不行, 一旦select正在运行,我不能添加另一个套接字到FD_SET。 所以我将不得不将套接字设置为非阻塞,而是轮询它们。 最好的解决scheme可能是最简单的; 每个线程一个连接客户端。 假设我可以保持连接速度合理,池中的线程数可能很小。 这是一个奇怪的情况,理想情况下,驱动程序将支持ConnectEx,但它不(现在),我需要以最好的方式解决它。 有另一种方法吗?

如何使用Windows IOCP检测断开连接(RST / FIN)?

如何使用Windows IOCP API找出TCP连接是否被对等体(通过发送RST包或类似的东西)拆除? 具体来说,我不能发送或接收任何数据 – 没有重叠的操作正在进行。 我只想获得asynchronous通知。 有没有办法做到这一点?

IOCP recv和发送

到目前为止,我发现的所有例子,不是只读或写就是10000行的野兽,我甚至不知道从哪里开始了解它们是如何工作的。 为了testing我的代码,我在服务器上指向了一个浏览器并发送了一个简单的http请求。 结果令人困惑。 例如,GetQueuedCompletionStatus返回一个点,WSARecv表示它读取了我发送的http响应的字节数,尽pipe这个响应应该(并且)在客户端结束,recvbuffer甚至没有被这些字节填充。 另外我不明白什么时候释放我的缓冲区,一旦其他浏览器closures连接,因为GetQueuedCompletionStatus在我呼叫closesocket后不断返回几次。 进一步,我不知道GetQueuedCompletionStatus返回什么时候有数据要读取或写入数据。 我可以尝试两个,看看哪个失败,但这似乎粗鲁。 为了揭示我对IOCP的任何误解,我写了一些伪代码来传达我认为我的代码的作用: main { create server socket create io completion port while true { accept client socket create completion port for client socket create recv buffer and send buffer for client call WSARecv once with 0 bytes for whatever reason } } worker thread { while true { wait […]

IO完成端口和套接字发送()

根据我对IOCP的理解,当我创build一个完成端口并将一个套接字关联到它时,当套接字准备好被读取时,通知将被发送到完成端口。 但是如何处理send() ,我的意思是如果我想发送数据,我应该只是调用send() ? 完成端口怎么样,它是否得到关于send()任何通知?

使用IOCP检测subprocess的退出/失败 – C ++ – Windows

我有一个stream程pipe理器。 它可能使用createprocess函数创build数千个(在纸上!)subprocess。 目前我正在使用mufti-threading和WiatForMultipleObejct来检测任何孩子的退出或失败。 我正在寻找一些build议/指导/伪代码/链接来检测使用IOCP的subprocess的退出,如果有可能的话! 非常感谢!

如何暂停IOCP TCP套接字服务器?

我的程序类似于HTTP代理,它等待接口上的消息,并将它们转发到另一个接口。 该应用程序只使用IOCP,客户端和服务器端。 有时,客户端比服务器速度慢(比例为10或100),无法缓冲太多的数据。 我怎样才能暂停build立的TCP连接,然后恢复它,而不会丢失任何消息? 我试图推迟一个新的recv IOCP事件,但一些消息丢失。 C ++ / Windows 7+