用户态网络栈调用、用户态接口设置方法和装置转让专利

申请号 : CN202310036359.3

文献号 : CN115827120B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 刘富海陈翔

申请人 : 苏州浪潮智能科技有限公司

摘要 :

本发明实施例提供了一种用户态网络栈调用、用户态接口设置方法和装置,涉及操作系统技术领域;包括获取原始用户态和可移植操作系统接口套接字转换库,可移植操作系统接口套接字转换库包括可移植操作系统接口套接字转换函数;识别原始用户态的应用程序编程接口;将应用程序编程接口的套接字调用函数转换为可移植操作系统接口套接字转换函数,以更新应用程序编程接口;在更新应用程序编程接口后的原始用户态上加载可移植操作系统接口套接字转换库,生成更新用户态;响应于用户态网络栈调用指令,调用更新用户态与用户态网络栈进行数据交互。通过本发明实施例可以实现在原始用户态不改变源代码的情况下直接调用用户态网络栈。

权利要求 :

1.一种用户态网络栈调用方法,其特征在于,应用于用户态,所述方法包括:获取原始用户态和可移植操作系统接口套接字转换库,所述可移植操作系统接口套接字转换库包括可移植操作系统接口套接字转换函数;所述原始用户态包括多个动态库,所述动态库对应有第一应用程序编程接口;

识别所述原始用户态的应用程序编程接口;所述原始用户态的应用程序编程接口为所述第一应用程序编程接口中,与未定义符号匹配的动态库对应的目标应用程序编程接口;

将所述应用程序编程接口的套接字调用函数转换为所述可移植操作系统接口套接字转换函数,以更新所述应用程序编程接口;

在更新应用程序编程接口后的原始用户态上加载所述可移植操作系统接口套接字转换库,生成更新用户态;

响应于用户态网络栈调用指令,调用所述更新用户态与用户态网络栈进行数据交互。

2.根据权利要求1所述的方法,其特征在于,所述识别所述原始用户态的应用程序编程接口,包括:获取定义符号表,所述定义符号表包括所述未定义符号;

采用所述未定义符号与所述动态库进行匹配,从所述第一应用程序编程接口中,确定所述目标应用程序编程接口;

确定所述目标应用程序编程接口为所述原始用户态的应用程序编程接口。

3.根据权利要求2所述的方法,其特征在于,所述未定义符号为多个;所述识别所述原始用户态的应用程序编程接口,还包括:从所述定义符号表逐一确定目标未定义符号,采用所述目标未定义符号,执行所述采用所述未定义符号与所述动态库进行匹配,从所述第一应用程序编程接口中,确定目标应用程序编程接口的步骤;

将所述目标未定义符号从所述定义符号表删除。

4.根据权利要求2或3所述的方法,其特征在于,所述采用所述未定义符号与所述动态库进行匹配,从所述第一应用程序编程接口中,确定目标应用程序编程接口,包括:按照预设查询顺序,针对任一动态库,判断所述任一动态库中是否包含所述未定义符号;

当所述任一动态库包含所述未定义符号时,确定所述任一动态库为目标动态库;

确定所述目标动态库对应的第一应用程序编程接口为目标应用程序编程接口。

5.根据权利要求4所述的方法,其特征在于,所述采用所述未定义符号与所述动态库进行匹配,从所述第一应用程序编程接口中,确定目标应用程序编程接口,还包括:当所述目标动态库的数量为单个时,执行所述确定所述目标动态库对应的第一应用程序编程接口为目标应用程序编程接口的步骤;

当所述目标动态库的数量为多个时,依据所述预设查询顺序确定多个目标动态库中靠前的目标动态库,并采用所述靠前的目标动态库执行所述确定所述目标动态库对应的第一应用程序编程接口为目标应用程序编程接口的步骤。

6.根据权利要求1所述的方法,其特征在于,所述可移植操作系统接口套接字转换函数包括构造函数和套接字函数,所述将所述应用程序编程接口的套接字调用函数转换为所述可移植操作系统接口套接字转换函数,包括:采用所述构造函数和所述套接字函数替换所述应用程序编程接口的套接字调用函数。

7.根据权利要求6所述的方法,其特征在于,所述采用所述构造函数和所述套接字函数替换所述应用程序编程接口的套接字调用函数,包括:确定所述应用程序编程接口的套接字调用函数的调用位置;

在所述调用位置调用所述构造函数和所述套接字函数。

8.根据权利要求7所述的方法,其特征在于,所述在所述调用位置调用所述构造函数和所述套接字函数,包括:在所述调用位置调用所述构造函数,将所述套接字函数对应的地址存入预设函数指针中;

采用所述预设函数指针映射所述用户态网络栈,生成共享内存池;

打开所述用户态网络栈对应的全局套接字控制队列;

调用所述套接字函数,控制所述共享内存池和所述全局套接字控制队列。

9.根据权利要求8所述的方法,其特征在于,所述调用所述套接字函数,控制所述共享内存池和所述全局套接字控制队列,包括:调用所述套接字函数,判断所述套接字函数的调用参数是否进入预设内核态;

当所述套接字函数的调用参数进入所述预设内核态时,调用预设内核态进程将所述调用参数传递至所述预设内核态;

当所述套接字函数的调用参数进入所述用户态网络栈时,采用所述共享内存池和所述全局套接字控制队列将所述调用参数传递至所述用户态网络栈。

10.根据权利要求9所述的方法,其特征在于,所述采用所述共享内存池和所述全局套接字控制队列将所述调用参数传递至所述用户态网络栈,包括:从所述原始用户态中获取文件描述符,所述文件描述符包括调用标识;

从所述共享内存池中获取共享内存块;

将所述调用标识、所述调用参数和预设互斥量写入所述共享内存块,生成共享内存块地址信息;

采用所述全局套接字控制队列将所述共享内存块地址信息发送至所述用户态网络栈,并阻塞所述预设互斥量;所述用户态网络栈用于在接收到所述共享内存块地址信息时,创建反馈套接字队列并解锁所述预设互斥量,所述反馈套接字队列用于向所述原始用户态反馈套接字信息。

11.根据权利要求10所述的方法,其特征在于,所述采用所述共享内存池和所述全局套接字控制队列将所述调用参数传递至所述用户态网络栈,还包括:在所述预设互斥量解锁后,将所述文件描述符进行记录。

12.根据权利要求10所述的方法,其特征在于,所述采用所述共享内存池和所述全局套接字控制队列将所述调用参数传递至所述用户态网络栈,还包括:在所述预设互斥量解锁后,将所述套接字信息写入所述套接字函数的控制信息地址中。

13.根据权利要求10所述的方法,其特征在于,所述采用所述共享内存池和所述全局套接字控制队列将所述调用参数传递至所述用户态网络栈,还包括:在所述预设互斥量解锁后,关闭所述文件描述符。

14.根据权利要求1所述的方法,其特征在于,所述在更新应用程序编程接口后的原始用户态上加载所述可移植操作系统接口套接字转换库,生成更新用户态,包括:启动更新应用程序编程接口后的原始用户态;

在所述更新应用程序编程接口后的原始用户态启动时,进入壳环境;

设置所述壳环境加载所述可移植操作系统接口套接字转换库,生成更新用户态。

15.根据权利要求14所述的方法,其特征在于,所述壳环境包括环境变量,所述设置所述壳环境加载所述可移植操作系统接口套接字转换库,生成更新用户态,包括:在所述环境变量中设置所述可移植操作系统接口套接字转换库的加载等级设置为优先加载级;

依据所述优先加载级,在所述壳环境加载所述可移植操作系统接口套接字转换库,生成更新用户态。

16.根据权利要求1所述的方法,其特征在于,所述响应于用户态网络栈调用指令,调用所述更新用户态与用户态网络栈进行数据交互,包括:响应于用户态网络栈调用指令,采用所述更新用户态将所述用户态网络栈调用指令转发至用户态网络栈。

17.一种用户态接口设置方法,其特征在于,应用于用户态,原始用户态包括多个动态库,所述动态库对应有第一应用程序编程接口;所述方法包括:识别应用程序编程接口,所述应用程序编程接口包括套接字调用函数;所述应用程序编程接口为所述第一应用程序编程接口中,与未定义符号匹配的动态库对应的目标应用程序编程接口;

获取可移植操作系统接口套接字转换库,所述可移植操作系统接口套接字转换库包括可移植操作系统接口套接字转换函数;

将所述套接字调用函数转换为所述可移植操作系统接口套接字转换函数;

加载所述可移植操作系统接口套接字转换库,以实现对所述应用程序编程接口的设置。

18.一种用户态网络栈调用装置,其特征在于,应用于用户态,所述装置包括:第一获取模块,用于获取原始用户态和可移植操作系统接口套接字转换库,所述可移植操作系统接口套接字转换库包括可移植操作系统接口套接字转换函数;所述原始用户态包括多个动态库,所述动态库对应有第一应用程序编程接口;

第一识别模块,用于识别所述原始用户态的应用程序编程接口;所述原始用户态的应用程序编程接口为所述第一应用程序编程接口中,与未定义符号匹配的动态库对应的目标应用程序编程接口;

