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
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.
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.
: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.
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
.