Thanks for all this.  

A few quick notes:

On Apr 20, 2016, at 9:15 PM, Glyph wrote:

> This isn't so much a feature of Python as it is a feature of the BSD sockets 
> API.  Sending traffic through a socket, whether it's TCP or UDP, has to bind 
> a client port.  Given the nature of UDP, binding on all interfaces is the 
> expectation unless you specify.
> 
> I didn't have time to test a simple C program before sending this message, 
> but https://github.com/python/cpython/blob/master/Modules/socketmodule.c only 
> calls "bind()" from sock_bind, not from send(), nor does 
> https://github.com/python/cpython/blob/master/Lib/socket.py engage in any 
> such shenanigans.

The 'feature' of Python is a few things:

From what I could tell, the actual communication and binding happens somewhere 
in the c module.  

if you just construct socket:

    sock = socket.socket(family, socket.SOCK_DGRAM)

it will defer the bind on 0.0.0.0 until the first time data is emitted:

    sock.sendto(data.encode('ascii'), addr)

That's one of the things that drove me crazy (and the reason why I'm posting 
more than a simple "thank you", in case someone else gets stumped in the 
future).  
There's no call to anything with a "bind" involved in any python code.  it just 
happens behind the scenes.

> There's also a Twisted version :) https://pypi.python.org/pypi/txStatsD
> 
> txStatsD contains both server and client, so maybe you want to use that 
> client if you want better control over the UDP port.

yeah, I'm gonna do that ;)

> That range is the ephemeral client port range 
> <https://en.wikipedia.org/wiki/Ephemeral_port> so that's what would be 
> expected of an implicitly-bound socket.

THANK YOU.  I could not remember that name.  I knew about the ephemeral port 
range, but have not seen that term in 10+ years.  THANK YOU!!!!


_______________________________________________
Twisted-Python mailing list
Twisted-Python@twistedmatrix.com
http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python

Reply via email to