第一转换模块,用于将所述应用程序编程接口的套接字调用函数转换为所述可移植操作系统接口套接字转换函数,以更新所述应用程序编程接口;

更新模块,用于在更新应用程序编程接口后的原始用户态上加载所述可移植操作系统接口套接字转换库,生成更新用户态;

响应模块,用于响应于用户态网络栈调用指令,调用所述更新用户态与用户态网络栈进行数据交互。

19.一种电子设备,其特征在于,包括处理器、存储器及存储在所述存储器上并能够在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现如权利要求1至16中任一项所述的用户态网络栈调用方法的步骤,或如权利要求17所述的用户态接口设置方法的步骤。

20.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储计算机程序,所述计算机程序被处理器执行时实现如权利要求1至16中任一项所述的用户态网络栈调用方法的步骤,或如权利要求17所述的用户态接口设置方法的步骤。

说明书 :

用户态网络栈调用、用户态接口设置方法和装置

技术领域

[0001] 本发明涉及操作系统技术领域,特别是涉及一种用户态网络栈调用方法、一种用户态接口设置方法、一种用户态网络栈调用装置、一种电子设备和一种存储介质。

背景技术

[0002] DPDK(Data Plane Development Kit,数据平面开发套件)是一个Linux(操作系统)基金会的开源项目,它通过将Linux内核网络栈旁路、直接在用户态收发网卡报文的方式,提升数据平面的性能。DPDK为用户态网络栈已经在业界得到了非常广泛的应用。DPDK的主要定位是驱动和支撑功能,它不带有L3(Layer 3,网络栈中的三层功能)、L4(Layer 4,网络栈中的四层功能)、UDP(User Datagram Protocol,用户数据报协议)、TCP(Transmission Control Protocol,传输控制协议)、socket(套接字)等网络全栈功能。但是在原始的Linux用户态中,其报文是发送至Linux内核态,而并不能发送至用户态网络栈。为了用户态可以调用用户态网络栈,在相关技术中,有两种方式:使用KNI(Kernel Network Interface,内核网络接口)接口和修改APP(application,应用程序)代码即用户态原始代码,使用定制的socket API(套接字应用程序编程接口)替换原来的代码。而第一种方式需要在两套网络栈中同时工作,需要修改可执行文件,增加了开发和运行时的复杂度;第二种方式只适用于以源代码编译安装的APP,不支持不能获得源代码的APP,即要想使用用户态网络栈,需要对APP的源代码进行修改。且在使用用户态网络栈后,由于报文不再经过内核,现存的APP不能使用原有的方式收发报文。可见,现有的调用用户态网络栈方式需要修改APP源代码和可执行文件。

发明内容

[0003] 鉴于上述问题,提出了本发明实施例以便提供一种克服上述问题或者至少部分地解决上述问题的一种用户态网络栈调用方法、一种用户态接口设置方法、一种用户态网络栈调用装置、一种电子设备和一种存储介质。
[0004] 为了解决上述问题,本发明实施例公开了一种用户态网络栈调用方法,应用于用户态,所述方法包括:
[0005] 获取原始用户态和可移植操作系统接口套接字转换库,所述可移植操作系统接口套接字转换库包括可移植操作系统接口套接字转换函数;
[0006] 识别所述原始用户态的应用程序编程接口;
[0007] 将所述应用程序编程接口的套接字调用函数转换为所述可移植操作系统接口套接字转换函数,以更新所述应用程序编程接口;
[0008] 在更新应用程序编程接口后的原始用户态上加载所述可移植操作系统接口套接字转换库,生成更新用户态;
[0009] 响应于用户态网络栈调用指令,调用所述更新用户态与用户态网络栈进行数据交互。
[0010] 可选地,所述原始用户态包括多个动态库,所述动态库对应有第一应用程序编程接口,所述识别所述原始用户态的应用程序编程接口,包括:
[0011] 获取定义符号表,所述定义符号表包括未定义符号;
[0012] 采用所述未定义符号与所述动态库进行匹配,从所述第一应用程序编程接口中,确定目标应用程序编程接口;
[0013] 确定所述目标应用程序编程接口为所述原始用户态的应用程序编程接口。
[0014] 可选地,所述未定义符号为多个;所述识别所述原始用户态的应用程序编程接口,还包括:
[0015] 从所述定义符号表逐一确定目标未定义符号,采用所述目标未定义符号,执行所述采用所述未定义符号与所述动态库进行匹配,从所述第一应用程序编程接口中,确定目标应用程序编程接口的步骤;
[0016] 将所述目标未定义符号从所述定义符号表删除。
[0017] 可选地,所述采用所述未定义符号与所述动态库进行匹配,从所述第一应用程序编程接口中,确定目标应用程序编程接口,包括:
[0018] 按照预设查询顺序,针对任一动态库,判断所述任一动态库中是否包含所述未定义符号;
[0019] 当所述任一动态库包含所述未定义符号时,确定所述任一动态库为目标动态库;
[0020] 确定所述目标动态库对应的第一应用程序编程接口为目标应用程序编程接口。
[0021] 可选地,所述采用所述未定义符号与所述动态库进行匹配,从所述第一应用程序编程接口中,确定目标应用程序编程接口,还包括:
[0022] 当所述目标动态库的数量为单个时,执行所述确定所述目标动态库对应的第一应用程序编程接口为目标应用程序编程接口的步骤;
[0023] 当所述目标动态库的数量为多个时,依据所述预设查询顺序确定多个目标动态库中靠前的目标动态库,并采用所述靠前的目标动态库执行所述确定所述目标动态库对应的第一应用程序编程接口为目标应用程序编程接口的步骤。
[0024] 可选地,所述可移植操作系统接口套接字转换函数包括构造函数和套接字函数,所述将所述应用程序编程接口的套接字调用函数转换为所述可移植操作系统接口套接字转换函数,包括:
[0025] 采用所述构造函数和所述套接字函数替换所述应用程序编程接口的套接字调用函数。
[0026] 可选地,所述采用所述构造函数和所述套接字函数替换所述应用程序编程接口的套接字调用函数,包括:
[0027] 确定所述应用程序编程接口的套接字调用函数的调用位置;
[0028] 在所述调用位置调用所述构造函数和所述套接字函数。
[0029] 可选地,所述在所述调用位置调用所述构造函数和所述套接字函数,包括:
[0030] 在所述调用位置调用所述构造函数,将所述套接字函数对应的地址存入预设函数指针中;
[0031] 采用所述预设函数指针映射所述用户态网络栈,生成共享内存池;
[0032] 打开所述用户态网络栈对应的全局套接字控制队列;
[0033] 调用所述套接字函数,控制所述共享内存池和所述全局套接字控制队列。
[0034] 可选地,所述调用所述套接字函数,控制所述共享内存池和所述全局套接字控制队列,包括:
[0035] 调用所述套接字函数,判断所述套接字函数的调用参数是否进入预设内核态;
[0036] 当所述套接字函数的调用参数进入所述预设内核态时,调用预设内核态进程将所述调用参数传递至所述预设内核态;
[0037] 当所述套接字函数的调用参数进入所述用户态网络栈时,采用所述共享内存池和所述全局套接字控制队列将所述调用参数传递至所述用户态网络栈。
[0038] 可选地,所述采用所述共享内存池和所述全局套接字控制队列将所述调用参数传递至所述用户态网络栈,包括:
[0039] 从所述原始用户态中获取文件描述符,所述文件描述符包括调用标识;
[0040] 从所述共享内存池中获取共享内存块;
[0041] 将所述调用标识、所述调用参数和预设互斥量写入所述共享内存块,生成共享内存块地址信息;
[0042] 采用所述全局套接字控制队列将所述共享内存块地址信息发送至所述用户态网络栈,并阻塞所述预设互斥量;所述用户态网络栈用于在接收到所述共享内存块地址信息时,创建反馈套接字队列并解锁所述预设互斥量,所述反馈套接字队列用于向所述原始用户态反馈套接字信息。
[0043] 可选地,所述采用所述共享内存池和所述全局套接字控制队列将所述调用参数传递至所述用户态网络栈,还包括:
[0044] 在所述预设互斥量解锁后,将所述文件描述符进行记录。
[0045] 可选地,所述采用所述共享内存池和所述全局套接字控制队列将所述调用参数传递至所述用户态网络栈,还包括:
[0046] 在所述预设互斥量解锁后,将所述套接字信息写入所述套接字函数的控制信息地址中。
[0047] 可选地,所述采用所述共享内存池和所述全局套接字控制队列将所述调用参数传递至所述用户态网络栈,还包括:
[0048] 在所述预设互斥量解锁后,关闭所述文件描述符。
[0049] 可选地,所述在更新应用程序编程接口后的原始用户态上加载所述可移植操作系统接口套接字转换库,生成更新用户态,包括:
[0050] 启动更新应用程序编程接口后的原始用户态;
[0051] 在所述更新应用程序编程接口后的原始用户态启动时,进入壳环境;
[0052] 设置所述壳环境加载所述可移植操作系统接口套接字转换库,生成更新用户态。
[0053] 可选地,所述壳环境包括环境变量,所述设置所述壳环境加载所述可移植操作系统接口套接字转换库,生成更新用户态,包括:
[0054] 在所述环境变量中设置所述可移植操作系统接口套接字转换库的加载等级设置为优先加载级;
[0055] 依据所述优先加载级,在所述壳环境加载所述可移植操作系统接口套接字转换库,生成更新用户态。
[0056] 可选地,所述响应于用户态网络栈调用指令,调用所述更新用户态与用户态网络栈进行数据交互,包括:
[0057] 响应于用户态网络栈调用指令,采用所述更新用户态将所述用户态网络栈调用指令转发至用户态网络栈。
[0058] 本发明实施例还公开了一种用户态接口设置方法,应用于用户态,所述方法包括:
[0059] 识别应用程序编程接口,所述应用程序编程接口包括套接字调用函数;
[0060] 获取可移植操作系统接口套接字转换库,所述可移植操作系统接口套接字转换库包括可移植操作系统接口套接字转换函数;
[0061] 将所述套接字调用函数转换为所述可移植操作系统接口套接字转换函数;
[0062] 加载所述可移植操作系统接口套接字转换库,以实现对所述应用程序编程接口的控制。
[0063] 本发明实施例还公开了一种用户态网络栈调用装置,应用于用户态,所述装置包括:
[0064] 第一获取模块,用于获取原始用户态和可移植操作系统接口套接字转换库,所述可移植操作系统接口套接字转换库包括可移植操作系统接口套接字转换函数;
[0065] 第一识别模块,用于识别所述原始用户态的应用程序编程接口;
[0066] 第一转换模块,用于将所述应用程序编程接口的套接字调用函数转换为所述可移植操作系统接口套接字转换函数,以更新所述应用程序编程接口;
[0067] 更新模块,用于在更新应用程序编程接口后的原始用户态上加载所述可移植操作系统接口套接字转换库,生成更新用户态;
[0068] 响应模块,用于响应于用户态网络栈调用指令,调用所述更新用户态与用户态网络栈进行数据交互。
[0069] 本发明实施例还公开了一种电子设备,包括处理器、存储器及存储在所述存储器上并能够在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现如上所述的用户态网络栈调用方法的步骤,或如上所述的用户态接口设置方法的步骤。
[0070] 本发明实施例还公开了一种计算机可读存储介质,所述计算机可读存储介质上存储计算机程序,所述计算机程序被处理器执行时实现如上所述的用户态网络栈调用方法的步骤,或如上所述的用户态接口设置方法的步骤。
[0071] 本发明实施例包括以下优点:
[0072] 本发明实施例通过获取原始用户态和可移植操作系统接口套接字转换库,所述可移植操作系统接口套接字转换库包括可移植操作系统接口套接字转换函数;识别所述原始用户态的应用程序编程接口;将所述应用程序编程接口的套接字调用函数转换为所述可移植操作系统接口套接字转换函数,以更新所述应用程序编程接口;在更新应用程序编程接口后的原始用户态上加载所述可移植操作系统接口套接字转换库,生成更新用户态;响应于用户态网络栈调用指令,调用所述更新用户态与用户态网络栈进行数据交互。通过利用可移植操作系统接口套接字转换库提前加载、可移植操作系统接口套接字转换函数的转接,在不修改原始用户态的可执行文件和源代码的情况下,实现可移植操作系统接口的转接,在原始用户态的基础上,实现对用户态网络栈的调用。

