私は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");
}
}