![](/img/trans.png)
[英]Python error when trying to use gnuradio/uhd in Windows
[英]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.