簡體   English   中英

嘗試在Windows上使用Python 3中的套接字時出現Winsock錯誤10014

[英]Winsock error 10014 when trying to use a socket in Python 3 on Windows

有問題的代碼部分大致如下:

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擴展,它返回我機器上一個打開套接字的地址(作為一個長整數)。

前兩行似乎運行良好,並且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套接字(也可能是支持OS SOCKET ),所以我不知道破碎的指針地址會來自何處。

我相信從我的自定義模塊提供給Python的套接字地址是正確的,並且它返回的套接字地址是有效的,因為擴展與我的舊Python版本完美配合。

當我轉向更新版本的Python(3.6.5)時,這個問題就開始了 - 關於為什么這個新版本會這樣做的任何想法? 以前的工作版本是Python 1.5.2(是的,真的)。

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

從用於socket.socket構造函數的Python 3 Docs

如果指定了fileno,則忽略其他參數,從而返回具有指定文件描述符的套接字。

也許這對文檔的作者來說是顯而易見的,但看起來這只有在與你傳入的fileno關聯的套接字是由Python創建的時候才有效。 如果您嘗試連接到由擴展模塊打開的套接字,那么Python將使用您提供的fileno創建一個socket對象,但其他套接字屬性(類型,系列,協議)將設置為其默認值。

在這種情況下,套接字是IPv6套接字,但Python套接字的默認值是IPv4。 手動指定套接字類型和系列解決了該問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM