2016-11-24 3 views
1

私はいくつかの助けが必要です。私はPython 2.5.4をWindows7上で動作させるレガシーソフトウェアを開発しています。ソケット接続でキープアライブを有効にする必要があります。私はあなたがWindows 7で動作するPython 2.5でキープアライブタイマーを設定するには

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

使ってPythonでのキープアライブを有効にすることができ、その下のスレッドで見てきた

ただし、この設定はデフォルトのウィンドウが2時間のアライブタイマーを維持し使用しています。

次のAPIを使用してタイマーを設定できることもわかりましたが、Python 2.6以降でのみ使用できます。

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

とにかく私はこのSIO_KEEPALIVE_VALSをpython 2.5.4で設定できますか?私が持っているレガシーコードには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

あなたは可能性があるためにコンパイルgithubのhttps://github.com/rawinput/ioctlの小さなPython拡張を作っ

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、あなたの提案に感謝します。しかし、以前はPythonでC/C++を混ぜ合わせてみたことはありませんでした。私はそれを調べ始めるでしょう。あなたが良い参考に何か提案があれば、それは非常に高く評価されるでしょう。どうもありがとう。 – paulp

答えて

1

あなたは私のpython 2.5

+0

これは大変ありがとうございます。心から感謝する。私はそれを試して、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

関連する問題