为啥我会收到错误的文件描述符错误?

Posted

技术标签:

【中文标题】为啥我会收到错误的文件描述符错误?【英文标题】:why do i get a bad file descriptor error?为什么我会收到错误的文件描述符错误? 【发布时间】:2016-08-26 06:28:35 【问题描述】:

我为我制作的 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

谁能告诉我我是怎么得到这个错误的以及如何解决它?

【问题讨论】:

【参考方案1】:

您收到此错误是因为您 close 套接字然后再次调用 recvfrom

如果您在 recvfrom 行之后添加 print,您会注意到对 recvfrom 的第一次调用按预期工作。第二次调用(循环一次后)抛出您看到的错误。

只需删除 s.close() 即可修复您的代码。 (你不需要关闭与客户端的连接,因为 UDP 没有这个概念,如果你有这个概念,与 TCP 形成对比。)

【讨论】:

【参考方案2】:

如果你有一个无限的while循环,你会得到同样的错误。就我而言,我更换了

while True:

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

【讨论】:

但是如果你想要一个无限的while循环呢? 这将如何导致错误?我已经编写了很多依赖无限循环运行直到发生某些事情的程序,但我从未遇到过这样的问题。

以上是关于为啥我会收到错误的文件描述符错误?的主要内容,如果未能解决你的问题,请参考以下文章

错误系统:9:错误的文件描述符(BOOST::FileSystem)

如果 Sql Compact 允许多个连接,为啥我会收到文件共享错误?

当文件中明确指定 executionRoleArn 时,为啥我会收到关于未指定的错误?

错误的文件描述符 - Heroku Foreman

Python:使用套接字库创建的 IRC 机器人返回错误“错误文件描述符”

为啥我会收到 Laravel Composer 解析错误?