我正在尝试制作一个IRC机器人,但它在240秒后超时。我该如何解决这个问题呢?
import socket
host = 'test'
port = 6667
channel = '#test'
nick = "test"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
s.send('NICK ' + str(nick) + ' \n\r')
s.send('USER v v v :v Script' + '\r\n')
s.send('JOIN '+channel+' \n\r')
while True:
command = s.recv(4096)
print command发布于 2012-06-03 13:57:59
您没有回复来自服务器的ping请求。
当您长时间空闲时,服务器认为连接已死,并发送一个ping请求,您需要使用pong进行回复(以及ping之后服务器发送给您的任何内容)。所以,如果服务器给你发了这个,那应该是你的回复:
PING :HELLO_WORLD
PONG :HELLO_WORLD否则,服务器将确认链路已断开并终止连接。
发布于 2012-06-03 13:40:14
您可以尝试使用irclib-但是,最有可能发生的情况是,您没有回复服务器的PING消息。
每当收到以"PING“开头的消息时,您必须使用包含单词PONG和您的程序名称(以及可选的主机)的"PONG”消息进行回复-在"PONG“后面留一个空格。
检查PING和PONG消息的完整IRC规范,并查看您在实验过程中可能遗漏的其他内容:http://www.irchelp.org/irchelp/rfc/rfc.html
发布于 2021-10-16 00:19:35
我的问题是,我甚至不能可靠地接收来自IRC服务器的PING数据包。我通过在套接字级别添加keepalives修复了这个问题:
# enable keepalives at the socket (SOL_SOCKET) level
self.client.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
# after 1 second of TCP inactivity, trigger keepalive pings
self.client.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 1)
# send a keepalive ping every 60 seconds
self.client.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, 60)
# quit after 5 consecutive failures
self.client.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, 5)这一点,再加上为每个PING发回一个PONG,使我的连接保持更长时间。
https://stackoverflow.com/questions/10867992
复制相似问题