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 机器人返回错误“错误文件描述符”的主要内容,如果未能解决你的问题,请参考以下文章

iOS 中的 IRC /TOPIC 命令修剪问题

Twisted Python IRC bot - 如何异步执行函数以便它不会阻塞机器人?

如何仅使用套接字库通过 Python 正确发送 HTTP 响应?

VC++ Winsock2 错误 10049。尝试构建 IRC 机器人

Python 套接字库认为套接字在未打开时已打开

Python/Twisted IRC 机器人日志记录问题