为什么会出现“bad file descriptor”错误?

6

我制作的UDP服务器程序出现了“坏文件描述符”的错误。

from socket import *

s = socket(AF_INET, SOCK_DGRAM)
s.bind(('', 890))

while True:
   (c,a) = s.recvfrom(1024)
   msg = 'thanks for requesting'
   s.sendto(msg,a)
   s.close()

我获得的错误消息是:
Traceback (most recent call last):
File "udpserv.py", line 7, in <module>
(c,a) = s.recvfrom(1024)
 File "/usr/lib/python2.7/socket.py", line 174, in _dummy
raise error(EBADF, 'Bad file descriptor')
socket.error: [Errno 9] Bad file descriptor

请问有人能告诉我这个错误是怎么发生的以及如何解决吗?

2个回答

9
您之所以会出现这个错误,是因为您在调用recvfrom后关闭了socket,然后再次调用recvfrom
如果您在recvfrom的那一行后添加一个print,您会注意到第一次调用recvfrom如预期一样工作。第二次调用(循环一次后)会抛出您看到的错误。
通过简单地删除s.close()来修复您的代码。(您不需要关闭与客户端的连接,因为UDP没有这个概念,与TCP相反,如果您考虑到了这一点。)

1
你可能会因为无限循环而遇到同样的错误。在我的情况下,我替换了


while True:

带有。
count = 0
while (count < 10):
    count += 1
    #rest of the code

但是如果你想要一个无限的while循环呢? - Lizzard
这会导致什么错误?我写了很多依赖于无限循环直到某些事件发生的程序,但我从未遇到过这样的问题。 - Awesomepotato29

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接