如何在Windows 7中运行python 2.5中设置保活计时器

问题描述:

我需要一些帮助。我正在使用运行在Windows7上的Python 2.5.4的旧版软件,我需要在套接字连接中启用Keepalive。如何在Windows 7中运行python 2.5中设置保活计时器

我在下面的线程看到您可以使用

object.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) 

启用蟒蛇保活不过这个安装程序将使用默认的Windows保持2小时连接定时器。

我也看到,我们可以使用以下API设置计时器,但它仅适用于Python 2.6以上版本。

sock.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 10000, 3000)) 

是否有无论如何我可以使用python 2.5.4设置此SIO_KEEPALIVE_VALS?遗留代码我也有模块pywin32-214。我真的不能升级python版本。

我还纳闷怎么python2.6的和新的调用Windows API

int WSAIoctl(
    (socket) s,    // descriptor identifying a socket 
    SIO_KEEPALIVE_VALS,     // dwIoControlCode 
    (LPVOID) lpvInBuffer, // pointer to tcp_keepalive struct 
    (DWORD) cbInBuffer,  // length of input buffer 
    NULL,   // output buffer 
    0,  // size of output buffer 
    (LPDWORD) lpcbBytesReturned, // number of bytes returned 
    (LPWSAOVERLAPPED) lpOverlapped, // OVERLAPPED structure 
    (LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine, // completion routine 
); 

感谢您的帮助。

参考文献: How to change tcp keepalive timer using python script?

https://msdn.microsoft.com/en-us/library/dd877220%28v=vs.85%29.aspx

+0

你可以返回[sock_ioctl](https://hg.python.org/cpython/file/2.6/Modules/socketmodule.c#l2848)函数从Python 2.6或使用Ctypes调用[WSAIoctl](https://github.com/twisted/twisted/blob/e38cc25a67747899c6984d6ebaa8d3d134799415/src/twisted/internet/test/_win32ifaces.py#L26)函数。 – cgohlke

+0

嗨@cgohlke,谢谢你的建议。但是,我还没有真正尝试过将C/C++与Python混合。我会开始研究它。如果您有任何关于良好参考的建议,将不胜感激。非常感谢。 – paulp

这里是你如何做到这一点在C

static PyObject* 
sock_ioctl(PyObject *argO , PyObject *arg) 
{ 
PyObject *s; 
DWORD recv; 
struct tcp_keepalive ka; 
if (!PyArg_ParseTuple(arg, "O(kkk):keepalive",&s, 
    &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval)) 
    return NULL; 

if (WSAIoctl(PyObject_AsFileDescriptor(s), SIO_KEEPALIVE_VALS, &ka, sizeof(ka), 
    NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) { 
    return set_error(); 
} 
return PyLong_FromUnsignedLong(recv); 
} 

我做在github上https://github.com/rawinput/ioctl小蟒蛇扩展编译为Python 2.5

+0

非常感谢@rawinput。真的很感激它。我试过了,API的功能就像一个魅力(没有错误的返回)。我很熟悉C/C++和Python,但是,我没有真正尝试过将它们混合在一起。因此,你给我的C代码有点神秘,但我会尝试去学习它。问题是,函数ioctl.keepalive()在失败的情况下抛出异常吗? – paulp

+0

是的,你的链接中定义了一个OSError https://msdn.microsoft.com/en-us/library/dd877220%28v=vs.85%29.aspx – rawinput

+0

再次感谢队友! – paulp