- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
由于我的母语不是英语,所以我可能会遗漏一些东西,所以也许这里有人比我更了解。
取自WSASend MSDN 上的说明:
lpBuffers [in]
A pointer to an array of WSABUF structures. Each WSABUF structure contains a pointer to a buffer and the length, in bytes, of the buffer. For a Winsock application, once the WSASend function is called, the system owns these buffers and the application may not access them. This array must remain valid for the duration of the send operation.
好的,你能看到粗体字吗?那是不清楚的地方!
我能想到这行的两种翻译(可能是别的,随便你怎么说):
翻译 1 - “缓冲区”指的是 OVERLAPPED 结构,我在调用它时传递了这个函数。只有在收到关于它的完成通知时,我才可以再次使用该对象。
翻译 2 - “缓冲区”指的是实际缓冲区,那些包含我正在发送的数据的缓冲区。如果 WSABUF 对象指向一个缓冲区,那么在操作完成之前我不能触及这个缓冲区。
谁能告诉我对那句话的正确解释是什么?
还有.....如果答案是第二个——你会怎么解决?
因为对我来说,这意味着对于我发送的每个数据/缓冲区,我必须在发送方保留它的副本 - 因此在高流量应用程序上有许多“待定”缓冲区(不同大小),这真的伤害“可扩展性”。
陈述1:
除了上面的段落(“和......”)之外,我认为 IOCP 将要发送的数据复制到它自己的缓冲区并从那里发送,除非你设置 SO_SNDBUF归零。
声明2:
我在函数体中使用堆栈分配的缓冲区(你知道,类似于 char cBuff[1024];
- 如果对主要问题的翻译是第二个选项(即缓冲区必须保持原样,直到发送完成),然后...这真的把事情搞砸了!你能想办法解决它吗?(我知道,我在上面换句话说问过)。
最佳答案
答案是重叠结构和数据缓冲区本身在操作完成之前不能被重用或释放。
这是因为该操作是异步完成的,因此即使数据最终被复制到 TCP/IP 堆栈中操作系统拥有的缓冲区中,这种情况也可能要等到将来某个时间才会发生,并且您会收到写入通知完成发生。请注意,如果您在没有明确流量控制的情况下发送并依赖 TCP 堆栈为您进行流量控制(请参见此处:some OVERLAPS using WSASend not returning in a timely manner using GetQueuedCompletionStatus?)...
您不能使用堆栈分配的缓冲区,除非您在重叠结构中放置一个事件并阻塞它直到异步操作完成;这样做没有多大意义,因为您会增加普通阻塞调用的复杂性,并且通过发出异步调用然后等待它不会获得很多好处。
在我的 IOCP 服务器框架(您可以从 here 免费获得)中,我使用动态分配的缓冲区,其中包括 OVERLAPPED 结构并且是引用计数的。这意味着清理(在我的例子中它们被返回到池中以供重用)发生在完成发生并且引用被释放时。这也意味着您可以选择在操作后继续使用缓冲区,并且清理仍然很简单。
另见此处:I/O Completion Port, How to free Per Socket Context and Per I/O Context?
关于winsock - 一道IOCP文档解释题——buffer ownership ambiguity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3028376/
我正在设计客户端-服务器应用程序。我的服务器将使用 C++ 并使用 IOCP 进行 TCP/IP 通信。 尚未决定用于客户端开发的技术。所以我对 IOCP 与将来要开发的客户端的兼容性有几个问题(我需
我有经典的 IOCP 回调,它以这种方式使 i/o 挂起的请求出列、处理它们并释放它们: struct MyIoRequest { OVERLAPPED o; /* ... other params
我有 IOCP 应用程序,每个套接字上下文存储 64kb 缓冲区。它使用大量 RAM,同时处理数千个套接字。相反,我想切换到每个 iocp 线程上下文有 64kb 缓冲区的模型(就像我可以在 epol
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
正在学习IOCP,根据这个article : To begin using completion ports we need to create a Completion Port which in
我一直在脑海中传递一些关于如何在保持 KISS 的同时使用 IO 类型的架构实际包含大量连接的想法。通过网络上的示例,似乎大多数人都使用带有 CONTAINING_RECORD 的双/单链表。而且,作
我想了解为什么使用 IOCP。我可以想到两个原因: 因为 WSARecv() 不会阻塞,所以我可以处理 1000 个客户端,而不必为每个客户端创建一个新线程(另外,您可以创建的线程数量是有限制的,因此
我最近在 windows 平台上遇到了一个叫做 IOCP 的东西,更准确地说:输入/输出控制端口。这似乎是最有效的编写服务器软件代码的方式,因为它需要同时容纳数千名用户。(如果我错了请纠正我,但是每个
到目前为止,我发现的所有示例要么只能读取或写入,要么是 10000 行的巨兽,我什至不知道从哪里开始了解它们的工作原理。 为了测试我的代码,我将浏览器指向我的服务器并发送了一个简单的 http 请求。
我应该读取前 9 个字节,其中应包括数据包的协议(protocol)和传入大小。 当完成端口返回 9 个字节时哪个更好? (性能/良好实践或美学方面) 在套接字上发送另一个重叠读取,这次使用数据包的大
据我了解Windows Server 2003/2008和C++编程下的IOCP,它们或多或少是服务多个套接字(而不是选择)或将多个线程 bundle 在一起以服务那些请求的最高性能方式。 但是,如果
我正在构建 IOCP/RIO Winsock 服务器,并且当客户端触发我的 AcceptEx() 调用时,一直在努力从完成端口获取正确的通知要求。 当我在发送客户端请求后调用 GetQueuedCom
因此,我构建了一个高度多线程的并发应用程序,它管理自己的工作线程(因为它们在整个应用程序生命周期内运行)。现在我使用 SocketAsyncEventArgs 进行网络连接,它在后台使用 I/O 完成
当我调用 BeginExecuteReader (SQL) 时,它是否使用 IO 完成端口?是什么让它成为异步的?我应该从 Begin[Operation]() 还是从 IAsyncResult 构造
这是Microsoft Windows 网络编程 的代码片段: ... // Determine how many processors are on the system. GetSystemInf
如果 FILE_SKIP_COMPLETION_PORT_ON_SUCCESS 未启用,那么即使操作立即成功完成,我仍然会在完成端口上收到完成通知。我想知道如果它也立即完成并出现错误,是否属于这种情况
我正在创建一个客户端程序,它与通过 LAN 连接到我的 PC 的设备进行通信。 我的程序和设备之间典型的通信如下: Program -> Device 1616000D 08 02 00 00
我读到传递给 CreateIoCompletionPort() 函数的 NumberOfConcurrentThreads 参数的理想数字是 0,它将转换为核心数。 但是,我实际应该创建多少个等待完成
我正在为从桌面客户端到浏览器的视频流编写 IOCP 服务器。双方都使用 WebSocket 协议(protocol)来统一服务器的架构(并且因为浏览器没有其他方式可以执行全双工交换)。 工作线程是这样
我可以找到大量关于启动 IOCP 服务器的文章,但没有一篇是关于正确关闭它的 =/ 完成后关闭服务器的正确方法是什么?更具体地说,我已经使用 PostQueuedCompletionStatus()
我是一名优秀的程序员,十分优秀!