Я работаю над написанием 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: Остальное - это отправленное сообщение. ..
и уведомление о входе, например, выглядит примерно так: : имя хоста.сервера ### bla какой-то текст bla
с ### кодом (?), используемым для обработки - то есть 372 - это индикатор того, что следующий текст является частью Послания дня.
Когда все они собраны вместе, я не могу прочитать, какой номер для какой строки, потому что я не могу найти, где строка начинается или заканчивается !
Я был бы очень признателен за помощь с этим!
PS: Это компилируется / запускается на linux, но в конечном итоге я хочу перенести его на Windows, поэтому я делаю столько, сколько могу multi -platform.
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");
}
}