2016-11-24 6 views
1

도움이 필요합니다. Windows7에서 실행되는 Python 2.5.4를 사용하는 레거시 소프트웨어에서 작업 중이며 소켓 연결에서 킵 얼라이브를 활성화해야합니다. 난 당신이Windows 7에서 실행중인 Python 2.5에서 keep-alive 타이머를 설정하는 방법

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

사용하여 파이썬에서 킵 얼라이브을 가능하게 할 수 아래의 스레드에서 본 적이

그러나이 설정은 기본 창 2 시간의 살아 타이머를 계속 사용합니다.

다음 API를 사용하여 타이머를 설정할 수도 있지만 Python 2.6 이상에서만 사용할 수 있습니다.

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

어쨌든 나는이 SIO_KEEPALIVE_VALS를 (를) python 2.5.4를 사용하여 설정할 수 있습니까? 레거시 코드에는 pywin32-214 모듈도 있습니다. 정말 파이썬 버전을 업그레이드 할 수 없습니다.

은 또한 당신의 도움에 대한 방법 python2.6과 새로운 호출 윈도우 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

당신은 할 수 컴파일 GitHub의 https://github.com/rawinput/ioctl의 작은 파이썬 확장했다

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); } 

C에서 그것을 할 방법입니다 백 포커스 [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++를 혼합 시키려고하지 않았다. 나는 그것을 조사하기 시작할 것이다. 좋은 참고 자료에 대한 제안 사항이 있으면 많은 도움이 될 것입니다. 많은 감사. – paulp

답변

1

당신은 내가 파이썬 2.5

+0

대단히 감사합니다. @rawinput. 정말 감사합니다. 나는 그것을 시도하고 API는 매력 (오류없이 반환)처럼 작동합니다. 저는 C/C++과 Python에 대해 잘 알고 있습니다 만, 실제로 함께 섞어 보려고하지 않았습니다. 그러므로 여러분이 저에게 준 C 코드는 약간의 수수께끼이지만 그것을 배우려고합니다. 그래도 문제가 생기면 ioctl.keepalive() 함수가 예외를 throw합니까? – paulp

+0

링크에 정의 된 OSError가있는 경우 https://msdn.microsoft.com/en-us/library/dd877220%28v=vs.85%29.aspx – rawinput

+0

다시 한 번 감사의 말을 전합니다. – paulp