连接到 IRC 服务器的问题

Posted

技术标签:

【中文标题】连接到 IRC 服务器的问题【英文标题】:Issue connecting to IRC Server 【发布时间】:2015-04-05 13:47:30 【问题描述】:

最近一直致力于创建 IRC 机器人,虽然它似乎可以连接并与大多数 IRC 服务器一起工作,但 Twitch IRC 服务器 (irc.twitch.tv) 似乎存在问题。

连接到另一台服务器时,可以毫无问题地接收和发送数据,但是使用 twitch 连接时,我无法发送或接收数据。

初始化:

Connection::Connection(char* server, int port, std::string nick, std::string pass)

    fServer = server;
    fPort = port;
    fNick = nick;
    fPass = pass;
    fChanCount = 0;

    clear_buffer();

    fSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    cout << "Attempting to resolve host: " << fServer << endl;
    fHost = resolve_host(fServer);
    fSaddr.sin_addr.S_un.S_addr = fHost;
    fSaddr.sin_port = htons(fPort);
    fSaddr.sin_family = AF_INET;

    cout << "Resolved to: " << fHost << endl;

打开连接:

int Connection::Connect()

    if (connect(fSock, (sockaddr*)&fSaddr, sizeof(fSaddr)) == SOCKET_ERROR)
    
        cout << "Can't connect to " << fServer << endl;
        return 0;
    

    recv(fSock, fBuffer, 1024 * 8, 0);

    cout << fBuffer << endl << endl << flush;

    send_message("PASS " + fPass);
    send_message("NICK " + fNick);
    send_message("USER " + fNick + " 0 * :" + fNick);

    return 1;

清除缓冲区:

void Connection::clear_buffer()

    memset(fBuffer, 0, sizeof(fBuffer));

接收:

string Connection::receive_message()

    clear_buffer();

    recv(fSock, fBuffer, 1024 * 8, 0);

    return fBuffer;

完全不知道是什么原因造成的,如果需要可以提供更多细节。

【问题讨论】:

fPass 是空的吗? IIRC 一些 IRC 服务器要求 PASS 包含某些内容,即使服务器不需要密码。在这种情况下,我已将“无”作为密码。 我通过密码的方式和其他的一样。 您使用的是真实密码还是 OAuth 令牌? 【参考方案1】:

您的 USER 消息看起来不像 RFC2812 规范要求的那样。

3.1.3 User message

      Command: USER
   Parameters: <user> <mode> <unused> <realname>

   The USER command is used at the beginning of connection to specify
   the username, hostname and realname of a new user.

   The <mode> parameter should be a numeric, and can be used to
   automatically set user modes when registering with the server.  This
   parameter is a bitmask, with only 2 bits having any signification: if
   the bit 2 is set, the user mode 'w' will be set and if the bit 3 is
   set, the user mode 'i' will be set.  (See Section 3.1.5 "User
   Modes").

   The <realname> may contain space characters.

   Numeric Replies:

           ERR_NEEDMOREPARAMS              ERR_ALREADYREGISTRED

   Example:

   USER guest 0 * :Ronnie Reagan   ; User registering themselves with a
                                   username of "guest" and real name
                                   "Ronnie Reagan".

   USER guest 8 * :Ronnie Reagan   ; User registering themselves with a
                                   username of "guest" and real name
                                   "Ronnie Reagan", and asking to be set
                                   invisible.

也许这就是导致问题的原因?

否则我发现某些服务器在PASS 消息中需要密码,即使服务器未配置为需要密码。在这些情况下,我发送:

PASS none

【讨论】:

我以与服务器/端口/用户相同的方式传递密码,所以我认为这不是问题。我还尝试更改 USER 消息以符合 RFC2812 标准,但仍然没有成功。 @user3815037 你的clear_buffer() 函数是否用零填充缓冲区?您是否还考虑到行尾是 LFCR ("\r\n")? clear_buffer() 只是在缓冲区上调用 memset() 并用零填充它。至于发送消息,它确实在末尾附加了“\r\n”。它似乎在其他 IRC 服务器上运行良好,但不是 irc.twitch.tv。

以上是关于连接到 IRC 服务器的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在 IRC 服务器中发送消息聊天?

我如何在 python 中编写一个简单的 IRC 机器人?

连接到 IRC 时的套接字问题

连接到 Twitch IRC 聊天

什么是 IRC?

IRC 协议 - 使用密码注册到服务器