【发布时间】:2014-04-10 16:50:34
【问题描述】:
我正在使用来自here 的代码测试 UDP 冲孔。它适用于 Linux,但在 Windows 上报告错误。这是发生错误的代码sn-p:
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, '')
我知道这个错误与 Windows 上的 select 实现有关,每个人都引用这个:
注意 Windows 上的文件对象是不可接受的,但套接字是。在 Windows,底层的 select() 函数由 WinSock 提供 库,并且不处理不是源自的文件描述符 来自 WinSock。
所以我有两个问题:
-
[0, sockfd]中的0是什么意思?这是某种常用的技术吗? - 如果
select在Windows上只能和socket一起工作,如何使代码与Windows兼容?
谢谢。
【问题讨论】:
-
0是fd的stdin。 File Descriptors -
@tmr232 知道如何修改代码吗?
-
@J.F.Sebastian 好的
标签: python windows sockets select