i386/125258: socket's SO_REUSEADDR option does not work
Giampaolo Rodolà
billiejoex at gmail.com
Fri Jul 4 10:50:02 UTC 2008
>Number: 125258
>Category: i386
>Synopsis: socket's SO_REUSEADDR option does not work
>Confidential: no
>Severity: non-critical
>Priority: medium
>Responsible: freebsd-i386
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Fri Jul 04 10:50:01 UTC 2008
>Closed-Date:
>Last-Modified:
>Originator: Giampaolo Rodolà
>Release: 7.0-RC1
>Organization:
>Environment:
FreeBSD dhcppc1 7.0-RC1
>Description:
When the SO_OOBINLINE option is used against a socket, out-of-band data
should be placed in the normal data input stream as it is received.
In fact this is what happens on Windows and Linux by using the Python script below.
On FreeBSD this does not happen. select instead of returning a
"readable" file descriptor returns an "exceptional" file descriptor.
Later, when I try to read some data from the socket, the following
exception is raised:
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/local/lib/python2.5/threading.py", line 460, in __bootstrap
self.run()
File "/usr/local/lib/python2.5/threading.py", line 440, in run
self.__target(*self.__args, **self.__kwargs)
File "_test2.py", line 14, in server
data = conn.recv(1024, socket.MSG_OOB)
error: (22, 'Invalid argument')
--- code ---
import socket, select, threading, time, os
def server():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('', 1024))
s.listen(1)
conn, addr = s.accept()
conn.setblocking(0)
conn.setsockopt(socket.SOL_SOCKET, socket.SO_OOBINLINE, 1)
while 1:
r, w, e = select.select([conn], [conn], [conn], 0.01)
if r:
# the socket is supposed to be in the "readable" list
data = conn.recv(1024)
print "read -> " + data
if e:
# ...but not in the "exception" list
data = conn.recv(1024, socket.MSG_OOB)
print "expt -> " + data
threading.Thread(target=server).start()
time.sleep(0.1)
s = socket.socket()
s.connect(('127.0.0.1', 1024))
s.sendall('x', socket.MSG_OOB)
--- /code ---
>How-To-Repeat:
>Fix:
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-i386
mailing list