classification
Title: socket timeout problems on Solaris
Type: behavior Stage: test needed
Components: Extension Modules, Library (Lib) Versions: Python 2.6
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: astrand, movement, vila (3)
Priority: normal Keywords

Created on 2004-06-21 09:36 by astrand, last changed 2009-02-16 01:33 by movement.

Files
File name Uploaded Description Edit Remove
socketmodule.patch astrand, 2004-06-21 09:37 Suggested patch 1
Messages (2)
msg21231 - (view) Author: Peter Åstrand (astrand) Date: 2004-06-21 09:36
The timeout stuff in the socket module does not work
correctly on Solaris. Here's a typical example:

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("localhost", 9048))
s.listen(1)
s.settimeout(10)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
    data = conn.recv(1024)
    if not data: break
    conn.send(data)
conn.close()

When connecting, I get this traceback:

Connected by ('127.0.0.1', 32866)
Traceback (most recent call last):
  File "foo.py", line 10, in ?
    data = conn.recv(1024)
socket.error: (11, 'Resource temporarily unavailable')

This is because Python treats the new socket object as
blocking (the timeout value is -1). However, in
Solaris, sockets returned from accept() inherits the
blocking property. So, because the listenting socket
was in non-blocking mode, the new connected socket will
be non-blocking as well. Since the timeout is -1,
internal_select will not call select. 

The solution to this problem is to explicitly set the
blocking mode on new socket objects. The attached patch
implements this. 
msg21232 - (view) Author: Peter Åstrand (astrand) Date: 2004-06-21 12:20
Logged In: YES 
user_id=344921

One workaround for this problem is:

socket.setdefaulttimeout(somethinglarge)

Or, if you have the possibility, you can do
conn.setblocking(1) right after accept(). 
History
Date User Action Args
2009-02-16 01:33:29movementsetnosy: + movement
2009-02-14 14:47:02ajaksu2setstage: test needed
type: behavior
components: + Extension Modules
versions: + Python 2.6, - Python 2.3
2008-01-05 14:15:42vilasetnosy: + vila
2004-06-21 09:36:13astrandcreate