代码中有问题的部分大致如下:
import socket, my_custom_socket_address_getting_module
underlyingSocketFileno = my_custom_socket_address_getting_module.get()
connectedSocket = socket.socket( fileno=underlyingSocketFileno )
clientAddress = connectedSocket.getpeername()
其中"my_custom_socket_address_getting_module“是一个自定义的C扩展,它返回我的机器上打开的套接字的地址(作为long)。
前两行似乎运行良好,Python对象看起来很合理(例如,fd
和其他套接字属性在调试器中看起来是正确的),但是尝试在对象上调用getpeername
会引发以下异常:
<class 'OSError'>:[WinError 10014] The system detected an invalid pointer address in attempting to use a pointer argument in a call
由于我让Python同时构建Python (可能还有后台操作系统SOCKET
),所以我不知道断指针地址来自何处。
我非常确信从我的自定义模块提供给Python的套接字地址是正确的,并且它返回的套接字地址是有效的,因为扩展与我的旧Python版本完美地工作。
这个问题是在我转向一个更新的Python版本(3.6.5)时开始的--对于为什么这个新版本会是这样的,有什么想法吗?上一个工作版本是Python1.5.2(是的,真的)。
(操作系统是Microsoft Windows 8.1 64,Python 3.6.5,用MSVCC v.1911构建)
发布于 2018-04-25 04:41:02
来自Python 3文档的socket.socket
构造函数:
如果指定了fileno,则忽略其他参数,从而返回具有指定文件描述符的套接字。
也许这对文档的作者来说是显而易见的,但这似乎只有在您传入的fileno
相关的套接字是由Python创建的情况下才能起作用。如果您试图连接到由扩展模块打开的套接字,那么Python将使用您给它的socket
创建一个fileno
对象,但是其他的套接字属性(类型、家庭、协议)将被设置为默认值。
在这种情况下,套接字是一个IPv6套接字,但是IPv4套接字的缺省值是IPv4。手动指定套接字类型和系列解决了这个问题。
https://stackoverflow.com/questions/49918525
复制