[Python-Dev] Pervasive socket failures on Windows

Scott Dial scott+python-dev at scottdial.com
Fri Feb 10 22:41:41 CET 2006


Martin v. Löwis wrote:
> Tim Peters wrote:
>> I suggest skipping the new crud conditionalized on a symbol like
>>
>>     Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE
>>
> 
> Hmm... How about this patch:
> 
> Index: Modules/socketmodule.c
> ===================================================================
> --- Modules/socketmodule.c      (Revision 42308)
> +++ Modules/socketmodule.c      (Arbeitskopie)
> @@ -396,7 +396,14 @@
>  static PyTypeObject sock_type;
> 
>  /* Can we call select() with this socket without a buffer overrun? */
> +#ifdef MS_WINDOWS
> +/* Everything is selectable on Windows */
> +#define IS_SELECTABLE(s)  1
> +#else
> +/* POSIX says selecting descriptors above FD_SETSIZE is undefined
> +   behaviour. */
>  #define IS_SELECTABLE(s) ((s)->sock_fd < FD_SETSIZE)
> +#endif
> 
>  static PyObject*
>  select_error(void)
> 
> Regards,
> Martin

That is the exact patch I applied, but you also need to patch _ssl.c

--- C:/python-trunk/Modules/_ssl.c	(revision 42305)
+++ C:/python-trunk/Modules/_ssl.c	(working copy)
@@ -376,9 +376,11 @@
  	if (s->sock_fd < 0)
  		return SOCKET_HAS_BEEN_CLOSED;

+#ifndef MS_WINDOWS
  	/* Guard against socket too large for select*/
  	if (s->sock_fd >= FD_SETSIZE)
  		return SOCKET_INVALID;
+#endif

  	/* Construct the arguments to select */
  	tv.tv_sec = (int)s->sock_timeout;


But then that leaves whether to go with the 
Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE symbol instead of MS_WINDOWS.

-- 
Scott Dial
scott at scottdial.com
dialsa at rose-hulman.edu


More information about the Python-Dev mailing list