Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Windows7下运行的Python2.5中设置保持活动计时器_Python_Sockets_Winapi_Keep Alive - Fatal编程技术网

如何在Windows7下运行的Python2.5中设置保持活动计时器

如何在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

我需要一些帮助。我正在开发一个在Windows7上运行的使用python 2.5.4的遗留软件,我需要在套接字连接中启用keepalives

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

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,并且()表示元组。