c ++ irc​​ bot只接收一次数据

时间:2015-08-28 17:40:04

标签: c++

我在C ++中创建一个简单的IRC机器人,但我遇到了一些我似乎无法解决的问题。我的代码基于Beej's Networking Guide

我还使用了code来尝试修复我的问题。

main.cpp片段

        // as long we don't lose connection, keep receiving data
        while(true) {
            num_receives++;

            if(num_receives == 3) {
                snd("NICK q1w2\r\n");
                            snd("USER q1w2 0 * :q\r\n");
            }

            if(num_receives == 4) {
                snd("JOIN q1w2\r\n");
            }

            num_bytes = recv(s, buf, MAXDATASIZE-1, 0);
            buf[num_bytes]='\0';

            std::cout << num_receives << "\t" << buf;   

            if(num_bytes == -1) {
                            perror("ERROR receiving");
                            break;
                    } 
            if(num_bytes == 0) {
                            perror("DISCONNECTED");
                break;
                    }
        }

输出是(第一行是运行机器人的命令)

~$ ./bot irc.snt.utwente.nl 6667 

1   :irc.snt.utwente.nl 020 * :Please wait while we process your connection.
2   ERROR :Closing Link: [unknown@91.177.66.186] (Ping timeout)
DISCONNECTED: Network is unreachable

所以,问题是它只接收一次数据。即使它被放置在while循环中。我真的不知道是什么阻止它循环或接收。如果我在while循环中放置一个 cout ,你可以看到它在断开连接时只循环一次,最后一次。

编辑:我有它的工作。发送到服务器的命令应该放在while循环之外。因为它在循环内等待初始化。但由于我们没有收到任何东西,因此我们也没有发送任何内容。

[正确] main.cpp片段

        snd("NICK q1w2\r\n");
        snd("USER q1w2 0 * :q\r\n");
        snd("JOIN q1w2\r\n");

        // as long we don't lose connection, keep receiving data
        while(true) {
            num_receives++;

            num_bytes = recv(s, buf, MAXDATASIZE-1, 0);
            buf[num_bytes]='\0';

            std::cout << num_receives << "\t" << buf;   

            if(num_bytes == -1) {
                            perror("ERROR receiving");
                            break;
                    } 
            if(num_bytes == 0) {
                            perror("DISCONNECTED");
                break;
                    }
        }

1 个答案:

答案 0 :(得分:1)

您忘记实施IRC协议。

您的代码假定每次调用TCP连接的recv函数都会返回一条IRC消息。这种假设完全无效。 TCP实现不知道IRC消息是什么。如果要计算已收到的消息数,则必须实现IRC协议和IRC协议的消息定义。