如何在Windows7下运行的Python2.5中设置保持活动计时器
我需要一些帮助。我正在开发一个在Windows7上运行的使用python 2.5.4的遗留软件,我需要在套接字连接中启用keepalives 我在下面的线程中看到,您可以使用如何在Windows7下运行的Python2.5中设置保持活动计时器,python,sockets,winapi,keep-alive,Python,Sockets,Winapi,Keep Alive,我需要一些帮助。我正在开发一个在Windows7上运行的使用python 2.5.4的遗留软件,我需要在套接字连接中启用keepalives 我在下面的线程中看到,您可以使用 object.setsockopt( socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) 但是,此设置使用默认的windows保持活动计时器2小时 我还看到,我们可以使用以下API设置计时器,但是它仅适用于Python2.6以后的版本 sock.ioctl(socket.SIO_KEEP
object.setsockopt( socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
但是,此设置使用默认的windows保持活动计时器2小时
我还看到,我们可以使用以下API设置计时器,但是它仅适用于Python2.6以后的版本
sock.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 10000, 3000))
我是否可以使用Python2.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
);
谢谢你的帮助
参考资料:
以下是如何在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);
}
我在为Python2.5编译的github中做了一个小的python扩展您可以从Python2.6中向后移植该函数,或者使用Ctypes调用该函数。Hi@cgohlke,谢谢您的建议。然而,我以前没有真正尝试过将C/C++与Python混合使用。我会开始调查的。如果您对推荐人有任何建议,我们将不胜感激。非常感谢。非常感谢您的投入。非常感谢。我试过了,API工作得很好(返回时没有错误)。我精通C/C++和Python,但是,我还没有真正尝试将它们混合在一起。因此,你给我的C代码有点神秘,但我会努力学习。不过,一个问题是,如果函数ioctl.keepalive()失败,它是否会引发异常?是的,链接中定义了一个操作错误,再次感谢mate!您好@rawinput,我花了一些时间研究如何将C链接到python中。你能帮我解释一下PyArg_ParseTuple()如何解释格式“O(kkk):keepalive”吗?谢谢。您好阅读本文,您可以看到O是python对象到c Pyobject,k是python整数或long整数到c usigned long,并且()表示元组。