我正在尝试修改iperf以支持另一种协议 (UDT)。UDT API 是这样编写的,它反映了标准的 BSD 调用:
socket(...);
bind(...);
listen(...);
然后我需要做的是有条件地与 UDT 库链接,以便 iperf 中的这些调用将使用 UDT 代码而不是 TCP 堆栈的套接字接口。这可以做到吗?我总是可以只加载库并使用 UDT:: 命名空间拥有另一个条件路径,但会有 1)与 TCP 路径有很多重复,2)有很多可能不需要的更改。如果我不清楚,请告诉我,任何有关如何实现此动态链接的建议都将不胜感激。
编辑:
使用下面提到的 dlopen() 系列,我可以有以下程序流程:
解析 cmd 行参数 -> 如果请求 UDT,则加载库 libudt -> 获取并存储所有 UDT BSD 函数的句柄(绑定、监听等)
此时,我的所有 UDT 函数都存储了函数指针。假设我将它们全部存储在一个名为 udt_calls 的结构中。现在,我对现有代码有一个问题,它只是进行如下调用:
bind(...)
而不是:
udt_calls->bind(...)
有没有一种干净的方法可以用我现在加载的函数指针在我的 udt_calls 结构中全局覆盖整个程序中的任何 BSD 调用?