在Windows上尝试使用Python 3中的套接字时出现Winsock错误10014

2024-09-30 14:35:49 发布

您现在位置:Python中文网/ 问答频道 /正文

有问题的代码部分大致如下:

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会引发以下异常:

^{pr2}$

由于我让Python同时构造Python套接字(大概还有后备操作系统SOCKET),我不知道损坏的指针地址来自何处。在

我非常确信从我的自定义模块提供给Python的套接字地址是正确的,并且它返回的套接字地址是有效的,因为扩展与我的旧Python版本完美地配合。在

这个问题是在我迁移到Python(3.6.5)的最新版本时开始的——对于这个新版本为什么会这样做有什么想法吗? 上一个工作版本是python1.5.2(是的,真的)。在

(操作系统是Microsoft Windows 8.1 64,Python 3.6.5,使用MSVCC v.1911构建)


Tags: 对象代码import版本getaddressmy地址
1条回答
网友
1楼 · 发布于 2024-09-30 14:35:49

socket.socket构造函数的Python 3 Docs中:

If fileno is specified, the other arguments are ignored, causing the socket with the specified file descriptor to return.

也许这对文档的作者来说是显而易见的,但似乎只有当与您传入的fileno相关联的套接字是由Python创建的时,这才有效。如果您试图连接到一个由扩展模块打开的套接字,那么Python将使用您提供的fileno创建一个socket对象,但其他套接字属性(类型、族、协议)将设置为其默认值。在

在本例中,套接字是IPv6套接字,但Python套接字的默认值是IPv4。手动指定套接字类型和族解决了此问题。在

相关问题 更多 >