我在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;
}
}
答案 0 :(得分:1)
您忘记实施IRC协议。
您的代码假定每次调用TCP连接的recv
函数都会返回一条IRC消息。这种假设完全无效。 TCP实现不知道IRC消息是什么。如果要计算已收到的消息数,则必须实现IRC协议和IRC协议的消息定义。