Python:使用套接字库创建的 IRC 机器人返回错误“错误文件描述符”
Posted
技术标签:
【中文标题】Python:使用套接字库创建的 IRC 机器人返回错误“错误文件描述符”【英文标题】:Python: IRC bot made with socket library returning error "Bad file descriptor" 【发布时间】:2021-08-31 23:13:55 【问题描述】:我一直在尝试编写一个 IRC 机器人,但是当我尝试向它发送命令时,我收到了错误“错误的文件描述符”,这很难解决,我无法弄清楚为什么会这样,我的代码对我来说看起来不错;有谁知道它可能有什么问题吗?
以下是导致我出现问题的代码部分。
import socket, random
server = "irc.example.com"
def main(nummessages, channel, message)
ircsock.connect((server, 6697))
for i in range (nummessages):
with open('cookies.txt', 'r') as info:
channel = f'#channel'
info = info.read().splitlines()
info = random.choice(info)
info = info.split(':')
token = info[1]
username = info[0]
nick = username
ircsock.send(bytes('NICK' + ' ' + username + '\n', 'UTF-8'))
ircsock.send(bytes('PASS' + ' oauth:' + token + '\n', 'UTF-8'))
ircsock.send(bytes('JOIN' + ' ' + channel + '\n', 'UTF-8'))
ircsock.send(bytes('PRIVMSG ' + channel + ' :' + message + '\r\n', 'UTF-8'))
ircsock.send(bytes('PART' + ' ' + channel + '\n', 'UTF-8'))
ircsock.send(bytes('QUIT' + ':Bye' + '\n', 'UTF-8'))
ircsock.shutdown(socket.SHUT_RDWR)
ircsock.close()
test1 = 1
test2 = "test"
test3 = "test"
def main(test1, test2, test3)
【问题讨论】:
粘贴格式正确、有效的代码并提供回溯真的很有帮助。此代码有语法错误。制作minimal reproducible example。cookies.txt
的内容是什么?提供准确最小代码(剪切-粘贴测试代码!)以重现错误。
很难按原样回答,但您确实在 for 循环中关闭了 ircsock
。下一个循环会发生什么(假设您实际上在某处正确打开了套接字)?
请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。
【参考方案1】:
当您尝试使用已关闭的文件/套接字/等时,可能会出现“错误的文件描述符”。
您的代码根本不起作用,但我假设您在为问题编辑它时破坏了它。很明显,你在循环外创建了一个套接字,在循环外连接它,然后你重复几次发送一些消息并关闭它。
所以你的程序打开套接字,连接套接字,发送消息,关闭套接字,发送更多消息,关闭套接字,发送更多消息,关闭套接字,......我希望你可能会尝试的原因很明显使用封闭的套接字。
如果你想要一个新的套接字连接,那么你每次想要一个新的连接时都必须connect
,而且你还需要一个新的套接字。每个套接字只能使用一次 - 你不能关闭它然后重新连接它 - 你必须关闭它并创建一个新的。
【讨论】:
以上是关于Python:使用套接字库创建的 IRC 机器人返回错误“错误文件描述符”的主要内容,如果未能解决你的问题,请参考以下文章
Twisted Python IRC bot - 如何异步执行函数以便它不会阻塞机器人?
如何仅使用套接字库通过 Python 正确发送 HTTP 响应?