serious rresvport problem in python 2.2.1

Carey Evans careye at spamcop.net
Tue Aug 13 22:11:57 EDT 2002


Dan Stromberg wrote:
> I've been using a modified version of Carey Evans' rresvport function
> in a printsystem.

I'd actually forgotten writing this.  It's all coming back to me now 
though.  After a bit of tidying up, I get the version below, which works 
for me with Python 2.1.3 and 2.2.1 on Windows 2000 and Linux.

The main changes from my original version are:

* Fixing the bind() to use a two-element tuple.  Two arguments has 
always been wrong, but earlier versions of Python let it go.
* Removing the strange exception handling code.  I have no idea what I 
was thinking.

> So I got kind of interested in that '' in the bind call.  This is
> supposed to mean "localhost".  So I changed it to
> bind(('localhost',port)).

The '' actually means INADDR_ANY, or 0.0.0.0.  (Though for some reason, 
socket.INADDR_ANY is the integer 0, which doesn't work with bind.)  You 
could try using '0.0.0.0' instead of the empty string, although it 
should mean exactly the same thing.

----------------------------------------------------------------------
"""A module to allocate a socket on a reserved port.

Copyright (c) 1998, 2002 Carey Evans.

Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation."""

import socket, errno

class RResvPortError(Exception):
     def __str__(self):
         return 'No reserved ports available'

def rresvport():
     """rresvport() -> socket

Return a socket with a privileged address bound to it.  On Unix systems,
this can only be done by root.  If no reserved ports are available,
raise RResvPortError."""

     port = 1023
     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     while port >= 512:
         try:
             s.bind(('', port))
         except socket.error, detail:
             if detail[0] != errno.EADDRINUSE:
                 raise
         else:
             return s
         port = port - 1

     raise RResvPortError
----------------------------------------------------------------------

-- 
"Every time you misuse it's, ten kittens are KILLED."
   -- Ben Goodger




More information about the Python-list mailing list