我使用here中的代碼測試UDP衝孔。它適用於Linux,但在Windows上報告錯誤。這裏就是發生錯誤的代碼片段:Windows上的python select.select()
while True:
rfds, _, _ = select([0, sockfd], [], []) # sockfd is a socket
if 0 in rfds:
data = sys.stdin.readline()
if not data:
break
sockfd.sendto(data, target)
elif sockfd in rfds:
data, addr = sockfd.recvfrom(1024)
sys.stdout.write(data)
和錯誤信息:
Traceback (most recent call last):
File "udp_punch_client.py", line 64, in <module>
main()
File "udp_punch_client.py", line 50, in main
rfds, _, _ = select([0, sockfd], [], [])
select.error: (10038, '')
我知道這個錯誤有一些事情與select
實現在Windows上,每個人都引用這一點:
注意 Windows上的文件對象是不可接受的,但套接字是。在Windows的 上,底層select()函數由WinSock 庫提供,並且不處理WinSock中不產生 的文件描述符。
所以,我有兩個問題:
- 是什麼
0
在[0, sockfd]
是什麼意思?這是一種經常使用的技術嗎? - 如果
select
只適用於Windows的socket
,如何使代碼與Windows兼容?
謝謝。
'0'是'stdin'的'fd'。 [文件描述符](http://en.wikipedia.org/wiki/File_descriptor) – tmr232
@ tmr232任何想法如何修改代碼? – laike9m
@ J.F.Sebastian好吧 – laike9m