问题标签 [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 投票
2 回答
1142 浏览

c++ - 同一容器中的 IOCP 多个套接字完成端口

在过去的几天里,我一直在思考如何解决我面临的一个问题,我试图研究这个话题,但我真的不知道我能做什么。

我在同一个结构中有 2 个套接字,它们都具有相同的完成端口。问题是,它们都使用不同的协议。有没有办法可以找出触发了哪个套接字?他们叫game_socket,和client_socket

示例代码将类似于...

任何想法或帮助将不胜感激:)

0 投票
2 回答
602 浏览

c++ - C++ IOCP 服务器容器信息

关于如何在维护 KISS 的同时使用 IO 类型的架构实际包含大量连接,我一直在脑海中传递一些想法。通过网络上的示例,似乎大多数使用带有 CONTAINING_RECORD 的双/单链表。而且,作为 IO 服务器的新手(尽管每天都在改进),我也将链表容器用于 IO 架构。

我的问题是,为什么我不能只构建一个大数组并使用 CONTAINING_RECORD,而不是为我的连接使用单/双链表?我可以使用 STL 向量吗?那行得通吗?此外,还有哪些其他类型的容器最适合大型 IO 服务器。

我正在为我的游戏服务器重写服务器架构(经过多次修改),并且这次希望朝着正确的方向前进,因为 id 而不是在不久的将来再次重写它。

感谢您的时间,并回复。

编辑:目前我的服务器架构是(简而言之):

主线程和工作线程都使用链表。我想摆脱这个。

0 投票
0 回答
193 浏览

c++ - 在套接字上设置 IO

我有一个 C++ 程序,我用一个套接字连接到我的服务器,我需要为套接字设置重叠。执行以下操作不起作用:

功能

扩大

proxy_client 结构

主要的

在发送套接字数据(从服务器)之后,当我 GetQueuedCompletionStatus for ServerCompletionPort 时,这似乎不会触发套接字。我想知道如何为套接字设置 IO!感谢您的帮助!:-)

0 投票
0 回答
1903 浏览

c++ - WinSock2 IOCP WSARecv GetQueuedCompletionStatus:数据(自动)在 char*buffer 中结束,而不是 WSABUF.buf...为什么?

在调试时,当调用 WSARecv 时,我为函数提供PerIoData->WSABUF结构的地址。这应该将发送的数据分配给WSABUF.buf char* 数组,看起来是这样。当工作线程循环回到等待的GetQueuedCompletionStatus时,它似乎以某种方式(神奇地)将该数据发送到 PerIoData.Buffer (char* 数组)。所以本质上,PerIoData.BufferPerIoData.WSABUF.buf都等于同一个 char* 数组。当我从PER_IO_DATA结构(以及对它的所有引用)中删除PerIoData.Buffer时,尽管我知道客户端发送数据时GetQueuedCompletionStaus永远不会返回WSABUF.buf应该填充数据。

相关资料:

  1. 我正在实现“Microsoft Windows 网络编程”(第 157 页)中的完成端口模型。尽管那本书中的示例还有很多有待独立发现,但我的代码现在可以正常工作了。
  2. ServerWorkerThread的while循环中:首先调用GetQueuedCompletionStatus,接收per_handle_data,per_io_data
  3. per_io_data 结构是这样的:

    /li>
  4. 我的 GetQueuedCompletionStatus 函数调用如下:

    ret = GetQueuedCompletionStatus(CompletionPort, &BytesTransferred, (LPDWORD)&PerHandleData, (LPOVERLAPPED *)&PerIoData, INFINITE);

  5. 我的 WSARecv 函数是这样调用的:

    WSARecv(PerHandleData->Socket, &(PerIoData->DataBuf), 1, NULL, &Flags, ((LPWSAOVERLAPPED)&PerIoData->Overlapped), NULL); //i know casting the Overlapped structure as LPWSAOVERLAPPED is unnecessary, but I was tweaking the //code when I didn't fully understand the problems I was having.

我的问题是我从来没有明确地为PerIoData->Buffer分配任何东西,但它似乎总是被发送的数据填充。我相信 GetQueuedCompletionStatus “知道”将此数据发送到该PerIoData->Buffer尽管它期望一个指向LPOVERLAPPED结构的指针(我将包含相关Buffer char 数组的PerIoData结构实例传递给该结构)。这真的让我很烦......也许它的行为不像我想的那样,但我可以看到PerIoData->Buffer被填充的唯一地方是来自GetQueuedCompletionStatus方法。如果不是这样,那么PerIoData->Buffer似乎无处不在?我已经搜索了 MSDN 和谷歌好几天了。我会继续寻找,如果我找到答案,我会发布更新。请帮忙?提前致谢!

