kototama

kototama

How to pass SO_RCVTIMEO option to a socket?

Is it possible to pass the SO_RCVTIMEO socket option (man 7 socket ) to an Erlang/Elixir socket with inet:setopts/2 and how?

Bonus question: how do you do it with ranch?

Help would be highly appreciated!

Marked As Solved

cmkarlsson

cmkarlsson

First. I know nothing about this. Have a read below and feel free to completely ignore everything :smiley:

Looking at the manual page of inet:setopts/2 you can use the raw option to set options not explicitly supported by setopts

They have an example setting TCP_LINGER2 to 30 using this:

inet:setopts(Sock,[{raw,6,8,<<30:32/native>>}])
or in elixir
:inet.setopts(sock, [{:raw, 6, 8, <<30::32-native>>}])

Unfortunately I don’t know the protocol level or option number for SO_RCVTIMEO (it might be platform dependent?) and I don’t know how to format a timeval struct outside of C.

My best guess would be something like:

$ cat tempo.c
#include <sys/socket.h>
#include <stdio.h>

int main() {
    printf("SO_RCVTIMEO: %d\n", SO_RCVTIMEO);
    printf("SOL_SOCKET: %d\n", SOL_SOCKET); 
    printf("sizeof(time_t): %lu\n", sizeof(time_t));
    printf("sizeof(timeval): %lu\n", sizeof(struct timeval));
}
$ gcc tempo.c
$ ./a.out
SO_RCVTIMEO: 20
SOL_SOCKET: 1
sizeof(time_t): 8
sizeof(timeval): 16

And then use the above values to try to set the option.

:inet.setopts(socket, [{:raw, 1, 20, <<30::64-native-unsigned, 0::64-native-unsigned>>}]).

This might be very dangerous. Are 1 and 20 and the timeval sizes and format platform and machine architecture dependent? Is the option even set? I don’t know how to find out.

As for ranch you should be able to use Transport:setopts/2 which means either ranch_tcp or ranch_ssl depending on transport used. There might also be an option to pass the raw option in when you start a listener through the options.

Also Liked

2Sjch8AT

2Sjch8AT

In the documentation page socket usage we can read:

rcvtimeo timeval() yes yes This option is not normally supported (see why below). OTP has to be explicitly built with the --enable-esock-rcvsndtime configure option for this to be available. Since our implementation is nonblocking, its unknown if and how this option works, or even if it may cause malfunctions. Therefor, we do not recommend setting this option. Instead, use the Timeout argument to, for instance, the recv/3 function.

Where Next?

Popular in Questions Top

sergio
In Ruby, I can go: User.find_by(email: "foobar@email.com").update(email: "hello@email.com") How can I do something similar in Elixir? ...
New
Tee
can someone please explain to me how Enum.reduce works with maps
New
_russellb
I want to try my hand at web scraping. What tools/libraries do I need to use. I’m hoping to turn this into something professional so don’...
New
dokuzbir
Hello, I am trying to convert my lists to string without losing brackets.For start i have 3 map. They look like these buyer = %{ id: ...
New
myronmarston
The Elixir Typespec docs show the following syntax for keyword lists in typespecs: # ... | [key: type] # keyword lis...
New
chensan
I have a User schema with a :from_id field set to type :string: defmodule TweetBot.Repo.Migrations.CreateUsers do use Ecto.Migration ...
New
rms.mrcs
Hi, I need to transform a list of numbers into a map where the keys are the indexes and the values are the original values of the list....
New
baxterw3b
Hi guys, i’m new in the Elixir world, and i have to say, that i love it! i’m having some problem to understand anonymous functions with ...
New
hpopp
To simplify some tasks at work, I wrote and published this package yesterday. It’s a simple macro that enables Access behaviour on struct...
New
Mooodi
Given a string, how can I get access to its character by index? Enum.at("my_string", 2) doesn't work. Or rather, not char, but a substr...
New

Other popular topics Top

shahryarjb
Hello, I get Persian date from my client and convert it to normal calendar like this: def jalali_string_to_miladi_english_number(persi...
New
pmjoe
I have a relationship of love and hate with Elixir. Lots of things are just absolutely right, but there are some things that are kind of ...
New
malloryerik
Hi, this is for people who, like me, have had some friction using .html.heex templates in VSCode. The solution seems to be, in a hyphena...
New
nsuchy
Hi. I’ve noticed that Windows Powershell has it’s own IEX command and you cannot access Elixir’s IEX due to the conflict. This isn’t a cr...
New
hariharasudhan94
I would like to know what is the best IDE for elixir development?
New
vac
Hi, I'm quite new in Elixir and I'm trying to format a string to a PEM format. I have the certificate value like MIIDBTCCAe2...... and ...
New
myronmarston
The Elixir Typespec docs show the following syntax for keyword lists in typespecs: # ... | [key: type] # keyword lis...
New
mgjohns61585
Could someone help me? I'm making my first elixir program, number guessing game. I can't figure out how to convert the user's guess from ...
New
electic
Hi, I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New

We're in Beta

About us Mission Statement