Getting the error {:error, :eacces} while trying to connect to an udp server on port 123

I was trying to connect to a NTP server using :gen_udp module but it seems anything below port 1000 is getting an error{:error, :eacces}

I am not sure why is that a case

Can you share some code?

If the value of the port is less than 1000

iex(1)> {:ok, sock} = :gen_udp.open(123)

{:error, :eacces}


iex(2)> :gen_udp.open(1230)
{:ok, #Port<0.1433>}

Only root is allowed to bind to ports less than 1024.

2 Likes

But python programs can access the port less than 1024

I found the solution

The port parameter in :gen_udp.open/1 is the local port on which the application receives datagrams. If you’re implementing a client you don’t need to bind to port 123, you can just let the OS pick an available (unprivileged) port: :gen_udp.open(0).

When you send datagrams to the server, using :gen_udp.send/4, you set the destination port to 123. You don’t need special permissions for that.

2 Likes

:gen_udp.open/1/2 opens the port to send and receive. If you just want to send datagrams without receiving, then using 0 as port is usually sufficient. Also remember, that open takes your local port, while the remote port is an argument to send/4. Both ports may be (and in fact almost ever are) different.

I do not know though, how pythons UDP implementation works.

2 Likes

That python code does not specify the port to open on the client. If it did, there would have been a third argument to socket.socket. Leaving out the third argument, which is the port number on the client, is the equivalent to passing 0 as the port to :gen_udp.open.

3 Likes