我正在用 C 编写一个 IRC 机器人,但遇到了障碍。
在我的主要功能中,我创建了我的套接字并连接,所有这些快乐的东西。然后我有一个(几乎)无限循环来读取从服务器发回的内容。然后我将读取的内容传递给辅助函数,processLine(char *line)
- 问题是,以下代码读取直到我的缓冲区已满 - 我希望它只读取文本,直到出现换行符 (\n) 或回车符 (\r) (从而结束该行)
while (buffer[0] && buffer[1]) {
for (i=0;i<BUFSIZE;i++) buffer[i]='\0';
if (recv(sock, buffer, BUFSIZE, 0) == SOCKET_ERROR)
processError();
processLine(buffer);
}
最终发生的事情是许多线路都卡在一起了,发生这种情况时我无法正确处理线路。
如果你不熟悉 IRC 协议,一个简短的总结就是当消息发送时,它通常看起来像这样::YourNickName!YourIdent@YourHostName PRIVMSG #someChannel :The rest on from here is the message sent...
例如,登录通知是这样的::the.hostname.of.the.server ### bla some text bla
### 是一个代码(? ) 用于处理 - 即 372 指示以下文本是今日消息的一部分。
当它们全部塞在一起时,我无法读取哪一行的数字是什么,因为我找不到一行的开始或结束位置!
我非常感谢您的帮助!
PS:这是在 linux 上编译/运行的,但我最终想将它移植到 windows,所以我尽可能多地制作多平台。
PSS:这是我的 processLine() 代码:
void processLine(const char *line) {
char *buffer, *words[MAX_WORDS], *aPtr;
char response[100];
int count = 0, i;
buffer = strdup(line);
printf("BLA %s", line);
while((aPtr = strsep(&buffer, " ")) && count < MAX_WORDS)
words[count++] = aPtr;
printf("DEBUG %s\n", words[1]);
if (strcmp(words[0], "PING") == 0) {
strcpy(response, "PONG ");
strcat(response, words[1]);
sendLine(NULL, response); /* This is a custom function, basically it's a send ALL function */
} else if (strcmp(words[1], "376") == 0) { /* We got logged in, send login responses (i.e. channel joins) */
sendLine(NULL, "JOIN #cbot");
}
}