2

我正在尝试制作一个 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
4

3 回答 3

5

您没有回复来自服务器的 ping 请求。

当您长时间空闲时,服务器认为连接已死,并发送ping请求,您需要回复pong(以及ping后服务器发送给您的任何内容)。所以如果服务器发给你这个,那应该是你的回复:

PING :HELLO_WORLD
PONG :HELLO_WORLD

否则,服务器将确认链接已失效并终止连接。

于 2012-06-03T05:57:59.493 回答
1

您可以尝试使用 irclib - 但是发生的情况很可能是您没有回复服务器的 PING 消息。

每当收到的消息以“PING”开头时,您必须用包含单词 PONG 和您的程序名称(以及可选的主机)的“PONG”消息回复它 - 在“PONG”之后留一个空格。

检查 PING 和 PONG 消息的完整 IRC 规范,并查看您的实验中可能缺少的其他内容:http ://www.irchelp.org/irchelp/rfc/rfc.html

于 2012-06-03T05:40:14.323 回答
0

我的问题是我什至没有可靠地从 IRC 服务器接收 PING 数据包。我通过在套接字级别添加keepalive来修复它:

    # 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,我的连接打开时间更长。

于 2021-10-16T00:19:35.363 回答