c recv () читать, пока не появится новая строка

Я работаю над написанием 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");
    }
}
10
задан FurryHead 22 May 2011 в 20:30
поделиться