*注意:我会创建标签 WSABUF 和 GetQueuedCompletionStatus,但这是我的第一篇文章。

--编辑:我发布了结构和工作线程,省略了所有其他不相关的代码。-- 您会注意到 _PER_IO_DATA::DataBuf.buf 已分配内存,然后归零。不指向 myBuffer 数组....

0 投票
1 回答
431 浏览

udp - windows xp vs 7,UDP接受规则有什么区别

当我收到一个 UDP 数据包(尤其是 rtp)时,我有一个不同的现象。它是由 Windows 7 Professional K 的 Windows 版本不同而发生的。

UDP 数据包在我的电脑上没有打开 udp 端口​​的情况下正常发送(我在wireshark 上看到过),但是在 Windows XP SP3 上,UDP 数据包在没有打开 udp 端口​​的情况下不会发送。

恰好一半的数据包正常到达,但其余的数据包没有到达。所以,我的电脑制作了一个 ICMP 类型 3(无法访问的端口错误)数据包并发送它。

我想知道有什么不同,具体来说。

0 投票
2 回答
1959 浏览

winsock - GetQueuedCompletionStatus 挂起

我试图找出我的程序冻结的原因,并将其范围缩小到 GetQueuedCompletionStatus()。

所有 IOCP 线程都被冻结,线程拥有的唯一阻塞调用是 GetQueuedCompletionStatus()。

即使仍有客户连接到相关的套接字,GetQueuedCompletionStatus() 是否有任何理由在大约 30 分钟~6 小时的运行时间后永远保持阻塞?

这是一个使用 IOCP 的 TCP Winsock 程序。操作系统是 Windows Server 2008 R2 Enterprise。

谢谢。

线程代码:

0 投票
1 回答
297 浏览

c++ - asio的源代码中关于iocp的代码在哪里可以得到?

我想学习如何完美地使用iocp,但我找不到函数CreateIoCompletionPort
翻遍了asio的所有文件,只找到了几个.cpp文件!
我如何/应该如何探索源代码?

0 投票
1 回答
564 浏览

windows - IO 完成端口是否在完成端口有要报告的内容之前或之后产生一个新线程?

对于 IO 完成端口完成时实际发生的情况,我有点困惑。

我认为 Win API 允许访问 IOCP 队列,该队列能够以某种方式将具有特定句柄(假设是套接字)的回调引用排队(或堆叠)。当 Windows 收到来自 NIC 的中断时,它会在某个时候进入 NIC 的 IOCP 队列并在其自己的(IOCP) 线程池上执行回调。

我的问题是,线程池中的这个线程是在收到中断时产生的,还是实际上是在调用 Win API 时产生的,有效地使线程处于等待状态,直到它被 IOCP 唤醒队列?

编辑:
我发现这个: http: //msmvps.com/blogs/luisabreu/archive/2009/06/04/multithreading-io-and-the-thread-pool.aspx where is states:“只要该操作完成,它将在该 I/O 完成端口上排队一个数据包。然后该端口将继续并使用线程池的线程之一来运行您指定的回调。

0 投票
1 回答
693 浏览

c# - IOCP线程处理

我正在用 C# 制作一个 IOCP 服务器,调用 win api。我有 1 个接受线程连接和工作线程,具体取决于 CPU 内核。

我的问题是,我有 2 个线程试图同时处理相同的数据,根据以下代码段,你能告诉我解决方案是什么,还是这是一个设计问题?

也可以使用 WSASend 和 WSARecv 获得部分发送或部分接收数据吗?

0 投票
2 回答
656 浏览

windows - 失败的 DisconnectEx/AcceptEx 仍会安排重叠的 IOCP 事件

视窗 8,x64。

将重叠的 Windows 套接字 Api 与 IOCP 一起使用。

注意到套接字的意外行为:例如,对 DisconnectEx 的调用返回错误 WSAENOTCONN,但后来我在 GetQueuedCompletionStatusEx 中收到一个事件,正是这个断开连接(就像它仍然被安排而不考虑返回的错误一样)。AcceptEx 也会发生同样的情况(返回不同的错误,例如 WSAEINVAL)。

我期望 IOCP 事件仅被安排用于挂起的操作(返回错误代码 WSA_IO_PENDING),而不是其他错误。

编辑:我的问题是:即使对 DisconnectEx/AcceptEx 的调用返回不是 WSA_IO_PENDING 的错误(WSAGetLastError),系统能否安排 IOCP 事件?

谢谢!