]> granicus.if.org Git - python/commitdiff
Issue #21455: Add a default backlog to socket.listen().
authorCharles-François Natali <cf.natali@gmail.com>
Thu, 22 May 2014 18:45:39 +0000 (19:45 +0100)
committerCharles-François Natali <cf.natali@gmail.com>
Thu, 22 May 2014 18:45:39 +0000 (19:45 +0100)
Doc/library/socket.rst
Lib/test/test_socket.py
Misc/NEWS
Modules/socketmodule.c

index 1f5a8e05e6569bf7f38c1cfc5bb2ff7f68b4c4af..3a9d6110fdd87c8be1482199efff318c50718f9a 100644 (file)
@@ -906,12 +906,15 @@ to sockets.
    On other platforms, the generic :func:`fcntl.fcntl` and :func:`fcntl.ioctl`
    functions may be used; they accept a socket object as their first argument.
 
-.. method:: socket.listen(backlog)
+.. method:: socket.listen([backlog])
 
-   Listen for connections made to the socket.  The *backlog* argument specifies the
-   maximum number of queued connections and should be at least 0; the maximum value
-   is system-dependent (usually 5), the minimum value is forced to 0.
+   Enable a server to accept connections.  If *backlog* is specified, it must
+   be at least 0 (if it is lower, it is set to 0); it specifies the number of
+   unaccepted connections that the system will allow before refusing new
+   connections. If not specified, a default reasonable value is chosen.
 
+   .. versionchanged:: 3.5
+      The *backlog* parameter is now optional.
 
 .. method:: socket.makefile(mode='r', buffering=None, *, encoding=None, \
                             errors=None, newline=None)
index aed10a70ac1521e645dc3b8a52c0a093d8bc489f..86cbec7c37e8847a7503fd914554efbc40fc8812 100644 (file)
@@ -1344,10 +1344,13 @@ class GeneralModuleTests(unittest.TestCase):
 
     def test_listen_backlog(self):
         for backlog in 0, -1:
-            srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+            with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
+                srv.bind((HOST, 0))
+                srv.listen(backlog)
+
+        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
             srv.bind((HOST, 0))
-            srv.listen(backlog)
-            srv.close()
+            srv.listen()
 
     @support.cpython_only
     def test_listen_backlog_overflow(self):
index 79e1505c97eb3ff0756809ab47d919f7ba56cb33..76006d908748db37c70080bbf2a34305bf18ba72 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -84,6 +84,8 @@ Core and Builtins
 Library
 -------
 
+- Issue #21455: Add a default backlog to socket.listen().
+
 - Issue #21525: Most Tkinter methods which accepted tuples now accept lists too.
 
 - Issue #10744: Fix PEP 3118 format strings on ctypes objects with a nontrivial
index d0149dda1c883043c9f5aefef90e7767009b31b5..5a2893ce4d2d33c1488dbe4a9fcb60457ba463d4 100644 (file)
@@ -121,7 +121,7 @@ getpeername() -- return remote address [*]\n\
 getsockname() -- return local address\n\
 getsockopt(level, optname[, buflen]) -- get socket options\n\
 gettimeout() -- return timeout or None\n\
-listen(n) -- start listening for incoming connections\n\
+listen([n]) -- start listening for incoming connections\n\
 recv(buflen[, flags]) -- receive data\n\
 recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
 recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
@@ -2534,14 +2534,16 @@ info is a pair (hostaddr, port).");
 /* s.listen(n) method */
 
 static PyObject *
-sock_listen(PySocketSockObject *s, PyObject *arg)
+sock_listen(PySocketSockObject *s, PyObject *args)
 {
-    int backlog;
+    /* We try to choose a default backlog high enough to avoid connection drops
+     * for common workloads, yet not too high to limit resource usage. */
+    int backlog = Py_MIN(SOMAXCONN, 128);
     int res;
 
-    backlog = _PyLong_AsInt(arg);
-    if (backlog == -1 && PyErr_Occurred())
+    if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
         return NULL;
+
     Py_BEGIN_ALLOW_THREADS
     /* To avoid problems on systems that don't allow a negative backlog
      * (which doesn't make sense anyway) we force a minimum value of 0. */
@@ -2556,12 +2558,12 @@ sock_listen(PySocketSockObject *s, PyObject *arg)
 }
 
 PyDoc_STRVAR(listen_doc,
-"listen(backlog)\n\
+"listen([backlog])\n\
 \n\
-Enable a server to accept connections.  The backlog argument must be at\n\
-least 0 (if it is lower, it is set to 0); it specifies the number of\n\
+Enable a server to accept connections.  If backlog is specified, it must be\n\
+at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
 unaccepted connections that the system will allow before refusing new\n\
-connections.");
+connections. If not specified, a default reasonable value is chosen.");
 
 
 /*
@@ -3795,7 +3797,7 @@ static PyMethodDef sock_methods[] = {
     {"share",         (PyCFunction)sock_share, METH_VARARGS,
                       sock_share_doc},
 #endif
-    {"listen",            (PyCFunction)sock_listen, METH_O,
+    {"listen",            (PyCFunction)sock_listen, METH_VARARGS,
                       listen_doc},
     {"recv",              (PyCFunction)sock_recv, METH_VARARGS,
                       recv_doc},