Improve docs for socket.makefile() and SocketIO

This commit is contained in:
Antoine Pitrou 2010-09-15 09:32:45 +00:00
parent 872b79d02f
commit 5aa0d10560
2 changed files with 26 additions and 4 deletions

View File

@ -622,10 +622,9 @@ correspond to Unix system calls applicable to sockets.
arguments are interpreted the same way as by the built-in :func:`open` arguments are interpreted the same way as by the built-in :func:`open`
function. function.
The returned file object references a :cfunc:`dup`\ ped version of the Closing the file object won't close the socket unless there are no
socket file descriptor, so the file object and socket object may be remaining references to the socket. The socket must be in blocking mode
closed or garbage-collected independently. The socket must be in (it can not have a timeout).
blocking mode (it can not have a timeout).
.. method:: socket.recv(bufsize[, flags]) .. method:: socket.recv(bufsize[, flags])

View File

@ -54,6 +54,8 @@ except ImportError:
errno = None errno = None
EBADF = getattr(errno, 'EBADF', 9) EBADF = getattr(errno, 'EBADF', 9)
EINTR = getattr(errno, 'EINTR', 4) EINTR = getattr(errno, 'EINTR', 4)
EAGAIN = getattr(errno, 'EAGAIN', 11)
EWOULDBLOCK = getattr(errno, 'EWOULDBLOCK', 11)
__all__ = ["getfqdn", "create_connection"] __all__ = ["getfqdn", "create_connection"]
__all__.extend(os._get_exports_list(_socket)) __all__.extend(os._get_exports_list(_socket))
@ -249,6 +251,13 @@ class SocketIO(io.RawIOBase):
self._writing = "w" in mode self._writing = "w" in mode
def readinto(self, b): def readinto(self, b):
"""Read up to len(b) bytes into the writable buffer *b* and return
the number of bytes read. If the socket is non-blocking and no bytes
are available, None is returned.
If *b* is non-empty, a 0 return value indicates that the connection
was shutdown at the other end.
"""
self._checkClosed() self._checkClosed()
self._checkReadable() self._checkReadable()
while True: while True:
@ -260,17 +269,28 @@ class SocketIO(io.RawIOBase):
raise raise
def write(self, b): def write(self, b):
"""Write the given bytes or bytearray object *b* to the socket
and return the number of bytes written. This can be less than
len(b) if not all data could be written. If the socket is
non-blocking and no bytes could be written None is returned.
"""
self._checkClosed() self._checkClosed()
self._checkWritable() self._checkWritable()
return self._sock.send(b) return self._sock.send(b)
def readable(self): def readable(self):
"""True if the SocketIO is open for reading.
"""
return self._reading and not self.closed return self._reading and not self.closed
def writable(self): def writable(self):
"""True if the SocketIO is open for writing.
"""
return self._writing and not self.closed return self._writing and not self.closed
def fileno(self): def fileno(self):
"""Return the file descriptor of the underlying socket.
"""
self._checkClosed() self._checkClosed()
return self._sock.fileno() return self._sock.fileno()
@ -283,6 +303,9 @@ class SocketIO(io.RawIOBase):
return self._mode return self._mode
def close(self): def close(self):
"""Close the SocketIO object. This doesn't close the underlying
socket, except if all references to it have disappeared.
"""
if self.closed: if self.closed:
return return
io.RawIOBase.close(self) io.RawIOBase.close(self)