[BangPypers] Socket Error : Address still in use (Conveting from python 1.5.2 to 2.7.1)

Wah Meng Wong wah_meng at yahoo.com
Tue Mar 27 12:08:27 CEST 2012


Hello there,
 
I am almost done converting my application from
python 1.5.2 to python 2.7.1 on a HP-UX 11 Itanium box. 
 
My application server will set a listening port,
accepting request from multiple clients. The code just works fine in the old
python environment. E.g. when I do a lsof | grep <listening port> I got
the following.
 
python     62602  genasm    5u  IPv4 0x7350d1f0        0t0  TCP zmy02aix02:12121 (LISTEN)
python     62602  genasm    6u  IPv4 0x744fb5f0        0t0  TCP
zmy02aix02:12121->zmy02aix02-bkup:51867 (ESTABLISHED)
python     62602  genasm    7u  IPv4 0x75b959f0        0t0  TCP
zmy02aix02:12121->zmy02aix02-bkup:51869 (ESTABLISHED)
python     62602  genasm    8u  IPv4 0x75a559f0        0t0  TCP
zmy02aix02:12121->zmy02aix02-bkup:51873 (ESTABLISHED)
 
Strange things happened in python 2.7.1. Without
modifying the code of how the socket was created and how the TCP/IP address was
bound to the socket, it seems that every other processes that I run, which
supposed to connect to the listening port as a client program, also appears to
be holding a listening port. This is weird. Anyone has encountered this before
especially when you were converting from an old python to a new python? Like
you can see below there are 5 processes hosting the listening port of 18882.
 
$ lsof -i tcp | grep 18882
python  10598
r32813    3u  IPv4 0xe00000050b73e400       0t0  TCP zmy02hp3.ap.freescale.net:18882 (LISTEN)
python  18181
r32813    3u  IPv4 0xe00000050b73e400       0t0  TCP zmy02hp3.ap.freescale.net:18882 (LISTEN)
python  20025
r32813    3u  IPv4 0xe00000050b73e400       0t0  TCP zmy02hp3.ap.freescale.net:18882 (LISTEN)
python  26295
r32813    3u  IPv4 0xe00000050b73e400       0t0  TCP zmy02hp3.ap.freescale.net:18882 (LISTEN)
python  26428
r32813    3u  IPv4 0xe00000050b73e400       0t0  TCP zmy02hp3.ap.freescale.net:18882 (LISTEN)
 
Since only one of them is the genuine process holding the
port, I need to kill off the rest of them if I need to restart the process which is the legitimate owner of the listening port. It should not work this way. 
 
Here is the code of the application process that hosts
the listening port. 
 
      self.sock =
socket.socket( socket.AF_INET, socket.SOCK_STREAM )
      self.sock.setsockopt(
socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 )
      self.sock.setsockopt(
socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1
      self.sock.setsockopt(
socket.IPPROTO_TCP, _TCP_NODELAY, 1 )
      self.sock.bind(
self.server_address )
  
 
Here is the client code that does the connection.
 
       self.sock =
socket.socket( socket.AF_INET, socket.SOCK_STREAM )
       self.sock.setsockopt( socket.IPPROTO_TCP, _TCP_NODELAY, 1 )
       self.sock.connect( self.server_address )

Hope to hear something from the community. 


 
Regards,
Wah Meng


More information about the BangPypers mailing list