c recv() liest bis zum newline-Auftritt

Dem ich arbeite, schreiben einen IRC-bot in C, und lief in einen Haken.

In meiner main-Funktion Erzeuge ich meine Buchse und verbinden alle, die gerne Sachen. Dann habe ich eine (fast) unendliche Schleife zu Lesen, was gesendet wird wieder vom server. Ich gebe dann was Lesen Sie aus, um eine Hilfsfunktion, processLine(char *line) - das problem ist, dass der folgende code liest, bis mein Puffer voll ist - ich will es nur text Lesen, bis ein newline (\n) oder carriage return (\r) Auftritt (also Ende der Zeile),

   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);
    }

Was am Ende passiert, ist, dass viele Linien eingeklemmt werden alle zusammen, und ich kann nicht verarbeiten, die Zeilen richtig, wenn das passiert.

Wenn Sie nicht vertraut mit IRC-Protokollen, eine kurze Zusammenfassung wäre, dass, wenn eine Nachricht gesendet wird, ist es oft sieht wie folgt aus: :YourNickName!YourIdent@YourHostName PRIVMSG #someChannel :The rest on from here is the message sent...
und ein login-beachten Sie, zum Beispiel, ist so etwas wie dieses: :the.hostname.of.the.server ### bla some text bla mit ### als code(?) verwendet für die Verarbeitung - D. H. 372 ist ein Indikator, dass der folgende text ist Teil der Nachricht Des Tages.

Wenn es alle zusammengestaucht, ich kann nicht Lesen, was Zahl ist, für welche Linie kann ich da nicht finden, wo Sie eine Linie beginnt oder endet!

Ich würde schätzen, Hilfe bei diesem sehr viel!

P. S.: Dieser wird kompiliert/lief auf linux, aber ich will schließlich die Portierung auf windows, so bin ich so viel davon wie ich kann multi-Plattform.

P. S. S.: Hier ist meine processLine () - code:

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");
    }
}
InformationsquelleAutor FurryHead | 2011-05-22
Schreibe einen Kommentar