c++ 将字节传递给调用::recv()的另一个应用程序

nwnhqdif  于 2023-02-26  发布在  其他
关注(0)|答案(1)|浏览(118)

我有一个处理数据包的用户空间C++应用程序(可能是一个库)。
我有第二个应用程序(用C编写),它通过调用::recv()获得字节。
1.是否可以在不更改调用::recv()的代码的情况下,将处理后的数据包字节“传递”给第二个应用程序?
1.我还想将::send()的调用“转移”到第一个应用程序,我想我可以使用动态库和LD_PRELOAD来实现这一点,但是可以通过静态技术来实现吗?

nhhxz33t

nhhxz33t1#

据我所知,你希望能够在一个特殊的模式下运行任何未经修改的程序,在这种模式下,所有的套接字都连接到你自己的程序,这个程序模拟网络,而不是实际的网络。这有助于开发一些定制的网络代码。
也许最简单的方法是使用LD_PRELOAD --一种经常用于覆盖标准库函数的机制。
您可以使用recvsend之类的函数名以及需要覆盖的任何其他名称创建共享库,然后设置环境变量LD_PRELOAD=my_socket_library.so(将其更改为实际的文件名)。加载程序将链接recvsend调用到您的函数,而不是libc中的函数,因为LD_PRELOAD库具有优先级。如果你想调用原始函数,你可以使用dlsymRTLD_NEXT来获得指向它们的指针(超出作用域;Google获取更多信息)。
或者,你可能更喜欢把它做成一个真实的的套接字,连接到你的网络程序上,你的网络程序会监听某个端口(使用内核网络系统),并且您的共享库将覆盖connect函数,以便它连接到网络程序正在侦听的矶钓,然后告诉网络程序地址。除非程序使用getpeername查看它连接的地址(大多数程序不知道,因为它们已经知道它们连接到哪个地址)它不会知道区别,但由于它是一个真实的的套接字,无论程序做了什么套接字的东西,它都会工作。

相关问题