附图说明

[0073] 图1是现有的Linux应用程序框架示意图;
[0074] 图2是本发明的一种用户态网络栈调用方法实施例的步骤流程图;
[0075] 图3是本发明的另一种用户态网络栈调用方法实施例的步骤流程图;
[0076] 图4是本发明的一种套接字函数调用示意图;
[0077] 图5是本发明的另一种套接字函数调用示意图;
[0078] 图6是本发明的又一种套接字函数调用示意图;
[0079] 图7是本发明的一种Linux应用程序框架示意图;
[0080] 图8是本发明的一种用户态接口设置方法实施例的步骤流程图;
[0081] 图9是本发明的一种用户态网络栈调用装置实施例的结构框图;
[0082] 图10是本发明的一种用户态接口设置装置实施例的结构框图;
[0083] 图11是本申请实施例提供的一种电子设备的结构框图;
[0084] 图12是本申请实施例提供的一种存储介质的结构框图。

具体实施方式

[0085] 为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。
[0086] Linux应用程序,是在Linux操作系统上运行的应用程序,在网络方面绝大部分直接或间接的使用POSIX socket(可移植操作系统接口套接字)。Linux应用程序可以称为APP,这些APP的数量非常之多,它们可能是开源的,也可能是闭源;可能是一套独立的软件,也可能是一套大型软件系统中的一个模块。而Linux应用程序的POSIX socket收发报文的架构如图1所示,APP调用应用程序编程接口提供的即可口函数,该系列函数调用系统调用与内核网络栈中的各部分进行交互。
[0087] POSIX socket是一个针对类Unix操作系统的ISO C(C语言编程语言标准)标准,目的是达到C/C++(编程语言)代码级别的软件可移植性——使用POSIX标准接口的代码,可以在任何支持POSIX的操作系统上编译执行。如今的Linux操作系统都支持POSIX标准。POSIX socket是该系列标准中关于网络套接字的接口定义和实现,它声明在主函数前的说明文件中,实现在函数库文件中,网络套接字的函数列表如下:
[0088] int socket (int domain,int type, int protocol);
[0089] int socketpair (int domain, int type,int protocol,int fds[2]);
[0090] int bind (int fd,const_sockaddr_arg addr,socklen_t len);
[0091] int getsockname (int fd,sockaddr_arg addr,socklen_t*restrict len);
[0092] int connect (int fd,const_sockaddr_arg addr,socklen_t len);
[0093] int getpeername (int fd,sockaddr_arg addr,socklen_t *restrict len);
[0094] ssize_t send (int fd,const void *buf,size_t n,int flags);
[0095] ssize_t recv (int fd,void *buf,size_t n,int flags);
[0096] ssize_t sendto (int fd,const void *buf,size_t n,int flags, const_sockaddr_arg addr,socklen_t addr_len);
[0097] ssize_t recvfrom (int fd,void *restrict buf,size_t n,int flags, sockaddr_arg addr,socklen_t *restrict addr_len);
[0098] ssize_t sendmsg (int fd,const struct msghdr *message,int flags);
[0099] int sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags);
[0100] ssize_t recvmsg (int fd,struct msghdr *message,int flags);
[0101] int getsockopt (int fd,int level,int optname,void *restrict optval, socklen_t *restrict optlen);
[0102] int setsockopt (int fd,int level,int optname,int listen (int fd, int n);
[0103] const void *optval,socklen_t optlen);
[0104] int accept (int fd,sockaddr_arg addr,socklen_t *restrict addr_len);
[0105] int shutdown (int fd, int how);
[0106] 用户态通过上述网络套接字与内核态(网络栈)进行连接。
[0107] 为了可以令用户态与用户态网络栈,可以采用设置KNI接口和修改APP代码。其中设置KNI接口的方法是在用户态网络栈和内核网络栈之间建立一对KNI接口,在内核网络栈中配置缺省路由,它的出接口为KNI接口。收包方向:报文到达用户态网络栈的后,它判断是否为去往本地的报文,如果是,那么通过KNI接口发送给内核处理,内核再按照原有的流程送给APP。发包方向:APP发包经过内核原有流程的处理后,通过KNI接口送到用户态网络栈,用户态网络栈重新查询路由,封装以太网头,将报文从用户态驱动发出。修改APP代码的方式是调用代码都替换为专门为用户态网络栈实现的API,直接在用户态网络栈和APP之间做报文收发,内核态不再参与。
[0108] 而采用第一种方式不能支持绑定接口方式收发包:完整的接口列表都实现在用户态网络栈中,Linux内核中只有KNI接口,所以不能支持绑定接口方式收发包。除非在Linux内核中再做一份完整接口列表的镜像,但这增加了整个系统的复杂度。报文经过的路径过长,拷贝次数和CPU上下文切换次数较多。系统中两套网络栈同时工作,需要更改可执行文件,增加了开发和运行时的复杂度。第二种方式修改现存的APP代码,工作量较大。只适用于以源代码编译安装的APP,不支持不能获得源代码的APP。
[0109] 参照图2,示出了本发明的一种用户态网络栈调用方法实施例的步骤流程图,所述用户态网络栈调用方法应用于用户态,具体可以包括如下步骤:
[0110] 步骤201,获取原始用户态和可移植操作系统接口套接字转换库,所述可移植操作系统接口套接字转换库包括可移植操作系统接口套接字转换函数;
[0111] 在本发明实施例中,可以获取原始用户态,即原始APP。以及还可以获取可移植操作系统接口套接字转换库。该可移植操作系统接口套接字转换库为预先根据原始的Linux用户态的应用程序编程接口进行设置的函数库;可移植操作系统接口套接字转换库中包括多个可移植操作系统接口套接字转换函数。
[0112] 步骤202,识别所述原始用户态的应用程序编程接口;
[0113] 对原始用户态,即APP的应用程序编程接口进行识别,即识别出APP的全部API,以对这些API进行设置。
[0114] 步骤203,将所述应用程序编程接口的套接字调用函数转换为所述可移植操作系统接口套接字转换函数,以更新所述应用程序编程接口;
[0115] 识别出原始用户态的应用程序编程接口后,将应用程序编程接口的套接字调用函数转换可移植操作系统接口套接字转换函数,即在原始用户态的应用程序编程接口原始文件的基础上,设置接入原始用户态的应用程序编程接口,使得使用应用程序编程接口时,该应用程序编程接口的报文发送可以经过可移植操作系统接口套接字转换函数的处理,进而改变了该应用程序编程接口报文发送方向,以更新应用程序编程接口。需要说明的是,是对识别出的全部应用程序编程接口都将其套接字调用函数转换为可移植操作系统接口套接字转换函数,使得APP的全部应用程序编程接口都得到更新,使得后续使用APP中的任一个应用程序编程接口都可以实现对用户态网络栈的调用。
[0116] 步骤204,在更新应用程序编程接口后的原始用户态上加载所述可移植操作系统接口套接字转换库,生成更新用户态;
[0117] 在更新应用程序编程接口后,由于原始用户态并不具有各可移植操作系统接口套接字转换函数的说明以及编译操作;为此,可以在更新应用程序编程接口后的原始用户态上加载可移植操作系统接口套接字转换库,生成更新用户态;使得APP可以在运行时,执行对可移植操作系统接口套接字转换库进行编译,在使用可移植操作系统接口套接字转换函数是可以直接调用。即加载可移植操作系统接口套接字转换库的原始用户态即为更新用户态。
[0118] 步骤205,响应于用户态网络栈调用指令,调用所述更新用户态与用户态网络栈进行数据交互。
[0119] 当原始用户态转换为更新用户态后,即原始用户态可以在原本的基础上与用户态网络栈进行连接。为此,在接收到用户态网络栈调用指令时,响应于用户态网络栈调用指令,调用更新用户态与用户态网络栈进行数据交互;实现在不改动原始用户态的源代码和可执行文件的情况下,令更新用户态与用户态网络栈进行数据交互。
[0120] 本发明实施例通过获取原始用户态和可移植操作系统接口套接字转换库,所述可移植操作系统接口套接字转换库包括可移植操作系统接口套接字转换函数;识别所述原始用户态的应用程序编程接口;将所述应用程序编程接口的套接字调用函数转换为所述可移植操作系统接口套接字转换函数,以更新所述应用程序编程接口;在更新应用程序编程接口后的原始用户态上加载所述可移植操作系统接口套接字转换库,生成更新用户态;响应于用户态网络栈调用指令,调用所述更新用户态与用户态网络栈进行数据交互。通过利用可移植操作系统接口套接字转换库提前加载、可移植操作系统接口套接字转换函数的转接,在不修改原始用户态的可执行文件和源代码的情况下,实现可移植操作系统接口的转接,在原始用户态的基础上,实现对用户态网络栈的调用。
[0121] 参照图3,示出了本发明的另一种用户态网络栈调用方法实施例的步骤流程图,所述用户态网络栈调用方法应用于用户态,具体可以包括如下步骤:
[0122] 步骤301,获取原始用户态和可移植操作系统接口套接字转换库,所述可移植操作系统接口套接字转换库包括可移植操作系统接口套接字转换函数;所述可移植操作系统接口套接字转换函数包括构造函数和套接字函数;
[0123] 在本发明实施例中,可以从指定存储地址中获取原始用户态和可移植操作系统接口套接字转换库。其中,可移植操作系统接口套接字转换库包括可移植操作系统接口套接字转换函数;具体地,可移植操作系统接口套接字转换函数可以包括两类,构造函数和套接字函数。构造函数用于说明套接字函数;套接字函数用于设置调用的过程控制步骤。
[0124] 步骤301,识别所述原始用户态的应用程序编程接口;
[0125] 对原始用户态的应用程序编程接口进行识别,即识别出APP的应用程序编程接口。
[0126] 具体地,所述原始用户态包括多个动态库,所述原始用户态包括多个动态库,所述动态库对应有第一应用程序编程接口,所述识别所述原始用户态的应用程序编程接口,包括:
[0127] 子步骤S3011,获取定义符号表,所述定义符号表包括未定义符号;
[0128] 在本发明实施例中,原始用户态包括多个动态库,每一个动态库对应有第一应用程序编程接口,其中第一应用程序编程接口是指动态库对应的应用程序编程接口,其可以是原始用户态中的应用程序编程接口,也可以不是原始用户态中的应用程序编程接口。
[0129] 在原始用户态的编译过程中,编译器维护有一张定义符号表,可以获取该定义符号表,该定义符号表中的符号为未定义符号,即该未定义符号并未与动态库关联。
[0130] 子步骤S3012,采用所述未定义符号与所述动态库进行匹配,从所述第一应用程序编程接口中,确定目标应用程序编程接口;
[0131] 然后将定义符号表中的未定义符号与动态库进行匹配,确定出与未定义符号匹配的动态库,将该动态库对应的第一应用程序编程接口确定为目标应用程序编程接口,即从第一应用程序编程接口中确定出目标应用程序编程接口。
[0132] 进一步地,动态库的数量较多,可以按照预设查询顺序,针对任一动态库,判断所述任一动态库中是否包含所述未定义符号;当所述任一动态库包含所述未定义符号时,确定所述任一动态库为目标动态库;确定所述目标动态库对应的第一应用程序编程接口为目标应用程序编程接口。
[0133] 动态库之间的具有预设查询顺序,该预设查询顺序可以根据实际情况预先设置。在动态库与未定义符号进行匹配时,可以按照该预设查询将未定义符号逐一与各个动态库进行配对,判断各个动态库中是否包含该未定义符号。当动态库中包含该未定义符号时可以确定该动态库为目标动态库。并将该目标动态库对应的第一应用程序编程接口为目标应用程序编程接口。
[0134] 此外,由于目标动态库并未完全单一匹配,可以目标动态库的数量可能为单个也可以能为多个;当所述目标动态库的数量为单个时,执行所述确定所述目标动态库对应的第一应用程序编程接口为目标应用程序编程接口的步骤;当所述目标动态库的数量为多个时,依据所述预设查询顺序确定多个目标动态库中靠前的目标动态库,并采用所述靠前的目标动态库执行所述确定所述目标动态库对应的第一应用程序编程接口为目标应用程序编程接口的步骤。
[0135] 即当目标动态库的数量为单个时,可以直接确定目标动态库对应的第一应用程序编程接口为目标应用程序编程接口。
[0136] 当目标动态库的数量为多个时,按照预设查询顺序确定多个目标动态库中靠前的目标动态库,并采用靠前的目标动态库执行所述确定所述目标动态库对应的第一应用程序编程接口为目标应用程序编程接口的步骤。将首先配对成功的动态库确定为与该未定义符号匹配的目标动态库。
[0137] 子步骤S3013,确定所述目标应用程序编程接口为所述原始用户态的应用程序编程接口。
[0138] 然后再将目标应用程序编程接口确定为原始用户态的应用程序编程接口,用于后续的处理中。
[0139] 此外,由于定义符号表中的未定义符号可以为多个,可以针对每一个未定义符号都确定出对应动态库,进而确定出原始用户态全部应用程序编程接口。可以从定义符号表中的多个未定义符号逐一确定目标未定义符号,并将该目标未定义符号作为匹配对象,与动态库进行匹配,确定出对应的目标应用程序编程接口;然后再将本次匹配的目标未定义符号从定义符号表中删除,确定下一个未定义符号为目标未定义符号,进行匹配直至定义符号表清空,从而将全部目标应用程序编程接口进行识别。
[0140] 以下举例对识别过程进行说明:
[0141] 编译器维护一张“未决”符号表即为定义符号表,按照指定预设查询顺序依次尝试各个动态库的库文件,如果在动态库的库文件中找到了表中未定义符号的定义,即确定动态库包含未定义符号,那么撤销该符号的“未决”状态,将未定义符号从定义符号表,直到决符号表为空,从而确定匹配的动态库对应的目标应用程序编程接口;进而确定目标应用程序编程接口为原始用户态的应用程序编程接口。在这个过程中,如果两个或以上动态库的库文件中定义了同名的符号A,那么确定使用前面动态库的库文件中的符号A的定义,即将前面动态库的第一应用程序编程接口确定为目标应用程序编程接口。
[0142] 步骤303,采用所述构造函数和所述套接字函数替换所述应用程序编程接口的套接字调用函数,以更新所述应用程序编程接口;
[0143] 在本发明实施例中,可以采用构造函数和套接字函数替换原始APP的应用程序编程接口的套接字调用函数,以原始APP的应用程序编程接口进行更新。
[0144] 具体地,所述采用所述构造函数和所述套接字函数替换所述应用程序编程接口的套接字调用函数,包括:
[0145] 子步骤S3031,确定所述应用程序编程接口的套接字调用函数的调用位置;
[0146] 在发明实施例中,可以首先确定应用程序编程接口的套接字调用函数的调用位置,确定应用程序编程接口调用套接字调用函数的时机。
[0147] 子步骤S3031,在所述调用位置调用所述构造函数和所述套接字函数。
[0148] 在套接字调用函数的调用位置上调用构造函数和套接字函数,使得报文经过应用程序编程接口发送或接收时,可以经过构造函数和套接字函数进行处理。
[0149] 具体地,对于在所述调用位置调用所述构造函数和所述套接字函数的步骤可以包括:在所述调用位置调用所述构造函数,将所述套接字函数对应的地址存入预设函数指针中;采用所述预设函数指针映射所述用户态网络栈,生成共享内存池;打开所述用户态网络栈对应的全局套接字控制队列;调用所述套接字函数,控制所述共享内存池和所述全局套接字控制队列。
[0150] 在调用位置调用构造函数,将套接字函数对应的地址存入预设函数指针中;然后再采用预设函数指针映射用户态网络栈,生成用户态与用户态网络栈之间可以共享内容的共享内存池;并且通过预设函数指针打开与用户态网络栈对应的全局套接字控制队列;最后调用套接字函数,控制共享内存池和全局套接字控制队列进行信息传递。
[0151] 举例而言,以wrapper_init(函数名)函数为构造函数,socket、recvmsg和close为套接字函数;构造函数声明为__attribute__((constructor))属性,它将在主函数之前自动执行。构造函数使用dlopen(工具)打开libc.so(函数库名)文件,使用dlsym(工具)读出如下函数的地址存入orig_xxx(函数名)函数指针(即预设函数指针)中。
[0152] Socket ‑> orig_socket
[0153] recvmsg ‑> orig_recvmsg
[0154] close ‑> orig_close
[0155] 采用函数指针映射用户态网络栈创建共享内存池,打开全局socket控制队列(全局套接字控制队列)。调用套接字函数,控制共享内存池和全局套接字控制队列。
[0156] 进一步地,所述调用所述套接字函数,控制所述共享内存池和所述全局套接字控制队列,包括:调用所述套接字函数,判断所述套接字函数的调用参数是否进入预设内核态;当所述套接字函数的调用参数进入所述预设内核态时,调用预设内核态进程将所述调用参数传递至所述预设内核态;当所述套接字函数的调用参数进入所述用户态网络栈时,采用所述共享内存池和所述全局套接字控制队列将所述调用参数传递至所述用户态网络栈。
[0157] 首先,可以调用套接字函数判断该应用程序编程接口的套接字函数的调用参数是否为进入Linux的预设内核态中。对于判断调用参数是否进入Linux的预设内核态的方式可以根据实际套接字函数的类型确定,对此不作限定。
[0158] 当套接字函数的调用参数是进入预设内核态的,则直接调用预设内核态进程将调用参数传递至预设内核态中,通过内核态对调用参数进行处理。
[0159] 当套接字函数的调用参数不是进入预设内核态的,即套接字函数的调用参数是进入用户态网络栈的,此时可以采用共享内存池中的内存块和全局套接字控制队列将调用参数传递至用户态网络栈,由用户态网络栈对调用参数进行处理。
[0160] 具体地,对于采用共享内存池中的内存块和全局套接字控制队列将调用参数传递至用户态网络栈的步骤可以包括:从所述原始用户态中获取文件描述符,所述文件描述符包括调用标识;从所述共享内存池中获取共享内存块;将所述调用标识、所述调用参数和预设互斥量写入所述共享内存块,生成共享内存块地址信息;采用所述全局套接字控制队列将所述共享内存块地址信息发送至所述用户态网络栈,并阻塞所述预设互斥量;所述用户态网络栈用于在接收到所述共享内存块地址信息时,创建反馈套接字队列并解锁所述预设互斥量,所述反馈套接字队列用于向所述原始用户态反馈套接字信息。
[0161] 在实际应用中,可以从原始用户态中获取文件描述符(fd),该文件描述符包括调用标识。同时可以从共享内存池中获取共享内存块,其中,该共享内存块为共享内存池中空闲的共享内存块。然后将调用标识、调用参数和预设互斥量(X)写入共享内存块,生成共享内存块地址信息;其中在预设互斥量锁定时,用户态会阻止其他进程进入共享内存块地址信息。最后采用全局套接字控制队列将所述共享内存块地址信息发送至用户态网络栈,并且阻塞预设互斥量,即对预设互斥量进行锁定,从而令用户态网络栈可以在接收到共享内存块地址信息时,创建反馈套接字队列并解锁预设互斥量。其中,反馈套接字队列用于向原始用户态反馈套接字信息。
[0162] 为了清楚说明利用共享内存块、全局套接字控制队列和互斥量的过程,举出以下三个不同的套接字函数例子进行说明:
[0163] 以socket函数为套接字函数进行说明,可以参照图4。
[0164] socket函数的函数原型为int socket(int domain, int type, int protocol)。
[0165] APP调用该函数后,wrapper(封装)判断地址参数,如果类型为网络,那么去往用户态网络栈,否则调用orig_socket(线程)进入内核态。对于去往用户态网络栈的调用,先调用orig_socket(AF_LOCAL)(线程)从操作系统获取一个fd(文件描述符),然后在共享内存池中获取一个共享内存块,在该内存块中放入调用标识、APP传入的参数(调用参数)、互斥量X(预设互斥量)等,将该共享内存块的地址通过全局套接字控制队列发送到用户态网络栈,最后阻塞在该互斥量上。
[0166] 用户态网络栈收到该消息后,创建反馈套接字队列,将返回值、错误码和专有队列ID等写入到共享内存块中,后续通过反馈套接字队列反馈。最后解锁互斥量X。
[0167] 此外,还可以将在所述预设互斥量解锁后,将所述文件描述符进行记录。继续以该例子说明,即互斥量X解锁唤醒后,wrapper从共享内存块中取得返回值、错误码,打开反馈套接字队列,将fd记录到用户态网络栈fd集合中,最后返回到APP的调用代码。
[0168] 以recvmsg函数为套接字函数进行说明,可以参照图5。
[0169] recvmsg函数的函数原型为ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
[0170] APP调用该函数后,wrapper根据用户态网络栈fd集合判断该fd是否去往用户态网络栈,如果为否,那么调用orig_recvmsg透传给内核态。对于去往用户态网络栈的调用,先在共享内存池中获取一个共享内存块,在该内存块中放入调用标识、APP传入的参数(调用参数)、互斥量X(预设互斥量)等,将该共享内存块的地址通过全局套接字控制队列发送到用户态网络栈,最后阻塞在该互斥量上。用户态网络栈收到该消息后,从队列信息关联到套接字实例,根据情况分别进行处理:
[0171] 1、如果此时全局套接字控制队列中有报文,从队列中取下符合要求的若干个报文,将报文地址写入到共享内存块中,将控制信息写入ctrl_msg(反馈套接字队列)中,最后解锁互斥量X。
[0172] 2、如果此时socket队列中没有报文,并且本次调用是非阻塞的,在共享内存块中写入返回值和错误码,立即解锁互斥量X。
[0173] 3、如果此时全局套接字控制队列中没有报文,并且本次调用是阻塞的,那么将共享内存块中挂在等待队列中,结束当前处理后,等待收到报文后再执行情况1的处理。
[0174] 此外,还可以将在所述预设互斥量解锁后,将所述套接字信息写入所述套接字函数的控制信息地址中。继续以该例子说明,即互斥量X解锁唤醒后,wrapper从共享内存块中取得返回值、错误码,将报文拷贝到APP传入的msghdr的msg_iov地址(共享内存地址)中,将控制信息写入msghdr的msg_control地址(控制信息地址)中,返回到APP的调用代码。
[0175] 以close函数为套接字函数进行说明,可以参照图6。
[0176] close函数的函数原型为int close(int fd);
[0177] 调用该函数后,wrapper判断该fd是否去往用户态网络栈,如果为否,那么调用orig_close(线程)后结束处理。对于去往用户态网络栈的调用,先在共享内存池中获取一个共享内存块,在该共享内存块中放入调用标识、APP传入的参数(调用参数)、互斥量X等,将该内存块的地址通过全局套接字控制队列发送到用户态网络栈,最后阻塞在该互斥量上。
[0178] 用户态网络栈收到该消息后,删除全局套接字控制队列,销毁套接字,将返回值、错误码写入到共享内存块中,最后解锁互斥量X。
[0179] 此外,还可以将在所述预设互斥量解锁后,关闭所述文件描述符。继续以该例子说明,即互斥量X解锁唤醒后,wrapper从共享内存块中取得返回值、错误码,最后调用orig_close,关闭fd,返回到APP的调用代码。
[0180] 步骤304,在更新应用程序编程接口后的原始用户态上加载所述可移植操作系统接口套接字转换库,生成更新用户态;
[0181] 在更新应用程序编程接口后的原始用户态上加载可移植操作系统接口套接字转换库,使得原始用户态可以是直接调用可移植操作系统接口套接字转换库,生成更新用户态。
[0182] 更包含新用户态后的Linux框架可以参照图7,在APP进程中提前部署可移植操作系统接口套接字转换库,实现调用转接功能;其余部分与原始Linux框架相同。使得不需要改变原始用户态的源代码以及可执行文件即可以实现转接功能。
[0183] 具体地,所述在更新应用程序编程接口后的原始用户态上加载所述可移植操作系统接口套接字转换库,生成更新用户态的步骤可以包括:
[0184] 子步骤S3041,启动更新应用程序编程接口后的原始用户态;
[0185] 启动更新应用程序编程接口后的原始用户态,使得进程可以运行。
[0186] 子步骤S3042,在所述更新应用程序编程接口后的原始用户态启动时,进入壳环境;
[0187] 在更新应用程序编程接口后的原始用户态启动时,进入该更新应用程序编程接口后的原始用户态的壳环境(shell),以进行在执行初始化时,对可移植操作系统接口套接字转换库进行加载。
[0188] 子步骤S3043,设置所述壳环境加载所述可移植操作系统接口套接字转换库,生成更新用户态。
[0189] 在壳环境中,对可移植操作系统接口套接字转换库进行加载,生成更新用户态。
[0190] 具体地,所述壳环境包括环境变量,对于在所述设置所述壳环境加载所述可移植操作系统接口套接字转换库,生成更新用户态的步骤可以包括设置所述壳环境加载所述可移植操作系统接口套接字转换库,生成更新用户态环境变量中设置所述可移植操作系统接口套接字转换库的加载等级设置为优先加载级;依据所述优先加载级,在所述壳环境加载所述可移植操作系统接口套接字转换库,生成更新用户态。
[0191] 在实际应用中,可以对可移植操作系统接口套接字转换库的加载等级设置为优先加载级,即在环境变量中设置可移植操作系统接口套接字转换库的加载等级设置为优先加载级;对于可移植操作系统接口套接字转换库为优先加载的等级。然后优先在壳环境加载可移植操作系统接口套接字转换库,生成更新用户态。
[0192] 举例而言,在shell中通过LD_PRELOAD(环境变量)指定先加载libwrapper.so(可移植操作系统接口套接字转换库),shell优先加载libwrapper.so,生成更新用户态,即APP;使得APP程序中socket相关的调用就都会走到libwrapper.so中定义的函数,这样就达到了不修改或重新编译APP代码、不修改APP的二进制可执行文件,而将流程转接到用户态网络栈的目的。
[0193] 步骤305,响应于用户态网络栈调用指令,调用所述更新用户态与用户态网络栈进行数据交互。
[0194] 当原始用户态转换为更新用户态后,即原始用户态可以在原本的基础上与用户态网络栈进行连接。为此,在接收到用户态网络栈调用指令时,响应于用户态网络栈调用指令,调用更新用户态与用户态网络栈进行数据交互;
[0195] 具体地,所述响应于用户态网络栈调用指令,调用所述更新用户态与用户态网络栈进行数据交互的步骤可以包括响应于用户态网络栈调用指令,采用所述更新用户态将所述用户态网络栈调用指令转发至用户态网络栈。
[0196] 在实际应用中,当接收到用户态网络栈调用指令是,响应于该用户态网络栈调用指令,直接采用更新用户态将用户态网络栈调用指令转发至用户态网络栈中,实现用户态与用户态网络栈的交互。
[0197] 本发明实施例通过利用程序动态库提前加载、同名符号先入为主、构造函数 和 动态库读取等技术,不修改或重新编译APP代码、不修改APP的二进制可执行文件,而将流程转接到用户态网络栈的目的利用共享内存、消息队列和互斥量实现用户态和用户态网络栈的交互。
[0198] 参照图8,示出了本发明的一种用户态接口设置方法实施例的步骤流程图,所述用户态接口设置方法应用于用户态,具体可以包括如下步骤:
[0199] 步骤801,识别应用程序编程接口,所述应用程序编程接口包括套接字调用函数;
[0200] 用户态识别自身的应用程序编程接口,以对这些应用程序编程接口进行设置。其中每个应用程序编程接口包括套接字调用函数。
[0201] 步骤802,获取可移植操作系统接口套接字转换库,所述可移植操作系统接口套接字转换库包括可移植操作系统接口套接字转换函数;
[0202] 从预设的函数库存储地址中,获取可移植操作系统接口套接字转换库。该可移植操作系统接口套接字转换库为预先根据原始的Linux用户态的应用程序编程接口进行设置的函数库;可移植操作系统接口套接字转换库中包括多个可移植操作系统接口套接字转换函数。
[0203] 步骤803,将所述套接字调用函数转换为所述可移植操作系统接口套接字转换函数;
[0204] 将应用程序编程接口的套接字调用函数转换可移植操作系统接口套接字转换函数,即在原始用户态的应用程序编程接口原始文件的基础上,设置接入原始用户态的应用程序编程接口,使得使用应用程序编程接口时,该应用程序编程接口的报文发送可以经过可移植操作系统接口套接字转换函数的处理,进而改变了该应用程序编程接口报文发送方向,以更新应用程序编程接口。
[0205] 步骤804,加载所述可移植操作系统接口套接字转换库,以实现对所述应用程序编程接口的设置。
[0206] 加载可移植操作系统接口套接字转换库,生成更新用户态;使得APP可以在运行时,执行对可移植操作系统接口套接字转换库进行编译,在使用可移植操作系统接口套接字转换函数是可以直接调用。
[0207] 在本发明的一可选实施例中,所述原始用户态包括多个动态库,所述动态库对应有第一应用程序编程接口,所述识别所述原始用户态的应用程序编程接口,包括:
[0208] 获取定义符号表,所述定义符号表包括未定义符号;
[0209] 采用所述未定义符号与所述动态库进行匹配,从所述第一应用程序编程接口中,确定目标应用程序编程接口;
[0210] 确定所述目标应用程序编程接口为所述原始用户态的应用程序编程接口。
[0211] 在本发明的一可选实施例中,所述未定义符号为多个;所述识别所述原始用户态的应用程序编程接口,还包括:
[0212] 从所述定义符号表逐一确定目标未定义符号,采用所述目标未定义符号,执行所述采用所述未定义符号与所述动态库进行匹配,从所述第一应用程序编程接口中,确定目标应用程序编程接口的步骤;
[0213] 将所述目标未定义符号从所述定义符号表删除。
[0214] 在本发明的一可选实施例中,所述采用所述未定义符号与所述动态库进行匹配,从所述第一应用程序编程接口中,确定目标应用程序编程接口,包括:
[0215] 按照预设查询顺序,针对任一动态库,判断所述任一动态库中是否包含所述未定义符号;
[0216] 当所述任一动态库包含所述未定义符号时,确定所述任一动态库为目标动态库;
[0217] 确定所述目标动态库对应的第一应用程序编程接口为目标应用程序编程接口。
[0218] 在本发明的一可选实施例中,所述采用所述未定义符号与所述动态库进行匹配,从所述第一应用程序编程接口中,确定目标应用程序编程接口,还包括:
[0219] 当所述目标动态库的数量为单个时,执行所述确定所述目标动态库对应的第一应用程序编程接口为目标应用程序编程接口的步骤;
[0220] 当所述目标动态库的数量为多个时,依据所述预设查询顺序确定多个目标动态库中靠前的目标动态库,并采用所述靠前的目标动态库执行所述确定所述目标动态库对应的第一应用程序编程接口为目标应用程序编程接口的步骤。
[0221] 在本发明的一可选实施例中,所述可移植操作系统接口套接字转换函数包括构造函数和套接字函数,所述将所述应用程序编程接口的套接字调用函数转换为所述可移植操作系统接口套接字转换函数,包括:
[0222] 采用所述构造函数和所述套接字函数替换所述应用程序编程接口的套接字调用函数。
[0223] 在本发明的一可选实施例中,所述采用所述构造函数和所述套接字函数替换所述应用程序编程接口的套接字调用函数,包括:
[0224] 确定所述应用程序编程接口的套接字调用函数的调用位置;
[0225] 在所述调用位置调用所述构造函数和所述套接字函数。
[0226] 在本发明的一可选实施例中,所述在所述调用位置调用所述构造函数和所述套接字函数,包括:
[0227] 在所述调用位置调用所述构造函数,将所述套接字函数对应的地址存入预设函数指针中;
[0228] 采用所述预设函数指针映射所述用户态网络栈,生成共享内存池;
[0229] 打开所述用户态网络栈对应的全局套接字控制队列;
[0230] 调用所述套接字函数,控制所述共享内存池和所述全局套接字控制队列。
[0231] 在本发明的一可选实施例中,所述调用所述套接字函数,控制所述共享内存池和所述全局套接字控制队列,包括:
[0232] 调用所述套接字函数,判断所述套接字函数的调用参数是否进入预设内核态;
[0233] 当所述套接字函数的调用参数进入所述预设内核态时,调用预设内核态进程将所述调用参数传递至所述预设内核态;
[0234] 当所述套接字函数的调用参数进入所述用户态网络栈时,采用所述共享内存池和所述全局套接字控制队列将所述调用参数传递至所述用户态网络栈。
[0235] 在本发明的一可选实施例中,所述采用所述共享内存池和所述全局套接字控制队列将所述调用参数传递至所述用户态网络栈,包括:
[0236] 从所述原始用户态中获取文件描述符,所述文件描述符包括调用标识;
[0237] 从所述共享内存池中获取共享内存块;
[0238] 将所述调用标识、所述调用参数和预设互斥量写入所述共享内存块,生成共享内存块地址信息;
[0239] 采用所述全局套接字控制队列将所述共享内存块地址信息发送至所述用户态网络栈,并阻塞所述预设互斥量;所述用户态网络栈用于在接收到所述共享内存块地址信息时,创建反馈套接字队列并解锁所述预设互斥量,所述反馈套接字队列用于向所述原始用户态反馈套接字信息。
[0240] 在本发明的一可选实施例中,所述采用所述共享内存池和所述全局套接字控制队列将所述调用参数传递至所述用户态网络栈,还包括:
[0241] 在所述预设互斥量解锁后,将所述文件描述符进行记录。
[0242] 在本发明的一可选实施例中,所述采用所述共享内存池和所述全局套接字控制队列将所述调用参数传递至所述用户态网络栈,还包括:
[0243] 在所述预设互斥量解锁后,将所述套接字信息写入所述套接字函数的控制信息地址中。
[0244] 在本发明的一可选实施例中,所述采用所述共享内存池和所述全局套接字控制队列将所述调用参数传递至所述用户态网络栈,还包括:
[0245] 在所述预设互斥量解锁后,关闭所述文件描述符。
[0246] 在本发明的一可选实施例中,所述在更新应用程序编程接口后的原始用户态上加载所述可移植操作系统接口套接字转换库,生成更新用户态,包括:
[0247] 启动更新应用程序编程接口后的原始用户态;
[0248] 在所述更新应用程序编程接口后的原始用户态启动时,进入壳环境;
[0249] 设置所述壳环境加载所述可移植操作系统接口套接字转换库,生成更新用户态。
[0250] 在本发明的一可选实施例中,所述壳环境包括环境变量,所述设置所述壳环境加载所述可移植操作系统接口套接字转换库,生成更新用户态,包括:
[0251] 在所述环境变量中设置所述可移植操作系统接口套接字转换库的加载等级设置为优先加载级;
[0252] 依据所述优先加载级,在所述壳环境加载所述可移植操作系统接口套接字转换库,生成更新用户态。
[0253] 需要说明的是,对于方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明实施例并不受所描述的动作顺序的限制,因为依据本发明实施例,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作并不一定是本发明实施例所必须的。
[0254] 参照图9,示出了本发明的一种用户态网络栈调用装置实施例的结构框图,所述用户态网络栈调用装置应用于用户态,具体可以包括如下模块:
[0255] 第一获取模块901,用于获取原始用户态和可移植操作系统接口套接字转换库,所述可移植操作系统接口套接字转换库包括可移植操作系统接口套接字转换函数;
[0256] 第一识别模块902,用于识别所述原始用户态的应用程序编程接口;
[0257] 第一转换模块903,用于将所述应用程序编程接口的套接字调用函数转换为所述可移植操作系统接口套接字转换函数,以更新所述应用程序编程接口;
[0258] 更新模块904,用于在更新应用程序编程接口后的原始用户态上加载所述可移植操作系统接口套接字转换库,生成更新用户态;
[0259] 响应模块905,用于响应于用户态网络栈调用指令,调用所述更新用户态与用户态网络栈进行数据交互。
[0260] 在本发明的一可选实施例中,所述原始用户态包括多个动态库,所述动态库对应有第一应用程序编程接口,所述第一识别模块902包括:
[0261] 定义符号表获取子模块,用于获取定义符号表,所述定义符号表包括未定义符号;
[0262] 匹配子模块,用于采用所述未定义符号与所述动态库进行匹配,从所述第一应用程序编程接口中,确定目标应用程序编程接口;
[0263] 确定接口单元,用于确定所述目标应用程序编程接口为所述原始用户态的应用程序编程接口。
[0264] 在本发明的一可选实施例中,所述未定义符号为多个;所述第一识别模块902还包括:
[0265] 逐一判断子模块,用于从所述定义符号表逐一确定目标未定义符号,采用所述目标未定义符号,执行所述采用所述未定义符号与所述动态库进行匹配,从所述第一应用程序编程接口中,确定目标应用程序编程接口的步骤;
[0266] 删除子模块,用于将所述目标未定义符号从所述定义符号表删除。
[0267] 在本发明的一可选实施例中,所述匹配子模块包括:
[0268] 判断单元,用于按照预设查询顺序,针对任一动态库,判断所述任一动态库中是否包含所述未定义符号;
[0269] 目标动态库确定单元,当所述任一动态库包含所述未定义符号时,确定所述任一动态库为目标动态库;
[0270] 接口确定单元,用于确定所述目标动态库对应的第一应用程序编程接口为目标应用程序编程接口。
[0271] 在本发明的一可选实施例中,所述匹配子模块还包括:
[0272] 单个匹配单元,用于当所述目标动态库的数量为单个时,执行所述确定所述目标动态库对应的第一应用程序编程接口为目标应用程序编程接口的步骤;
[0273] 多个匹配单元,用于当所述目标动态库的数量为多个时,依据所述预设查询顺序确定多个目标动态库中靠前的目标动态库,并采用所述靠前的目标动态库执行所述确定所述目标动态库对应的第一应用程序编程接口为目标应用程序编程接口的步骤。
[0274] 在本发明的一可选实施例中,所述可移植操作系统接口套接字转换函数包括构造函数和套接字函数,所述第一转换模块903包括:
[0275] 替换子模块,用于采用所述构造函数和所述套接字函数替换所述应用程序编程接口的套接字调用函数。
[0276] 在本发明的一可选实施例中,所述替换子模块包括:
[0277] 位置确定单元,用于确定所述应用程序编程接口的套接字调用函数的调用位置;
[0278] 插入单元,用于在所述调用位置调用所述构造函数和所述套接字函数。
[0279] 在本发明的一可选实施例中,所述插入单元包括:
[0280] 存储子单元,用于在所述调用位置调用所述构造函数,将所述套接字函数对应的地址存入预设函数指针中;
[0281] 映射子单元,用于采用所述预设函数指针映射所述用户态网络栈,生成共享内存池;
[0282] 全局套接字控制队列打开子单元,用于打开所述用户态网络栈对应的全局套接字控制队列;
[0283] 控制子单元,用于调用所述套接字函数,控制所述共享内存池和所述全局套接字控制队列。
[0284] 在本发明的一可选实施例中,所述控制子单元包括:
[0285] 套接字函数调用子单元,用于调用所述套接字函数,判断所述套接字函数的调用参数是否进入预设内核态;
[0286] 第一传递子单元,用于当所述套接字函数的调用参数进入所述预设内核态时,调用预设内核态进程将所述调用参数传递至所述预设内核态;
[0287] 第二传递子单元,用于当所述套接字函数的调用参数进入所述用户态网络栈时,采用所述共享内存池和所述全局套接字控制队列将所述调用参数传递至所述用户态网络栈。
[0288] 在本发明的一可选实施例中,所述第二传递子单元包括:
[0289] 文件描述符获取子单元,用于从所述原始用户态中获取文件描述符,所述文件描述符包括调用标识;
[0290] 共享内存块获取子单元,用于从所述共享内存池中获取共享内存块;
[0291] 写入子单元,用于将所述调用标识、所述调用参数和预设互斥量写入所述共享内存块,生成共享内存块地址信息;
[0292] 发送子单元,用于采用所述全局套接字控制队列将所述共享内存块地址信息发送至所述用户态网络栈,并阻塞所述预设互斥量;所述用户态网络栈用于在接收到所述共享内存块地址信息时,创建反馈套接字队列并解锁所述预设互斥量,所述反馈套接字队列用于向所述原始用户态反馈套接字信息。
[0293] 在本发明的一可选实施例中,所述第二传递子单元还包括:
[0294] 第一解锁子单元,用于在所述预设互斥量解锁后,将所述文件描述符进行记录。
[0295] 在本发明的一可选实施例中,所述第二传递子单元还包括:
[0296] 第二解锁子单元,用于在所述预设互斥量解锁后,将所述套接字信息写入所述套接字函数的控制信息地址中。
[0297] 在本发明的一可选实施例中,所述第二传递子单元还包括:
[0298] 第三解锁子单元,用于在所述预设互斥量解锁后,关闭所述文件描述符。
[0299] 在本发明的一可选实施例中,所述更新模块904包括:
[0300] 启动子模块,用于启动更新应用程序编程接口后的原始用户态;
[0301] 壳环境进入子模块,用于在所述更新应用程序编程接口后的原始用户态启动时,进入壳环境;
[0302] 壳设置子模块,用于设置所述壳环境加载所述可移植操作系统接口套接字转换库,生成更新用户态。
[0303] 在本发明的一可选实施例中,所述壳环境包括环境变量,所述壳设置子模块包括:
[0304] 优先级设置单元,用于在所述环境变量中设置所述可移植操作系统接口套接字转换库的加载等级设置为优先加载级;
[0305] 记载单元,用于依据所述优先加载级,在所述壳环境加载所述可移植操作系统接口套接字转换库,生成更新用户态。
[0306] 在本发明的一可选实施例中,所述响应模块905包括:
[0307] 响应子模块,用于响应于用户态网络栈调用指令,采用所述更新用户态将所述用户态网络栈调用指令转发至用户态网络栈。
[0308] 参照图10,示出了本发明的一种用户态接口设置装置实施例的结构框图,所述用户态接口设置装置应用于用户态,具体可以包括如下模块:
[0309] 第二识别模块1001,用于识别应用程序编程接口,所述应用程序编程接口包括套接字调用函数;
[0310] 第二获取模块1002,用于获取可移植操作系统接口套接字转换库,所述可移植操作系统接口套接字转换库包括可移植操作系统接口套接字转换函数;
[0311] 第二转换模块1003,用于将所述套接字调用函数转换为所述可移植操作系统接口套接字转换函数;
[0312] 加载模块1004,用于加载所述可移植操作系统接口套接字转换库,以实现对所述应用程序编程接口的控制。
[0313] 所述原始用户态包括多个动态库,所述动态库对应有第一应用程序编程接口,所述第一识别模块1001包括:
[0314] 定义符号表获取子模块,用于获取定义符号表,所述定义符号表包括未定义符号;
[0315] 匹配子模块,用于采用所述未定义符号与所述动态库进行匹配,从所述第一应用程序编程接口中,确定目标应用程序编程接口;
[0316] 确定接口单元,用于确定所述目标应用程序编程接口为所述原始用户态的应用程序编程接口。
[0317] 在本发明的一可选实施例中,所述未定义符号为多个;所述第二识别模块1002还包括:
[0318] 逐一判断子模块,用于从所述定义符号表逐一确定目标未定义符号,采用所述目标未定义符号,执行所述采用所述未定义符号与所述动态库进行匹配,从所述第一应用程序编程接口中,确定目标应用程序编程接口的步骤;
[0319] 删除子模块,用于将所述目标未定义符号从所述定义符号表删除。
[0320] 在本发明的一可选实施例中,所述匹配子模块包括:
[0321] 判断单元,用于按照预设查询顺序,针对任一动态库,判断所述任一动态库中是否包含所述未定义符号;
[0322] 目标动态库确定单元,当所述任一动态库包含所述未定义符号时,确定所述任一动态库为目标动态库;
[0323] 接口确定单元,用于确定所述目标动态库对应的第一应用程序编程接口为目标应用程序编程接口。
[0324] 在本发明的一可选实施例中,所述匹配子模块还包括:
[0325] 单个匹配单元,用于当所述目标动态库的数量为单个时,执行所述确定所述目标动态库对应的第一应用程序编程接口为目标应用程序编程接口的步骤;
[0326] 多个匹配单元,用于当所述目标动态库的数量为多个时,依据所述预设查询顺序确定多个目标动态库中靠前的目标动态库,并采用所述靠前的目标动态库执行所述确定所述目标动态库对应的第一应用程序编程接口为目标应用程序编程接口的步骤。
[0327] 所述可移植操作系统接口套接字转换函数包括构造函数和套接字函数,所述第二转换模块1003包括:
[0328] 替换子模块,用于采用所述构造函数和所述套接字函数替换所述应用程序编程接口的套接字调用函数。
[0329] 在本发明的一可选实施例中,所述替换子模块包括:
[0330] 位置确定单元,用于确定所述应用程序编程接口的套接字调用函数的调用位置;
[0331] 插入单元,用于在所述调用位置调用所述构造函数和所述套接字函数。
[0332] 在本发明的一可选实施例中,所述插入单元包括:
[0333] 存储子单元,用于在所述调用位置调用所述构造函数,将所述套接字函数对应的地址存入预设函数指针中;
[0334] 映射子单元,用于采用所述预设函数指针映射所述用户态网络栈,生成共享内存池;
[0335] 全局套接字控制队列打开子单元,用于打开所述用户态网络栈对应的全局套接字控制队列;
[0336] 控制子单元,用于调用所述套接字函数,控制所述共享内存池和所述全局套接字控制队列。
[0337] 在本发明的一可选实施例中,所述控制子单元包括:
[0338] 套接字函数调用子单元,用于调用所述套接字函数,判断所述套接字函数的调用参数是否进入预设内核态;
[0339] 第一传递子单元,用于当所述套接字函数的调用参数进入所述预设内核态时,调用预设内核态进程将所述调用参数传递至所述预设内核态;
[0340] 第二传递子单元,用于当所述套接字函数的调用参数进入所述用户态网络栈时,采用所述共享内存池和所述全局套接字控制队列将所述调用参数传递至所述用户态网络栈。
[0341] 在本发明的一可选实施例中,所述第二传递子单元包括:
[0342] 文件描述符获取子单元,用于从所述原始用户态中获取文件描述符,所述文件描述符包括调用标识;
[0343] 共享内存块获取子单元,用于从所述共享内存池中获取共享内存块;
[0344] 写入子单元,用于将所述调用标识、所述调用参数和预设互斥量写入所述共享内存块,生成共享内存块地址信息;
[0345] 发送子单元,用于采用所述全局套接字控制队列将所述共享内存块地址信息发送至所述用户态网络栈,并阻塞所述预设互斥量;所述用户态网络栈用于在接收到所述共享内存块地址信息时,创建反馈套接字队列并解锁所述预设互斥量,所述反馈套接字队列用于向所述原始用户态反馈套接字信息。
[0346] 在本发明的一可选实施例中,所述第二传递子单元还包括:
[0347] 第一解锁子单元,用于在所述预设互斥量解锁后,将所述文件描述符进行记录。
[0348] 在本发明的一可选实施例中,所述第二传递子单元还包括:
[0349] 第二解锁子单元,用于在所述预设互斥量解锁后,将所述套接字信息写入所述套接字函数的控制信息地址中。
[0350] 在本发明的一可选实施例中,所述第二传递子单元还包括:
[0351] 第三解锁子单元,用于在所述预设互斥量解锁后,关闭所述文件描述符。
[0352] 所述加载模块1004包括:
[0353] 启动子模块,用于启动更新应用程序编程接口后的原始用户态;
[0354] 壳环境进入子模块,用于在所述更新应用程序编程接口后的原始用户态启动时,进入壳环境;
[0355] 壳设置子模块,用于设置所述壳环境加载所述可移植操作系统接口套接字转换库,生成更新用户态。
[0356] 在本发明的一可选实施例中,所述壳环境包括环境变量,所述壳设置子模块包括:
[0357] 优先级设置单元,用于在所述环境变量中设置所述可移植操作系统接口套接字转换库的加载等级设置为优先加载级;
[0358] 记载单元,用于依据所述优先加载级,在所述壳环境加载所述可移植操作系统接口套接字转换库,生成更新用户态。
[0359] 对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
[0360] 参照图11,本申请实施例还提供了一种电子设备,包括:
[0361] 处理器1101和存储介质1102,所述存储介质1102存储有所述处理器1101可执行的计算机程序,当电子设备运行时,所述处理器1101执行所述计算机程序,以执行如本发明实施例任一项所述的用户态网络栈调用方法,或用户态接口设置方法。具体实现方式和技术效果与方法实施例部分类似,这里不再赘述。
[0362] 存储器可以包括随机存取存储器(Random Access Memory,简称RAM),也可以包括非易失性存储器(non‑volatile memory),例如至少一个磁盘存储器。可选的,存储器还可以是至少一个位于远离前述处理器的存储装置。
[0363] 上述的处理器可以是通用处理器,包括中央处理器(Central Processing Unit,简称CPU)、网络处理器(Network Processor,简称NP)等;还可以是数字信号处理器(Digital Signal Processing,简称DSP)、专用集成电路(Application Specific Integrated Circuit,简称ASIC)、现场可编程门阵列(Field-Programmable Gate Array,简称FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。
[0364] 参照图12,本申请实施例还提供了一种计算机可读存储介质1201,所述存储介质1201上存储有计算机程序,所述计算机程序被处理器运行时执行如本发明实施例任一项所述的用户态网络栈调用方法,或用户态接口设置方法。具体实现方式和技术效果与方法实施例部分类似,这里不再赘述。
[0365] 本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
[0366] 本领域内的技术人员应明白,本发明实施例的实施例可提供为方法、装置、或计算机程序产品。因此,本发明实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD‑ROM、光学存储器等)上实施的计算机程序产品的形式。
[0367] 本发明实施例是参照根据本发明实施例的方法、终端设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理终端设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理终端设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
[0368] 这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理终端设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
[0369] 这些计算机程序指令也可装载到计算机或其他可编程数据处理终端设备上,使得在计算机或其他可编程终端设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程终端设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
[0370] 尽管已描述了本发明实施例的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明实施例范围的所有变更和修改。
[0371] 最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。
[0372] 以上对本发明所提供的一种用户态网络栈调用方法、一种用户态接口设置方法、一种用户态网络栈调用装置、一种电子设备和一种存储介质,进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。