Issue #1552: socket.socketpair() now returns regular socket.socket

objects supporting the whole socket API (rather than the "raw"
_socket.socket objects).
This commit is contained in:
Antoine Pitrou 2010-09-14 18:00:02 +00:00
parent 38615993b0
commit 9e0b864ac0
4 changed files with 47 additions and 0 deletions

View File

@ -364,6 +364,10 @@ The module :mod:`socket` exports the following constants and functions:
if defined on the platform; otherwise, the default is :const:`AF_INET`.
Availability: Unix.
.. versionchanged:: 3.2
The returned socket objects now support the whole socket API, rather
than a subset.
.. function:: fromfd(fd, family, type[, proto])

View File

@ -199,6 +199,27 @@ def fromfd(fd, family, type, proto=0):
return socket(family, type, proto, nfd)
if hasattr(_socket, "socketpair"):
def socketpair(family=None, type=SOCK_STREAM, proto=0):
"""socketpair([family[, type[, proto]]]) -> (socket object, socket object)
Create a pair of socket objects from the sockets returned by the platform
socketpair() function.
The arguments are the same as for socket() except the default family is
AF_UNIX if defined on the platform; otherwise, the default is AF_INET.
"""
if family is None:
try:
family = AF_UNIX
except NameError:
family = AF_INET
a, b = _socket.socketpair(family, type, proto)
a = socket(family, type, proto, a.detach())
b = socket(family, type, proto, b.detach())
return a, b
class SocketIO(io.RawIOBase):
"""Raw I/O implementation for stream sockets.

View File

@ -714,6 +714,7 @@ class BasicTCPTest(SocketConnectedTest):
# Testing fromfd()
fd = self.cli_conn.fileno()
sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
self.assertIsInstance(sock, socket.socket)
msg = sock.recv(1024)
self.assertEqual(msg, MSG)
@ -814,6 +815,23 @@ class BasicSocketPairTest(SocketPairTest):
def __init__(self, methodName='runTest'):
SocketPairTest.__init__(self, methodName=methodName)
def _testDefaults(self):
pass
def testDefaults(self):
self.assertIsInstance(self.cli, socket.socket)
self.assertIsInstance(self.serv, socket.socket)
if hasattr(socket, 'AF_UNIX'):
self.assertEqual(self.cli.family, socket.AF_UNIX)
self.assertEqual(self.serv.family, socket.AF_UNIX)
else:
self.assertEqual(self.cli.family, socket.AF_INET)
self.assertEqual(self.serv.family, socket.AF_INET)
self.assertEqual(self.cli.type, socket.SOCK_STREAM)
self.assertEqual(self.serv.type, socket.SOCK_STREAM)
self.assertEqual(self.cli.proto, 0)
self.assertEqual(self.serv.proto, 0)
def testRecv(self):
msg = self.serv.recv(1024)
self.assertEqual(msg, MSG)

View File

@ -52,6 +52,10 @@ Core and Builtins
Library
-------
- Issue #1552: socket.socketpair() now returns regular socket.socket
objects supporting the whole socket API (rather than the "raw"
_socket.socket objects).
- Issue #9853: Fix the signature of SSLSocket.recvfrom() and
SSLSocket.sendto() to match the corresponding socket methods.