Winsock2的WSABUF对齐问题记录

这篇具有很好参考价值的文章主要介绍了Winsock2的WSABUF对齐问题记录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

    本人是Delphi老程序员,开发Windows下异步底层通信组件已经好多年,最高性能的完成端口组件也已经实现好多年了,可以说对Winsock已经是相当熟悉,完成端口的运行机制也比较熟悉,所开发的组件应用于公司的系统,成功应答数千大数据量并发连接的考验,应该说技术上算是比较成熟稳定了。

   我开发电脑上,目前使用2个版本的Delphi,古老的Delphi7和稍微新点的XE2,Delphi7够老,不支持64位平台,XE2是支持的。由于系统性能一直还不错,所以也就没有抽出时间来对完成端口组件进行64位升级改造,最近心血来潮,决定把这个捡起来,后续会开放源代码到Github上,原来32位的封装有的地方也有点不合理,新的64位封装会尽量改造好一些,接口却会简化。

    写这篇博客的原因,其实我早就发现Delphi的Winsock2在64位下有点问题,Winsock2.pas单元定义的WSABUF结构带有packed字样,表明结构是按字节对齐,一个数据长度,一个数据指针,这个在32位程序里没有问题,因为大家都是4字节,无论怎么对,都是8字节大小,换到64平台,如果带packed,程序运行肯定不会成功,WSABUF此时的大小应该是12字节,这个问题在改写一个重叠I/O的UDP组件时发现,把packed去掉WSARecvFrom和WSASendTo就可以正确调用。

    我封装新的64位完成端口组件的时候,发现调用WSARecv总返回10014(WSAEFAULT)的错误,看MSDN,说是WSABUF的地址不对,系统无法访问它,因此返回这个10014的错误,如果不是有前人的经验,大家想破脑袋,也无法解决这个问题,因为WSABUF的指针看起来不会有任何问题,实际上是微软玩了手脚,要求WSABUF的指针必须对齐到4的倍数,换句话说,这个指针整数必须是4的倍数,NativeUInt(pBuf) mod 4=0,这里pBuf就是WSABUF指针,有如下两篇文章可以参考,他们也发现这个问题,并解决,感谢两位的努力和分享,文章链接如下:http://www.cppblog.com/Tim/archive/2011/07/07/150391.html  https://blog.csdn.net/shandongmachao/article/details/48541971。

  按照他们两位的说法,我是这么解决的,代码例子如下:

var

   buf:array[0..127] of Byte;

   dd:NativeUInt;

  pBuf:PWSABUF;

  err:Integer;

  FinishLen,Flag:DWORD;

begin

  FillChar(buf, SizeOf(buf), 0);
  dd:=NativeUInt(@buf[0]);
  dd:=dd + (WSABUF_ALIGN_NUM - dd mod WSABUF_ALIGN_NUM);
  pBuf:=PWSABUF(dd);

  err:=WSARecv(sock,     //客户端套接字
             pBuf,  //接收缓冲区
             1,                      //缓冲区个数
             FinishLen, //接收到的字节数,完成包里有,这里不用管
             Flag,                   //标志,必须初始化为0或有效值,否则会出错
             nil, //重叠结构
             nil) ;

  ...

end;

这么搞一下以后,WSARecv和WSASend就正常了。

 文章来源地址https://www.toymoban.com/news/detail-482311.html

最后透露一下未来我的64位完成端口通信组件的功能,目前已经初具雏形,第一波测试已经基本结束:

1、可以同时监听多个端口,每个端口都可以自由控制接收发送

2、支持高性能文件发送,使用TransmitFile API函数

3、支持高性能使用完成端口控制的文件读写

 

