@@ -3166,6 +3166,17 @@ sock_setsockopt(PySocketSockObject *s, PyObject *args)
31663166 /* setsockopt(level, opt, flag) */
31673167 if (PyArg_ParseTuple (args , "iii:setsockopt" ,
31683168 & level , & optname , & flag )) {
3169+ #ifdef MS_WINDOWS
3170+ if (optname == SIO_TCP_SET_ACK_FREQUENCY ) {
3171+ int dummy ;
3172+ res = WSAIoctl (s -> sock_fd , SIO_TCP_SET_ACK_FREQUENCY , & flag ,
3173+ sizeof (flag ), NULL , 0 , & dummy , NULL , NULL );
3174+ if (res >= 0 ) {
3175+ s -> quickack = flag ;
3176+ }
3177+ goto done ;
3178+ }
3179+ #endif
31693180 res = setsockopt (s -> sock_fd , level , optname ,
31703181 (char * )& flag , sizeof flag );
31713182 goto done ;
@@ -3251,6 +3262,11 @@ sock_getsockopt(PySocketSockObject *s, PyObject *args)
32513262 return s -> errorhandler ();
32523263 return PyLong_FromUnsignedLong (vflag );
32533264 }
3265+ #endif
3266+ #ifdef MS_WINDOWS
3267+ if (optname == SIO_TCP_SET_ACK_FREQUENCY ) {
3268+ return PyLong_FromLong (s -> quickack );
3269+ }
32543270#endif
32553271 flagsize = sizeof flag ;
32563272 res = getsockopt (s -> sock_fd , level , optname ,
@@ -5316,6 +5332,9 @@ sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
53165332 ((PySocketSockObject * )new )-> sock_fd = INVALID_SOCKET ;
53175333 ((PySocketSockObject * )new )-> sock_timeout = _PyTime_FromSeconds (-1 );
53185334 ((PySocketSockObject * )new )-> errorhandler = & set_error ;
5335+ #ifdef MS_WINDOWS
5336+ ((PySocketSockObject * )new )-> quickack = 0 ;
5337+ #endif
53195338 }
53205339 return new ;
53215340}
@@ -8616,6 +8635,9 @@ socket_exec(PyObject *m)
86168635#ifdef TCP_CONNECTION_INFO
86178636 ADD_INT_MACRO (m , TCP_CONNECTION_INFO );
86188637#endif
8638+ #ifdef SIO_TCP_SET_ACK_FREQUENCY
8639+ #define TCP_QUICKACK SIO_TCP_SET_ACK_FREQUENCY
8640+ #endif
86198641#ifdef TCP_QUICKACK
86208642 ADD_INT_MACRO (m , TCP_QUICKACK );
86218643#endif
0 commit comments