【问题标题】:Converting an AF_INET socket to use AF_UNIX via LD_PRELOAD通过 LD_PRELOAD 将 AF_INET 套接字转换为使用 AF_UNIX
【发布时间】:2013-06-03 17:59:50
【问题描述】:

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

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

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

感谢您的帮助。

杰森

【问题讨论】:

  • 尽管我写了一个答案,但我发现这个问题不适合网站的格式。我几乎投票以“不具建设性”来关闭它。问题是“这可行吗?”的答案。或多或少只是“是”。将来,我建议问一个更直接的问题,例如关于实现此包装器的特定方面的问题,但您遇到了麻烦。
  • 谢谢,塞拉达。我现在修改了这个问题,使其更加清晰。
  • socket_wrapper 库提供了这个功能。

标签: c sockets ld-preload


【解决方案1】:

你的想法听起来完全可行。事实上,我认为这听起来是实现你想要的最好的方式。不过,我预计开销/性能不会有很大不同,甚至是明显不同。

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

【讨论】:

  • 所以...在 socket() 中我会跟踪创建了哪些 FD。在 bind() 中,如果我找到的 sockfd 与此匹配,并且此套接字的 IP/端口是我要转换的那个,然后我用正确的路径打开一个 AF_UNIX 套接字,并绑定它,然后将传入的 sockaddr* 转换为 bind()?然后在 accept() 中会发生什么?
  • 哦,我现在看到你想推迟决定是否将系统调用重写为bind()。那你就不需要拦截socket()我猜了。您可以在bind() 中诱饵和切换套接字。无论如何,在accept() 中,您需要将 sockaddr 参数从sockaddr_un 转换回sockaddr_insockaddr_in6
  • 是的,Celada---我需要推迟这个,因为对于大多数其他 bind() 请求,它们只是未经我修改就通过了,因此在特定情况下会发生争执。你会碰巧有一个如何实现这一目标的好例子吗?我承认在转换过程中有些挣扎。
  • 您的意思是将 sockaddr 从 in 转换为 un 并返回?您只需要使用我在回答中建议的临时映射...或者如果您知道您只处理一个侦听套接字,只需为sockaddr_un 地址使用固定字符串并返回一个固定的虚拟sockaddr_in 地址来自accept()
  • 好的...所以我有这个正确的机制...在 bind() 中,我确定了我希望转换的套接字的 sockfd,同时打开一个AF_UNIX 并绑定到它。然后在accept() 中,如果我接受() 的sockfd 是应该是AF_UNIX 的sockfd,我会从我在bind() 中打开的AF_UNIX 套接字中为其'struct sockaddr *' 分配一个sockaddr_in?跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
  • 2013-09-13
  • 2014-05-15
  • 1970-01-01
  • 2015-06-03
相关资源
最近更新 更多