有问题的代码部分大致如下:
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
会引发以下异常:
由于我让Python同时构造Python套接字(大概还有后备操作系统SOCKET
),我不知道损坏的指针地址来自何处。在
我非常确信从我的自定义模块提供给Python的套接字地址是正确的,并且它返回的套接字地址是有效的,因为扩展与我的旧Python版本完美地配合。在
这个问题是在我迁移到Python(3.6.5)的最新版本时开始的——对于这个新版本为什么会这样做有什么想法吗? 上一个工作版本是python1.5.2(是的,真的)。在
(操作系统是Microsoft Windows 8.1 64,Python 3.6.5,使用MSVCC v.1911构建)
从
socket.socket
构造函数的Python 3 Docs中:也许这对文档的作者来说是显而易见的,但似乎只有当与您传入的
fileno
相关联的套接字是由Python创建的时,这才有效。如果您试图连接到一个由扩展模块打开的套接字,那么Python将使用您提供的fileno
创建一个socket
对象,但其他套接字属性(类型、族、协议)将设置为其默认值。在在本例中,套接字是IPv6套接字,但Python套接字的默认值是IPv4。手动指定套接字类型和族解决了此问题。在
相关问题 更多 >
编程相关推荐