Я работаю над написанием IRC-бота на C и наткнулся на загадку.
В своей основной функции я создаю свой сокет и подключаю, все эти приятные вещи.Затем у меня есть (почти) бесконечный цикл для чтения того, что отправляется обратно с сервера.Затем я передаю прочитанное вспомогательной функции 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");
}
}