【发布时间】:2012-03-15 07:55:22
【问题描述】:
我正在尝试使用 Python 实现 Window 套接字。
到目前为止,所有问题都已使用 ctypes.windll.ws2_32 和 pywin32 lib 解决。
但是,我一直无法找到如何将以下 C++ 代码翻译成 Python,我想知道是否有人愿意提供帮助:
LRESULT WINAPI AsyncSocketProc(
__in HWND hwnd,
__in UINT uMsg,
__in WPARAM wParam,
__in LPARAM lParam
)
switch(uMsg) {
case WM_CREATE:
//...
case WM_SOCKET: {# this is basically an int constant
switch(WSAGETSELECTEVENT(lParam)){
case FD_ACCEPT:
//accepting new conn
case FD_READ:
//receiving data
}
}
}
在上面的代码中,我找不到 WSAGETSELECTEVENT 的 Python 等效项。
对于 FD_ACCEPT、FD_READ,我可以在 win32file 包(pywin32 lib)中找到它们
最后,我尝试实现这个窗口套接字编程的原因是窗口套接字服务器的 C++ 版本(上图)对于我的应用程序是非阻塞的,但 Python 的内置 select.select 是阻塞的.所以我想看看我是否可以将 C++ 版本移植到 Python 并查看它是否有效。
编辑: 我想澄清一下,套接字服务器作为现有 C++ 程序的“插件”工作,它不支持线程。
套接字服务器需要(无限期地)等待客户端连接,因此它需要不断地监听。 因此,使用普通的 Python 套接字或 select.select 将需要一个 while 循环(否则它如何充当服务器不断侦听事件?请纠正我我错了),这将阻止主程序。
不知何故,使用上面的Window Socket服务器回调,主程序没有被阻塞。这是我尝试将其移植到 Python 的主要原因。
套接字服务器最好用 Python 编写,因为服务器需要的许多相关库都是用 Python 编写的。
非常感谢。
【问题讨论】:
-
如果你对
select.select使用零超时,那么它不会阻塞。 -
@JoachimPileborg 谢谢:这将使选择不会阻塞。但是,出于我的目的,服务器仍然会阻塞主程序,因为我们需要在 select.select 之外有一个 while 循环。我已经编辑了我的问题以澄清我的目的。谢谢。
标签: python sockets window ctypes pywin32