到了这里,关于Winsock2的WSABUF对齐问题记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 解决pip安装torch库出现问题(本人自己安装心路历程,希望对你有用)

    本人刚开始使用的python 3.11.0 博主按照以前下载库的方法一样,输入 pip install torch 然后系统报错为: ERROR:Could not find a version that satisfies the requirement torch 当我输入更新指令: python -m pip install --upgrade pip 再次输入pip install torch cmd命令栏中输入: pip install torch -i https://pypi.douban.com/s

    2024年01月21日
    浏览(43)
  • 解决升级到 Delphi 12 后遇到 SQLite 不兼容的问题

    今天升级到 Delphi 12 后,编译运行原来的项目,出现“[FireDAC][Phys][SQLite][sqlite3]-303.Capability is not supported ”的错误。 经过查找文档,发现是FireDAC SQLite 版本更新导致的。 RAD Studio 12.0 支持 SQLite 3.42,同时保留了使用 FireDAC 加密(FDE)的 SQLite 3.31.1 的选项。由于 SQLite 3.42 版本放

    2024年02月05日
    浏览(51)
  • Delphi解决 openssl DLL 与 Indy 的SSL/TLS 连接问题

    昨天,突然间,我的一个 Delphi 程序无法连接到互联网上的各种WMS服务器。我收到以下错误消息: 使用 SSL 连接时出错。错误 1409442E:SSL 例程:ssl3_read_bytes:tlsv1 警报协议版本 由于我使用的是最新版本的Indy,根据Delphi Praxis 上的此线程,这种情况不应该发生。事实证明,不知

    2024年02月08日
    浏览(36)
  • 安装ubuntu22.04 解决wifi6驱动问题 + 没有Realtek rtl8852be 驱动(本人电脑:Redimbook R7 5800H)

    Ubuntu 没有wifi图标,没有Realtek rtl8852be 驱动 问题原因: 由于该系列无线网卡属于“螃蟹网卡”,inter12代 内核版本 5.18,Ubuntu22.04 没有相应的网卡驱动导致 解决: 在window系统,Xiaomi电脑管家,查看wifi驱动,发现是Realtek RTL8852BE wifi 6 802.11ax PCIe Adapter 安装需要的工具 注意:根

    2024年02月12日
    浏览(71)
  • 求助帖(setiosflags)的左右对齐问题:

    以后自己要注意,如果两个相互矛盾的标志同时被设置,如先设置 setiosflags(ios::right),然后又设置 setiosflags(ios::left),那么结果可能就是两个标志都不起作用。因此,在设置了某标志,又要设置其他与之矛盾的标志时,就应该用 resetiosflags 清除原先的标志。 resetiosflags (ios_ba

    2024年01月20日
    浏览(29)
  • 结构体内存对齐,位段,枚举相关问题.

    本文标签:    结构体内存对齐   结构位段问题   枚举 文章目录 目录 文章目录 一、结构体的内存对齐. 1.计算结构体大小 2.为什么存在内存对齐? 二、结构体的位段问题. 三、枚举 1.枚举类型定义 2.枚举的优点 为什么使用枚举? 总结 知道了结构体的基本使用,我们可以深入探

    2023年04月08日
    浏览(31)
  • vim中出现复制不对齐-乱码问题

    不对齐解决: 使用纯文本模式粘贴:在进入 Vim 编辑器后,先按下 :set paste 进入插入模式,然后再进行粘贴操作。这样可以确保粘贴的文本以纯文本格式插入,而不会触发自动缩进或其他格式化操作 中文乱码问题: 在终端中,查看当前终端的字符编码设置。 可以使用下述命

    2024年02月14日
    浏览(37)
  • winsock与BSD socket异同

    WinSock是Windows操作系统中用于网络通信的应用程序接口(API),它允许应用程序通过TCP/IP协议栈进行网络通信。WinSock提供了一套与套接字相关的函数,这些函数包括socket、bind、listen、accept、connect等。应用程序可以使用这些函数创建、绑定、监听、接受、连接和关闭套接字。

    2023年04月08日
    浏览(43)
  • AGI的核心对齐问题:能力泛化和急速左转

    在解决人工智能对齐(alignment)的技术挑战时,一个核心问题是确保人工智能系统的行为与人类价值和期望保持一致。 然而,人工智能系统往往在获取更强大的能力时会比在对齐方面更容易实现泛化。换句话说,尽管我们可能能够使人工智能系统在某些特定任务上对齐,但这

    2024年04月13日
    浏览(32)
  • Windows下的网络编程Winsock

    注意ws2_32.lib库路径:C:Program Files (x86)Windows Kits10Lib10.0.19041.0umx64。 相比于基础,网络编程就要复杂一些,但其实也有固定格式,记住即可。 首先是需要的头文件和库: 主要流程及主要函数: 网络环境初始化: WSAStartup。 创建服务器套接字: socket。 绑定本机IP和端口:

    2024年02月09日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包