我有一个处理数据包的用户空间C++应用程序(可能是一个库)。我有第二个应用程序(用C编写),它通过调用::recv()获得字节。1.是否可以在不更改调用::recv()的代码的情况下,将处理后的数据包字节“传递”给第二个应用程序?1.我还想将::send()的调用“转移”到第一个应用程序,我想我可以使用动态库和LD_PRELOAD来实现这一点,但是可以通过静态技术来实现吗?
::recv()
::send()
LD_PRELOAD
nhhxz33t1#
据我所知,你希望能够在一个特殊的模式下运行任何未经修改的程序,在这种模式下,所有的套接字都连接到你自己的程序,这个程序模拟网络,而不是实际的网络。这有助于开发一些定制的网络代码。也许最简单的方法是使用LD_PRELOAD --一种经常用于覆盖标准库函数的机制。您可以使用recv和send之类的函数名以及需要覆盖的任何其他名称创建共享库,然后设置环境变量LD_PRELOAD=my_socket_library.so(将其更改为实际的文件名)。加载程序将链接recv和send调用到您的函数,而不是libc中的函数,因为LD_PRELOAD库具有优先级。如果你想调用原始函数,你可以使用dlsym和RTLD_NEXT来获得指向它们的指针(超出作用域;Google获取更多信息)。或者,你可能更喜欢把它做成一个真实的的套接字,连接到你的网络程序上,你的网络程序会监听某个端口(使用内核网络系统),并且您的共享库将覆盖connect函数,以便它连接到网络程序正在侦听的矶钓,然后告诉网络程序地址。除非程序使用getpeername查看它连接的地址(大多数程序不知道,因为它们已经知道它们连接到哪个地址)它不会知道区别,但由于它是一个真实的的套接字,无论程序做了什么套接字的东西,它都会工作。
recv
send
LD_PRELOAD=my_socket_library.so
dlsym
RTLD_NEXT
connect
getpeername
1条答案
按热度按时间nhhxz33t1#
据我所知,你希望能够在一个特殊的模式下运行任何未经修改的程序,在这种模式下,所有的套接字都连接到你自己的程序,这个程序模拟网络,而不是实际的网络。这有助于开发一些定制的网络代码。
也许最简单的方法是使用LD_PRELOAD --一种经常用于覆盖标准库函数的机制。
您可以使用
recv
和send
之类的函数名以及需要覆盖的任何其他名称创建共享库,然后设置环境变量LD_PRELOAD=my_socket_library.so
(将其更改为实际的文件名)。加载程序将链接recv
和send
调用到您的函数,而不是libc中的函数,因为LD_PRELOAD库具有优先级。如果你想调用原始函数,你可以使用dlsym
和RTLD_NEXT
来获得指向它们的指针(超出作用域;Google获取更多信息)。或者,你可能更喜欢把它做成一个真实的的套接字,连接到你的网络程序上,你的网络程序会监听某个端口(使用内核网络系统),并且您的共享库将覆盖
connect
函数,以便它连接到网络程序正在侦听的矶钓,然后告诉网络程序地址。除非程序使用getpeername
查看它连接的地址(大多数程序不知道,因为它们已经知道它们连接到哪个地址)它不会知道区别,但由于它是一个真实的的套接字,无论程序做了什么套接字的东西,它都会工作。