Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 通过LD_预加载将AF_INET套接字转换为使用AF_UNIX_C_Sockets_Ld Preload - Fatal编程技术网

C 通过LD_预加载将AF_INET套接字转换为使用AF_UNIX

C 通过LD_预加载将AF_INET套接字转换为使用AF_UNIX,c,sockets,ld-preload,C,Sockets,Ld Preload,我想知道将AF_INET套接字转换为使用AF_UNIX有多可行。原因是我有一个程序可以打开一个TCP套接字,但是我们不能改变它。因此,为了减少开销,我们希望将此套接字绑定为使用AF_UNIX套接字进行通信 到目前为止,我的想法是使用LD_PRELOAD来实现这一点——截取bind()和accept(),但目前还不清楚如何最好地实现这一点,或者这是否是最好的方法 到目前为止,bind in bind(),如果套接字类型是AF_INET,其IP/端口是我希望转换为AF_UNIX的套接字,那么我在这里

我想知道将AF_INET套接字转换为使用AF_UNIX有多可行。原因是我有一个程序可以打开一个TCP套接字,但是我们不能改变它。因此,为了减少开销,我们希望将此套接字绑定为使用AF_UNIX套接字进行通信

到目前为止,我的想法是使用LD_PRELOAD来实现这一点——截取bind()和accept(),但目前还不清楚如何最好地实现这一点,或者这是否是最好的方法

到目前为止,bind in bind(),如果套接字类型是AF_INET,其IP/端口是我希望转换为AF_UNIX的套接字,那么我在这里关闭sockd,然后打开AF_UNIX套接字。然而,这似乎在accept()中进一步引起了问题——因为我不确定当accept()中的sockfd与我希望告诉使用AF_UNIX套接字的sockfd匹配时该怎么办

非常感谢您的帮助


杰森你的想法听起来完全可行。事实上,我认为这听起来是实现你想要的最好的方式。不过,我不会期望开销/性能有很大的不同,甚至可以测量到的不同


当然,除了
bind()
accept()
之外,您还必须拦截
socket()
。例如,在
bind()
中,您可以将请求的TCP端口转换为固定路径名
/tmp/converted_socket.
或类似的内容。

您的想法听起来完全可行。事实上,我认为这听起来是实现你想要的最好的方式。不过,我不会期望开销/性能有很大的不同,甚至可以测量到的不同


当然,除了
bind()
accept()
之外,您还必须拦截
socket()
。例如,在
bind()
中,您可以将请求的TCP端口转换为固定路径名
/tmp/converted_socket.
或类似的内容。

尽管我写了一个答案,但我发现这个问题不适合该站点的格式。我几乎以“不具建设性”为由投票决定关闭它。问题是,“这是否可行?”的答案或多或少只是“是”。在将来,我建议问一个更直接的问题,例如关于实现这个包装器的一个具体方面的问题,您遇到了麻烦。谢谢,Celada。我现在已经修改了这个问题,让它更清晰一些。图书馆提供了这个功能。尽管我写了一个答案,但我发现这个问题不适合网站的格式。我几乎以“不具建设性”为由投票决定关闭它。问题是,“这是否可行?”的答案或多或少只是“是”。在将来,我建议问一个更直接的问题,例如关于实现这个包装器的一个具体方面的问题,您遇到了麻烦。谢谢,Celada。我现在把问题修改得更清楚了。这个库提供了这个功能。所以。。。在socket()中,我会跟踪创建了哪些FD。在bind()中,如果我找到的sockfd与此匹配,并且此套接字的IP/端口是我要转换的,那么我会打开一个具有正确路径的AF_UNIX套接字,并将其绑定,然后将传入的sockaddr*转换为bind()?那么在accept()中会发生什么呢?哦,我现在看到您想要延迟决定是否将系统调用重写为
bind()
。那么您就不需要截取
socket()
我猜。您可以在
bind()
内诱饵和切换套接字。无论如何,在
accept()
中,您需要将sockaddr参数从
sockaddr\u un
转换回
sockaddr\u in
sockaddr\u in 6
中。是的,Celada--我需要延迟此操作,因为对于绑定()的大多数其他请求,它们只是在未经我修改的情况下通过,因此在特定情况下会引起争论。你有没有一个很好的例子来说明如何做到这一点?我承认在转换过程中遇到了一些困难。你是说将sockaddr从
in
转换为
un
再转换回来?你只需要使用一个特别的映射,就像我在回答中建议的那样。。。或者,如果您知道您只处理一个侦听套接字,只需为
sockaddr\u un
地址使用一个固定字符串,并在
accept()
地址中返回一个虚拟的固定
sockaddr\u。。。这样我就有了这个正确的机制。。。在bind()中,我标识了要转换的套接字的sockfd,同时打开一个AF_UNIX并绑定到它。然后在accept()中,如果我已接受的sockfd()ed应该是AF_UNIX的sockfd,那么我从我在bind()中打开的AF_UNIX套接字中为其“struct sockaddr*”分配一个sockaddr_,因此。。。在socket()中,我会跟踪创建了哪些FD。在bind()中,如果我找到的sockfd与此匹配,并且此套接字的IP/端口是我要转换的,那么我会打开一个具有正确路径的AF_UNIX套接字,并将其绑定,然后将传入的sockaddr*转换为bind()?那么在accept()中会发生什么呢?哦,我现在看到您想要延迟决定是否将系统调用重写为
bind()
。那么您就不需要截取
socket()
我猜。您可以在
bind()
内诱饵和切换套接字。无论如何,在
accept()
中,您需要将sockaddr参数从
sockaddr\u un
转换回
sockaddr\u in
sockaddr\u in 6
中。是的,Celada--我需要延迟此操作,因为对于绑定()的大多数其他请求,它们只是在未经我修改的情况下通过,因此在特定情况下会引起争论。你有没有一个很好的例子来说明如何做到这一点?我承认在转换过程中遇到了一些困难。你是说将sockaddr从
in
转换为
un
再转换回来?你只需要使用一个特别的映射,就像我在回答中建议的那样。。。或者如果你知道你只和一个人打过交道