IOCP AcceptEx 在连接时未创建完成

2024-04-24

我目前正在尝试一些用于套接字编程的新库(IOCP)。我偶然发现了AcceptEx http://msdn.microsoft.com/en-us/library/windows/desktop/ms737524%28v=vs.85%29.aspx启用异步连接的功能。

正如文档所说:

与accept函数不同,AcceptEx函数使用重叠I/O。如果您的应用程序使用 AcceptEx,它可以使用相对较少的线程为大量客户端提供服务。与所有重叠的 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 = m_lpfnAcceptEx( m_hSocket, hSocket, lpOutputBuf,
             outBufLen - ((sizeof (sockaddr_in) + 16) * 2),
             sizeof (sockaddr_in) + 16, sizeof (sockaddr_in) + 16, 
             &dwBytes, &olOverlap);
if ( bRet == FALSE )
{
    DWORD dwRet = WSAGetLastError();
    if( dwRet != WSA_IO_PENDING )
    {
        return dwRet;
    }
}

关于如何接收完成的任何建议?

编辑: 我在 m_lpfnAcceptEx() 之后将 hSocket 绑定到完成端口


首先是WSAOVERLAPPED以及您在调用上方的堆栈上声明的数据缓冲区AcceptEx()当完成发生时将不存在(除非您调用GetQueuedCompletionStatus()在同一个函数中,这有点奇怪)。您需要动态分配它们或池化它们。

