epmd

David Gould <>
Wed May 31 02:52:28 CEST 2000


On Tue, May 30, 2000 at 06:14:29PM +0100, Richard Barrett wrote:
... 
> It turns out that Suse 6.2 Linux (as on _WIN32_) and possibly other 
> versions of Linux, take the SO_REUSEADDR socket option at face value. 
> In consequence, bind failure, when this socket option is used, is 
> inadequate as the sole determinant of whether epmd is already extant 
> in the system.
... 
> For reasons I have yet to determine, under Sun Solaris, an attempt to 
> bind to a given port by a second instance of my test scripts (see 
> below) does fail, even though the SO_REUSEADDR socket option has be 
> enabled. So, Solaris and Suse 6.2 Linux appear to interpret the 
> semantics of the SO_REUSEADDR socket option rather differently and 
> I've no opinion as to which is correct.
> 
> Incidentally, I explored this problem using some short Python 
> scripts, copies of which are given below. Thanks to those readers who 
> contributed a response to my original posting.

I tested with your scripts on SuSE 6.4

  (Linux archimedes 2.2.14 #1 Sat Mar 11 04:17:23 GMT 2000 i686 unknown)

and get the correct result I think:

      $ python so_reuseaddr_svr.py  &
      [1] 7644
      Server process pid=7644 starting with SO_REUSEADDR=1
      $ python so_reuseaddr_svr.py  &
      [2] 7645
      Server process pid=7645 starting with SO_REUSEADDR=1
      Traceback (innermost last):
        File "so_reuseaddr_svr.py", line 11, in ?
          s.bind(HOST, PORT)
      socket.error: (98, 'Address already in use')

-dg
 
> --------------------------------------------------------
> Experimental Python scripts are as follows.
> 
> server script enabling SO_REUSEADDR --------------------
> 
> from socket import *
> import os
> pid = os.getpid()
> HOST = ''
> PORT = 4369
> s = socket(AF_INET, SOCK_STREAM)
> s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
> reuse = s.getsockopt(SOL_SOCKET, SO_REUSEADDR)
> print "Server process pid=%d starting with SO_REUSEADDR=%d" % (pid, reuse)
> s.bind(HOST, PORT)
> s.listen(1)
> conn, addr = s.accept()
> s.close()
> print "Process %d connected to %s with SO_REUSEADDR=%d" % (pid, addr, reuse)
> while 1:
> 	data = conn.recv(1024)
> 	if not data: break
> 	data = data + (", returned by pid=%d" % pid)
> 	conn.send(data)
> conn.close()
> 
> server script not enabling SO_REUSEADDR --------------------
> 
> from socket import *
> import os
> pid = os.getpid()
> HOST = ''
> PORT = 4369
> s = socket(AF_INET, SOCK_STREAM)
> reuse = s.getsockopt(SOL_SOCKET, SO_REUSEADDR)
> print "Server process pid=%d starting with SO_REUSEADDR=%d" % (pid, reuse)
> s.bind(HOST, PORT)
> s.listen(1)
> conn, addr = s.accept()
> s.close()
> print "Process %d connected to %s with SO_REUSEADDR=%d" % (pid, addr, reuse)
> while 1:
> 	data = conn.recv(1024)
> 	if not data: break
> 	data = data + (", returned by pid=%d" % pid)
> 	conn.send(data)
> conn.close()
> 
> client script --------------------
> from socket import *
> import os
> pid = os.getpid()
> print "Client process pid=%d starting" % pid
> HOST = ''
> PORT = 4369
> s = socket(AF_INET, SOCK_STREAM)
> s.connect(HOST, PORT)
> s.send("Hello, world sent from pid=%d" % pid)
> data = s.recv(1024)
> s.close()
> print 'Received', `data`
> --------------------------------------------------------------

-- 
David Gould                                                 
SuSE, Inc.,  580 2cd St. #210,  Oakland, CA 94607          510.628.3380
C++ : an octopus made by nailing extra legs onto a dog



More information about the erlang-questions mailing list