首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在WindowsPython3中尝试使用套接字时出现的Winsock错误10014

在WindowsPython3中尝试使用套接字时出现的Winsock错误10014
EN

Stack Overflow用户
提问于 2018-04-19 10:16:01
回答 1查看 871关注 0票数 3

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

代码语言:javascript
代码运行次数:0
运行
复制
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会引发以下异常:

代码语言:javascript
代码运行次数:0
运行
复制
<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构建)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-25 12:41:02

来自Python 3文档socket.socket构造函数:

如果指定了fileno,则忽略其他参数,从而返回具有指定文件描述符的套接字。

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

在这种情况下,套接字是一个IPv6套接字,但是IPv4套接字的缺省值是IPv4。手动指定套接字类型和系列解决了这个问题。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49918525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档