其次,您声明在调用后将套接字关联到完成端口AcceptEx()。那是错误的。打电话之前你需要做这些事情AcceptEx().

  1. 创建一个套接字WSA_FLAG_OVERLAPPED set.
  2. 将其绑定到您要收听的地址。
  3. 致电收听您想要的积压工作。
  4. Load AcceptEx()动态地使用监听套接字并调用WSAIoctl(不是绝对必要的,您显示的代码应该可以工作,但这样您就可以确保您从相同的底层winsock提供程序获取侦听套接字并且它支持AcceptEx()。
  5. Load GetAcceptExSockaddrs()以与加载相同的方式AcceptEx()- 接受完成后您将需要它。
  6. 将侦听套接字关联到您的 IOCP。

现在您可以发布一些AcceptEx()使用侦听套接字和您创建的新“接受”套接字进行调用,如下所示:

  1. 创建一个套接字WSA_FLAG_OVERLAPPED set.
  2. 将套接字关联到您的 IOCP。

如上所述,您需要确保缓冲区和 OVERLAPPED 每次调用都是唯一的,并且持续到完成为止。

完成后,您必须执行以下操作......

  1. Call setsockopt() with SO_UPDATE_ACCEPT_CONTEXT在接受的套接字上使用侦听套接字作为数据...
  2. 使用以下方式解锁您的地址GetAcceptExSockaddrs().
  3. 处理任何数据(如果您在缓冲区中为数据分配了足够的空间)。

请注意,根据设计AcceptEx()可用于接受新连接并在一次操作中从该连接返回初始数据(在您知道在开始执行操作之前总是需要一些数据但管理起来非常复杂的情况下,这会导致性能稍好一些你想防御拒绝服务攻击,这种攻击可以通过连接而不是发送数据来发起 - 我写过这个here http://www.serverframework.com/products---the-free-framework.html).

如果你不想AcceptEx()等待数据到达,然后只需提供一个数据缓冲区,该缓冲区仅足够大以返回地址,并传递 0 作为“缓冲区大小”。这将导致AcceptEx()像重叠一样操作accept()并在连接建立后立即返回。

请注意,马丁·詹姆斯对您问题的最初评论实际上就是您正在寻找的答案。不要通过outBufLen - ((sizeof (sockaddr_in) + 16) * 2), pass 0.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IOCP AcceptEx 在连接时未创建完成 的相关文章

  • 扫描文本文件时如何跳过行?

    我想扫描一个文件并在阅读之前跳过一行文本 我试过 fscanf pointer n struct test i j 但这个语法只是从第一行开始 我可以使用 scanf 使用以下指令跳过行 fscanf config file n n 格式字
  • 为什么opencv videowriter这么慢?

    你好 stackoverflow 社区 我有一个棘手的问题 我需要你的帮助来了解这里发生了什么 我的程序从视频采集卡 Blackmagic 捕获帧 到目前为止 它工作得很好 同时我用 opencv cv imshow 显示捕获的图像 它也工
  • C# 中的协变和逆变

    首先我要说的是 我是一名正在学习 C 编程的 Java 开发人员 因此 我会将我所知道的与我正在学习的进行比较 我已经使用 C 泛型几个小时了 我已经能够在 C 中重现我在 Java 中知道的相同内容 除了几个使用协变和逆变的示例 我正在读
  • Android NDK C++“wstring”支持

    我有用 C 编写的源代码 lib 现在我想在 Android NDK 项目 NDK 6 中编译并使用相同的源代码 lib 我能够编译大多数 C 文件 除了基于 std wstring 的功能 在 Application mk 中 当我指定时
  • 为什么派生类不使用基类的operator=(赋值运算符)?

    以下是实际问题的简化版本 而不是打电话Base operator int 代码似乎生成了一个临时的Derived对象并复制它 既然函数签名似乎完美匹配 为什么不使用基本赋值运算符 这个简化的示例没有显示任何不良影响 但原始代码在析构函数中有
  • 如何将pdf页面设置设置为打印属性对话框?

    大家好 我想知道如何设置 pdf 页面设置到打印属性对话框 例如 如果我的 PDF 页面设置为横向 则布局会自动显示横向而不是纵向 如果我的 PDF 页面设置为纵向 则布局会自动显示纵向 我在这个主题上做了很多研发 但没有找到任何满意的链接
  • C# 中附加/分离事件处理程序的不同方式有什么区别

    我的问题有两个部分 首先 我们可以通过以下两种方式附加事件处理程序 myObject MyEvent new EventHandler MyHandler myObject MyEvent MyHandler 据我了解 这两者是等价的 在第
  • 为什么假设 send 可能返回的数据少于在阻塞套接字上传输的请求数据?

    在流套接字上发送数据的标准方法始终是调用 send 并写入一大块数据 检查返回值以查看是否发送了所有数据 然后再次调用 send 直到整个消息被接受 例如 这是一个常见方案的简单示例 int send all int sock unsign
  • 使用反射获取基类的受保护属性值

    I would like to know if it is possible to access the value of the ConfigurationId property which is located in the base
  • 特定设备的不同字体大小

    我目前正在开发通用应用程序 我需要分别处理移动设备和桌面的文本框字体大小 我找到了一些方法 但都不能解决问题 使用 VisualStateManager 和 StateTrigger 为例
  • .net Framework (.net 4.0) 中定义 Base 3 数字的类

    我正在寻找一些可以用来定义 3 基数 三进制数 的类 有什么我可以在 net 框架中使用的东西或者我需要写一些东西吗 谢谢你的帮助 您可以使用解析Convert ToInt32 s base http msdn microsoft com
  • 如何使用泛型类型的 DataContractSerializer 编写自定义序列化器?

    我想编写一个自定义序列化器 用于将会话状态存储到Azure 缓存 预览版 这意味着这个自定义序列化器必须实现IDataCacheObjectSerializer 如果我错了 请告诉我 我需要编写这个自定义序列化程序的原因是我需要序列化一些包
  • 线程安全的 C++ 堆栈

    我是 C 新手 正在编写一个多线程应用程序 不同的编写者将对象推入堆栈 读者将它们从堆栈中拉出 或至少将指针推入对象 C 中是否有任何内置结构可以在不添加锁定代码等的情况下处理此问题 如果没有 那么 Boost 库呢 EDIT 你好 感谢您
  • C# 中处理 SQL 死锁的模式?

    我正在用 C 编写一个访问 SQL Server 2005 数据库的应用程序 该应用程序是数据库密集型的 即使我尝试优化所有访问 设置适当的索引等 我预计迟早会遇到死锁 我知道为什么会发生数据库死锁 但我怀疑我能否在某个时候发布不发生死锁的
  • 为什么 Windows 命令 DIR 在搜索 *.tif 文件时也会输出 *.tiff 文件?

    我想使用 Windows 命令DIR为了找到唯一TIF文件 即具有扩展名的文件 tif 因此我使用以下小批处理文件 for f delims a IN dir b a d s C wolter testversion input tif d
  • `cosf`、`sinf` 等不在 `std` 中 [重复]

    这个问题在这里已经有答案了 根据这里的讨论 我有报告了一个错误 https bugs launchpad net ubuntu source gcc 8 bug 1831385给 Ubuntu 开发者 编译以下示例 C 程序时 includ
  • 无法通过 LINQ to Entities 使用某些功能?

    我正在尝试使用 LINQ 查询在项目上实现搜索功能 由于数据有时包含带有重音符号和其他符号的字符 因此我创建了一种方法来删除这些字符以进行搜索 这是我的代码 var addresses from a in db Addresses join
  • 有没有更好的方法来获取每个项目与谓词匹配的子序列?

    假设我有一个 IEnumerable 例如 2 1 42 0 9 6 5 3 8 我需要获得与谓词匹配的项目的 运行 例如 如果我的谓词是 bool isSmallerThanSix int number 我想得到以下输出 2 1 0 5
  • 为什么 C# 接口名称前面加上“I”

    这种命名约定背后的基本原理是什么 我没有看到任何好处 额外的前缀只会污染 API 我的想法与康拉德一致response https stackoverflow com a 222502 9898与此相关的question https sta
  • 如何从函数返回矩阵(二维数组)? (C)

    我创建了一个生成宾果板的函数 我想返回宾果板 正如我没想到的那样 它不起作用 这是函数 int generateBoard int board N M i j fillNum Boolean exists True initilize se

随机推荐

  • DYMOLA:opc 服务器如何使用 MATLAB 使用 dsin.txt 或 mat 文件进行初始化

    我在 DYMOLA 中创建了一个 OPC 服务器 现在我在 DYMOSIM 中有这个可以单击并初始化 使用 dsin txt 的 MAT 文件 现在我在 MATLAB 中创建了一个 GUI 文件 并获取变量的输入并创建了一个 mat 文件
  • 无法构建轮子 - 错误:无效命令“bdist_wheel”

    我已经尝试了这个非常相关的问题中的所有内容 为什么我无法在 python 中创建轮子 https stackoverflow com questions 26664102 why can i not create a wheel in py
  • postgresql自连接

    假设我有一张这样的桌子 id device cmd value id unique row ID device device identifier mac address cmd some arbitrary command value v
  • Rails:创建删除表级联迁移

    如何在 Rails 3 2 迁移中强制执行 DROP TABLE CASCADE 是否有一个选项可以传递给 drop table table name 在 Rails 4 中 您可以执行以下操作 drop table accounts fo
  • 如何使用在单击按钮上创建的用户触发图表中的放大和缩小?

    我正在构建一个角度应用程序 其中我们需要创建用于放大和缩小图表的单击按钮 我们可以使用可悬停模式栏上的按钮放大缩小图表 但这对于我们的应用程序来说不是必需的 我们希望使用通过单击按钮创建的用户来放大和缩小图表 有没有办法使用单击按钮触发可悬
  • Electron如何拦截http响应体

    有什么办法可以拦截BrowserWindow主进程中的http响应主体没有调试器 是否无法使用WebRequest类和onCompleted method 我可以使用调试器做到这一点 但由于某种原因我不能使用它 await w webCon
  • 在 Eclipse (Spring Source) 中,Grails 始终以生产模式构建

    当在 Grails 项目中使用 Eclipse 时 战争的构建似乎陷入了生产模式 如果您想部署到附加的 tcServer 您只需右键单击您的项目 然后选择 运行方式 gt 在服务器上运行 如果您将 grails 项目设置为 dev 右键单击
  • 气流:Dag 每隔几秒安排两次

    我尝试每天仅运行一次 DAG00 15 00 午夜 15 分钟 然而 它被安排了两次 间隔几秒钟 dag DAG my dag default args default args start date airflow utils dates
  • 显式语义分析

    我遇到了这个术语 显式语义分析 它使用维基百科作为参考 找到文档中的相似性并将它们分类 如果我错了 请纠正我 我遇到的链接是here http www cs technion ac il gabr resources code esa es
  • 十进制铸造

    我有一个这样的十进制数 62 000 0000000 我需要将该小数转换为 int 它的小数总是为零 所以我不会失去任何精度 我想要的是这样的 62 000 存储在 C 中的 int 变量中 我尝试了很多方法 但它总是给我一个错误 字符串的
  • Python列表来存储类实例?

    给定一个 python 类class Student 和一个清单names 然后我想创建几个实例Student 并将它们添加到列表中names names For storing the student instances class St
  • 如何将html页面的动态内容转换为pdf

    在 html 页面中 一些标签是使用 jquery 动态创建的 内容是使用 jquery 和 php 从 msql 数据库加载的 我想将这个动态页面转换为pdf 我尝试过以下代码 但它生成 html 页面静态部分的 pdf html cod
  • 在 C++ 中正确地将 `void*` 转换为整数

    我正在处理一些使用外部库的代码 您可以在其中通过void value 不幸的是 前一个处理此代码的人决定通过将整数转换为 void 指针来将整数传递给这些回调 void val 我现在正在努力清理这个混乱 并且我正在尝试确定将整数转换为整数
  • 估计命令如何查找 R 公式中的变量名称?

    我想使用 R 来估计大量模型nls 函数作用于用户定义的函数 由于许多变量在我的规范中是固定的 我想要一种在我的函数中预先设置它们的方法 但我没有正确理解 R 如何在公式中包含的函数中查找变量 我看过 Hadley Wickham 的高级
  • 我无法获取 servlet 页面中的 POST 值?

    我无法在 servlet 页面中获取 POST 值 我之前的问题与这个问题相关 如何从servlet页面中的ajax请求获取数据 https stackoverflow com questions 6042177 how to get th
  • 如何找到已安装的pandas版本

    我在使用 Pandas 的某些功能时遇到问题 如何查看我的安装版本是什么 Check pandas version In 76 import pandas as pd In 77 pd version Out 77 0 12 0 933 g
  • pytorch 中的 autograd 可以处理同一模块中层的重复使用吗?

    我有一层layer in an nn Module并在一次中使用两次或多次forward步 这个的输出layer稍后输入到相同的layer pytorch可以吗autograd正确计算该层权重的梯度 def forward x x self
  • 在应用程序启动时禁用 Windows 服务

    因为我必须在应用程序启动时关闭 Windows 高级文本服务 有什么特殊的API吗 它适用于具有默认权限的用户吗 该问题的标题是 禁用 Windows 服务 但答案都告诉我们如何停止服务 您在 Google 上会发现的大部分内容是 您可以使
  • 无法在 gae 中运行简单的 helloworld (python 2.7)

    我正在尝试运行官方你好世界 https shadyabhi github com shadyabhi helloworld gitgoogle appengine 1 6 4 中用于 python 2 7 的程序 无法运行一个简单的 hel
  • IOCP AcceptEx 在连接时未创建完成

    我目前正在尝试一些用于套接字编程的新库 IOCP 我偶然发现了AcceptEx http msdn microsoft com en us library windows desktop ms737524 28v vs 85 29 aspx