summaryrefslogtreecommitdiffstats
path: root/Doc/library
diff options
context:
space:
mode:
authorGiampaolo RodolĂ  <g.rodola@gmail.com>2010-11-01 15:18:09 (GMT)
committerGiampaolo RodolĂ  <g.rodola@gmail.com>2010-11-01 15:18:09 (GMT)
commit5ea3d0f95b51009fa1c3409e7dd1c12006427ccc (patch)
treed532cf8a8c9b9fccd3f8cf7738a1716a4e3662f5 /Doc/library
parent8581c7e11a2e38c076fc3d96f30fce394ff1ce69 (diff)
downloadcpython-5ea3d0f95b51009fa1c3409e7dd1c12006427ccc.zip
cpython-5ea3d0f95b51009fa1c3409e7dd1c12006427ccc.tar.gz
cpython-5ea3d0f95b51009fa1c3409e7dd1c12006427ccc.tar.bz2
Fix Issue 6706: return None on connect() in case of EWOULDBLOCK/ECONNABORTED error.
Diffstat (limited to 'Doc/library')
-rw-r--r--Doc/library/asyncore.rst64
1 files changed, 56 insertions, 8 deletions
diff --git a/Doc/library/asyncore.rst b/Doc/library/asyncore.rst
index 8cdfe20..7edf612 100644
--- a/Doc/library/asyncore.rst
+++ b/Doc/library/asyncore.rst
@@ -209,10 +209,13 @@ any that have been added to the map during asynchronous service) is closed.
.. method:: accept()
Accept a connection. The socket must be bound to an address and listening
- for connections. The return value is a pair ``(conn, address)`` where
- *conn* is a *new* socket object usable to send and receive data on the
- connection, and *address* is the address bound to the socket on the other
- end of the connection.
+ for connections. The return value can be either ``None`` or a pair
+ ``(conn, address)`` where *conn* is a *new* socket object usable to send
+ and receive data on the connection, and *address* is the address bound to
+ the socket on the other end of the connection.
+ When ``None`` is returned it means the connection didn't take place, in
+ which case the server should just ignore this event and keep listening
+ for further incoming connections.
.. method:: close()
@@ -222,6 +225,12 @@ any that have been added to the map during asynchronous service) is closed.
flushed). Sockets are automatically closed when they are
garbage-collected.
+.. class:: dispatcher_with_send()
+
+ A :class:`dispatcher` subclass which adds simple buffered output capability,
+ useful for simple clients. For more sophisticated usage use
+ :class:`asynchat.async_chat`.
+
.. class:: file_dispatcher()
A file_dispatcher takes a file descriptor or :term:`file object` along
@@ -238,7 +247,7 @@ any that have been added to the map during asynchronous service) is closed.
socket for use by the :class:`file_dispatcher` class. Availability: UNIX.
-.. _asyncore-example:
+.. _asyncore-example-1:
asyncore Example basic HTTP client
----------------------------------
@@ -248,7 +257,7 @@ implement its socket handling::
import asyncore, socket
- class http_client(asyncore.dispatcher):
+ class HTTPClient(asyncore.dispatcher):
def __init__(self, host, path):
asyncore.dispatcher.__init__(self)
@@ -272,6 +281,45 @@ implement its socket handling::
sent = self.send(self.buffer)
self.buffer = self.buffer[sent:]
- c = http_client('www.python.org', '/')
- asyncore.loop()
+ client = HTTPClient('www.python.org', '/')
+ asyncore.loop()
+
+.. _asyncore-example-2:
+
+asyncore Example basic echo server
+----------------------------------
+
+Here is abasic echo server that uses the :class:`dispatcher` class to accept
+connections and dispatches the incoming connections to a handler::
+
+ import asyncore
+ import socket
+
+ class EchoHandler(asyncore.dispatcher_with_send):
+
+ def handle_read(self):
+ data = self.recv(8192)
+ self.send(data)
+
+ class EchoServer(asyncore.dispatcher):
+
+ def __init__(self, host, port):
+ asyncore.dispatcher.__init__(self)
+ self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
+ self.set_reuse_addr()
+ self.bind((host, port))
+ self.listen(5)
+
+ def handle_accept(self):
+ pair = self.accept()
+ if pair is None:
+ return
+ else:
+ sock, addr = pair
+ print('Incoming connection from %s' % repr(addr))
+ handler = EchoHandler(sock)
+
+ server = EchoServer('localhost', 8080)
+ asyncore.loop()
+