易语言资源网 - 做最全的易语言资源下载社区
精易论坛授权登录

【原创】socket在R3中的实现流程,以及简单的服务端/客户Duan   [复制链接]

    2022-07-11 09:22:40
    高级教程源码
    易语言资源网
    1957 次浏览
    来源链接

前言:

  • 关于我为何重写afd.sys实现的socket?
  • 之前已经有人开源过利用afd.sys实现socket:R3应用层利用AFD驱动,编写自己的高效Socket服务
  • 但是因为写法的原因,这份源码不能在我的电脑上正常运行(检查了一下,是参数的坑,说白了还是易语言结构体的坑)
  • 于是我重新实现了一份源码(基于ReactOS的源码),这份源码的核心在于重实现mswsock.dll中的底层函数。(共实现14个函数,TCPsocket基本完善,由于UDPsocket使用的结构体过于复杂,相关的sendto、recvfrom等函数暂未实现)

正文:

  • 利用afd.sys的基本使用流程是:利用NtCreateFile创建一个名为“\Device\Afd\Endpoint”的“文件”,接着便可通过NtDeviceIoControlFile函数向afd.sys发送控制信息,例如发送IOCTL_AFD_SEND消息即表示是send:
  • 内部一共封装了14个函数:,熟悉socket的易友可以直接封装使用,内部效率还可以继续优化,想继续优化几十毫秒的可以继续优化。
  • 如果不会封装底层函数也没有问题,我已经尝试封装了一个简陋的TCPService和TCPClient模块,函数不多,功能是基本够用的
  • 封装好的服务端和客户端我也写了一个例子,客户端测试:
  • 服务端测试:
  • 里面的异步模型我使用的WSPEventSelect实现的,内部写得很简陋,不过基本够用,测试1000客户量稳定使用(更高的客户量请自行测试,由于设计简单,本模型还有更多的提升空间)
  • 本socket协议直接使用NtCreateFile,NtDeviceIoControlFile函数实现,完全没有调用ws2_32.dll等,相比于ws2_32.dll,实现过程内部简化很多,send和recv函数的效率明显高于ws2_32.dll的函数。
  • 底层实现的东西,其稳定性取决于代码使用的合理性,用的好这东西稳定性越高。

PS:

  • 由于使用ntdll的函数,程序的兼容性很难说,本程序于win11,x64测试使用通过。
  • 源码的阅读流程:msafd.e(底层实现)->service+client.e(封装产品)->test.e(测试程序)


点我下载 (已有 71 次下载)

引用模块


源码文件名 模块文件名
service+client.e
AFD模块.ec
test.e
简易服务器/客户端.ec


引用支持库


源码文件名 支持库文件名 支持库标识
msafd.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
service+client.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
test.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325


[错误报告]   上一篇:webp转jpg和png     下一篇:zyGdiplus 绘图模块...