- 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/
有没有人在 Windows 上使用 Winsock(不是 MSMQ)级别的 PGM 的经验?它看起来像是一个有用的可靠多播协议(protocol)(la TIBCO Rendezvous),我认为如果
我在 VS 2008 下使用 Winsock。 我有一个线程专门用于通过阻塞调用accept() 来接受传入的TCP 连接请求。当我的应用程序需要关闭时,我需要以某种方式解锁该线程,以便它可以执行关闭
在 KB4338830 更新后一段时间后,我们的应用程序突然持续卡住。不幸的是,应用程序无法重新启动也无法关闭,我怀疑这一切都是因为我正在使用的winsock(刚刚移植)。它是在vb.net上编写的,
我正在使用 Winsock API(不是 CAsyncSocket)来创建一个监听传入连接的套接字。 当有人尝试连接时,如何在接受连接之前获取他们的 IP 地址?我试图让它只接受来自某些 IP 地址的
服务质量 (QoS) 旨在管理带宽使用,这隐含地假设应用程序竞争该(有限)资源。这些天来,对于任何应用程序来说,这真的是一个问题吗? 它还假设 QoS 协议(protocol)和 Internet 协
我的项目使用 windows.h,其中使用了 winsock.h,我需要包含使用 winsock2 的 boost:assio。所以我收到很多错误,说 Winsock.h 已经包含在内。我可以定义 W
使用典型的 irc 客户端,我可以输入: /server localhost 6667 nick:pass 当我输入为 ZNC 配置的 nick:pass(IRC 保镖)时,我将被转发到在我的服务器/
我正在研究我面临的问题之一,与提出的问题类似 here .该问题基本上解决了客户端应用程序无法连接到数据库的问题。该解决方案似乎表明安装了与网络协议(protocol)不兼容的应用程序,我们应该卸载该
我一直在挠头,几个小时以来一直在寻找这个问题的答案。基本上我所做的就是打开一个到其他机器的套接字并从中读取数据。然后,通过传递表示套接字的 int 的 fdopen 调用,将该套接字“转换”为文件句柄
我在我的 VB6 应用程序中使用 winsock,这是我的代码: Private Sub Form_Load() With Winsock1 .Close .RemoteHo
我需要按照确定的顺序从客户端向服务器发送数据,服务器也可以按客户端发送的相同顺序接收这些数据。在下面的代码中,存在一个问题,即像下一个数据的数据一样接收数据(即控制字节 1 )。 前任: 在客户端上,
我正在开发客户端-服务器 Winsock 应用程序 (Visual C++),它应该通过网络传输各种数据(视频流、音频流、服务通知等)。我知道更简洁的方法是为每个单独的数据类型在单独的线程上使用单独的
我正在使用Microsoft Windows WinSock API拧小型HTTP服务器。 处理多个用户时是否需要应用多线程逻辑? 当前,Windows会在发生网络事件时发送一条消息,并且每条消息 (
对于我的项目,我无法调试程序,所以我无法确定为什么会出现此错误。 我的托管在 c# 上的服务器无法连接到本地主机上的服务器。 它没有向我的服务器发回“连接”信号,它永远不会连接,我认为代码写得很好,我
如何让 Winsock 程序只接受来自特定地址的连接请求?我希望被拒绝的连接被完全忽略,而不是得到 TCP 拒绝。 最佳答案 要使 Winsock 程序仅接受来自特定 IP 地址的连接,请使用 WSA
我写了一个数据包拦截器来转储来自winsock的send/recv函数的信息,据我所知,这两个函数都位于ws2_32.dll中;该钩子(Hook)是通过向一个函数写入一个 jmp 来完成的,该函数记录
我有一个简单的 winsock 程序,我想通过系统代理传递我的连接。我看到一些帖子解释了如何捕获系统代理然后发送如下字符串: CONNECT 127.0.0.1:8080 HTTP/1.0\r\n 等
我正在使用 tcp 套接字在 Windows XP 上的两个应用程序之间提供进程间通信。由于各种原因,我选择了 tcp 套接字。我看到平均往返时间为 2.8 毫秒。这比我预期的要慢得多。分析似乎表明延
我正在尝试在 Windows 下移植这个简单的 TCP echo 程序 ( https://github.com/mafintosh/echo-servers.c/blob/master/tcp-ec
过去两周我一直在学习 C,设法了解指针、数组和结构。 我想在 Windows 上进行一些套接字编程,想知道是否有人有任何提供教程和示例的网站,或者推荐一些使用 winsock 进行网络编程的书籍? 我
我是一名优秀的程序员,十分优秀!