wanderanimrod

wanderanimrod

Hello hivemind,

Is there way to find the file descriptor associated with a long-lived tcp connection in elixir / erlang? I am using the HTTPoison library (and hence :hackney) for http calls. I need to send the file descriptor to a server. The client-server interaction goes like this:

  1. Client opens a long-lived http connection to server (using HTTP GET with Keep-alive header)
  2. The server accepts the connection and waits for a payload from the client
  3. The client finds the file descriptor associated with the connection (which is a path on the client’s local file system in /proc/${PID}/fd)
  4. The client sends the file descriptor to the server.

I couldn’t find any API on HTTPoison or hackney to get connection file descriptors, so I attempted the following:

# start a custom hackney pool with long connection timeout to ensure long-lived connections
:ok = :hackney_pool.start_pool(:my_pool, [timeout: 60000, max_connections: 1])

# Find the PID of `:my_pool`
my_pool_pid =  :hackney_pool.find_pool(:my_pool)

# make http request.
{:ok, _} = HTTPoison.get "http://localhost:8000", [], hackney: [pool: :my_pool]

# List all open ports 
open_tcp_port = 
  :erlang.ports()
   |> Enum.map(fn p -> :erlang.port_info(p, :connected) end)
   |> Enum.find(fn {:connected, p} -> p == my_pool_pid end)
#[
#  name: 'tcp_inet',
#  links: [#PID<0.285.0>],
# id: 288,
#  connected: #PID<0.285.0>,
#  input: 0,
#  output: 68,
#  os_pid: :undefined
#]

# Ask erlang to print out a list of open sockets. Notice that the only open socket has Port=288,
# which is the `id` of `open_tcp_port`.
:inet.i
#Port Module   Recv Sent Owner     Local Address   Foreign Address State        Type
#288  inet_tcp 147  68   <0.285.0> localhost:63617 localhost:irdmi CONNECTED(O) STREAM
#:ok

Question
How can I get from the open_tcp_port and / or the socket information from inet.i to a file descriptor path?

Thanks in advance.

Showing Posts 1 to 3

dimitarvp

dimitarvp

I searched the hackney GitHub repo for fd but I don’t think the results are helpful.

wanderanimrod

wanderanimrod OP

Thanks @dimitarvp. I did the same search but I couldn’t find anything on file descriptors in Hackney or HTTPoison. The best I could get was ports. That’s why I tried getting to the descriptors from ports like I explained in the post.

wanderanimrod

wanderanimrod OP

I found a solution.

# start a custom hackney pool with long connection timeout to ensure long-lived connections
:ok = :hackney_pool.start_pool(:my_pool, [timeout: 60000, max_connections: 1])

# Find the PID of `:my_pool`
my_pool_pid =  :hackney_pool.find_pool(:my_pool)

# make an http request. This should create a long-lived connection if the server supports it
{:ok, _} = HTTPoison.get "http://localhost:8000", [], hackney: [pool: :my_pool]

# Find the open port associated with the connection
connection_port =
  :erlang.ports()
  |> Enum.find(
    fn port ->
       port_info = :erlang.port_info(port)
       port_info[:connected] == my_pool_pid
     end
    )
{:ok, file_descriptor} = :prim_inet.getfd(connection_port)
— All posts loaded —

Where Next? Top

Trending in Questions Top

RSP87
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
kpanic
Hi everyone, I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding. I sta...
New
nseaSeb
Hello, I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
asweet-confluent
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
apz
I’m new to elixir and just tried to install the elixirLS extension for VScode(ium) and it is throwing some errors that I would like help ...
New

Other Trending Topics Top

GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
marciok
Hi there! We created Gust: A task orchestrator inspired by Airflow. For those who have never heard about Aiflow, it’s a Python-based wor...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews