如何在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
答
这里是你如何做到这一点在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
你可以返回[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
嗨@cgohlke,谢谢你的建议。但是,我还没有真正尝试过将C/C++与Python混合。我会开始研究它。如果您有任何关于良好参考的建议,将不胜感激。非常感谢。 – paulp