Articles of iocp

Linux和I / O完成端口?

使用winsock,你可以configuration套接字或单独的I / O操作来“重叠”。 这意味着执行I / O的调用会立即返回,而实际的操作是由不同的工作线程asynchronous完成的。 Winsock还提供“完成端口”。 据我所知,一个完成端口作为手柄(sockets)的多路复用器。 如果一个句柄不在I / O操作的中间,也就是说,如果它的所有I / O操作都完成了 ,它就可以被解复用。 所以,在我的问题… Linux支持完成端口,甚至asynchronousI / O套接字?

IOCP AcceptEx不会在连接时创build完成

我目前正在尝试一些新的库(IOCP)进行套接字编程。 我偶然发现了AcceptExfunction来启用asynchronous连接。 正如文档所述: 与accept函数不同,AcceptEx函数使用重叠的I / O。 如果您的应用程序使用AcceptEx,它可以为相对较less的线程数量的大量客户端提供服务。 与所有重叠的Windows函数一样,可以使用Windows事件或完成端口作为完成通知机制。 但是,当客户端连接时,我不会完成任何完成。 当客户端发送数据时,我会完成。 这是我的代码: DWORD dwBytes; GUID GuidAcceptEx = WSAID_ACCEPTEX; int iResult = WSAIoctl(m_hSocket, SIO_GET_EXTENSION_FUNCTION_POINTER, &GuidAcceptEx, sizeof (GuidAcceptEx), &m_lpfnAcceptEx, sizeof (m_lpfnAcceptEx), &dwBytes, NULL, NULL); if (iResult == SOCKET_ERROR) { CloseSocket(); } 接着: WSAOVERLAPPED olOverlap; memset(&olOverlap, 0, sizeof (olOverlap)); char lpOutputBuf[1024]; int outBufLen = 1024; DWORD dwBytes; BOOL bRet […]

与链接列表项目投射问题

这是我的PER_IO_CONTEXT结构(我把它们存储在单独的链表中): typedef struct _PER_IO_CONTEXT { SLIST_ENTRY ItemEntry; WSAOVERLAPPED Overlapped; WSABUF wsabuf; /* some other data*/ } PER_IO_CONTEXT, *PPER_IO_CONTEXT; 下面是WSAsend,使用列表获取WSAOVERLAPPED结构: … PSLIST_HEADER pListHead; … PSLIST_ENTRY pListEntry = InterlockedPopEntrySList(pListHead); PPER_IO_CONTEXT ovl = (PPER_IO_CONTEXT)pListEntry; WSASend(pTmp1->Socket,…, &(ovl->Overlapped), NULL); 和GQCS获得通知的最后一部分: LPWSAOVERLAPPED lpOverlapped = NULL; PPER_IO_CONTEXT lpIOContext = NULL; …. GetQueuedCompletionStatus(….. (LPOVERLAPPED *)&lpOverlapped, INFINITE); lpIOContext = (PPER_IO_CONTEXT)lpOverlapped; lpIOContext->wsabuf // this fail […]

I / O完成端口* LAST *称为callback,或者:清除事物的安全位置

我想这个论点很重要,应该在这里有一些空间。 让我们考虑C / C ++中最常见的I / O完成端口devise,它具有一个抽象HANDLE的结构(或类),以及它的一些属性,如下所示: class Stream { enum { Open = 1, Closed = 0 }; // Dtor virtual ~Stream() { if (m_read_packet != 0) delete_packet(m_read_packet); // the same for write packet } // Functions: bool read(…) { if (m_read_packet != 0) m_read_packet = allocate_packet(); ReadFile(m_handle …); } bool write(…); bool close() […]

如何找出何时CancelIo()完成?

CancelIo()应该取消与调用线程关联的所有挂起的 I / O操作。 根据我的经验,CancelIo()有时也会取消将来的 I / O操作。 鉴于: ReadFile(port, buffer, length, &bytesTransferred, overlapped); 如果在读取之前立即调用CancelIo(port) , GetQueuedCompletionStatus()将永远阻塞,永远不会接收读取操作。 如果我在读取之后立即调用CancelIo(port) , GetQueuedCompletionStatus()将返回0与GetLastError()==ERROR_OPERATION_ABORTED 如果我调用CancelIo(port)并且没有挂起或者后续读取, GetQueuedCompletionStatus()将永远阻塞。 这里的关键是没有办法检测CancelIo()何时结束执行。 如何确保CancelIo()完成执行,并且可以安全地发出进一步的读取请求? PS:看http://osdir.com/ml/lib.boost.asio.user/2008-02/msg00074.html和http://www.boost.org/doc/libs/1_44_0/doc/html/ boost_asio / using.html这听起来像CancelIo()是不是真的可用。 必须客户需要Windows XP支持。 我有什么select? 注意 :我正在从串口读取数据。

Node.js可以在Windows上生产吗?

在新的0.5.1分支中,有一个正式的Node.js Windows可执行文件。 Node.js的Linux版本使用已build立的库,例如v8,libev,libeio。 自解放和解放是为了* NIX平台; 是准备用于生产的Node.js的Windows端口,还是仅用于开发?

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

比方说,我有一个真正的networking接口和几个回环接口的Windows 7。 我有IOCP启用服务器接受来自客户端的连接。 我试图尽可能模拟真正的客户端连接到服务器。 我的客户端代码只是build立了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} […]

IO完成端口密钥混淆

我正在使用ctypes模块在Python中使用Windows DLL API编写基于IO完成端口的服务器( 源代码 )。 但这是对API的直接使用,这个问题针对那些掌握IOCP知识的人,而不是Python。 正如我理解的CreateIoCompletionPort的文档,你指定你的“用户定义的”完成键,当你用一个文件句柄(在我的情况下是一个套接字)与创build的IOCP关联调用此函数。 当你开始调用GetQueuedCompletionStatus时,你会得到一个完成键值和一个指向重叠对象的指针。 完成键应该确定重叠的对象和请求已经完成。 但是,假设我在CreateIoCompletionPort调用中使用重叠对象传入100作为完成键。 当相同的重叠对象的IO完成并且通过GetQueuedCompletionStatus返回时,它所附带的完成键要大得多,并且与原始值100毫不相似。 我误解完成密钥是如何工作的,还是我在上面链接的源代码中做错了?

有些使用WSASend的OVERLAPS没有及时使用GetQueuedCompletionStatus返回?

背景:我正在使用CreateIoCompletionPort,WSASend / Recv和GetQueuedCompletionStatus在我的服务器上执行重叠套接字io。 对于stream量控制,当发送给客户端时,只有当所有挂起的OVERLAPspopupIOCP时才允许调用几个WSASend()。 问题:最近,OVERLAPs没有返回到IOCP时出现了occassions。 调用GetQueuedCompletionStatus的线程不会获取它们,它们将保留在我的本地待定队列中。 我已经validation客户端接收到的数据从套接字和套接字连接。 调用WSASend()时,不会返回任何错误。 没有像以下这样的外部刺激,OVERLAPs只是“永不”回来: 断开与客户端或服务器的套接字,立即允许GetQueuedCompletionStatus线程检索OVERLAPs 在所有OVERLAPs突然从队列中popup之前,对WSASend()进行额外的调用,有时需要几个。 问:有没有人看过这种types的行为? 任何想法是什么造成这个? 谢谢,杰弗里