Zeichen Ketten durchsuchen, und das ohne Zeiger als Ergebniss?



  • Hi zu allen,
    ich spiele in letzter Zeit ein bisschen mit Sockets rum. Wie auch immer ich schreibe grade ein kleinen HTTP Server (ich weiß Sockets sind nicht ANSI). Jetzt muss ich den Request beantworten, nun gut das müssten genügend Backgrounds sein.

    Problem Analyse:
    Der Client schickt mir (also dem Server) folgendes:
    GET /index.htm HTTP/1.1
    Host: 127.0.0.1

    Das ganze fange ich in einem Array ab. Jetzt muss ich herausfinden was der User haben möchte (er möchte gern den Inhalt von "/index.htm" + einen Antworten Header). Also entschied ich mich für folgende Lösung:
    if(abfrage[0]=='G')

    Weil es ja auch POST, HEAD etc. gibt. "GET " das sind 4 Zeichen. Gut also von abfrage[3] bis... hier setzt mein Problem an. Ich habe nach einer Funktion gesucht mit der ich Zeichenketten durchsuchen kann und habe sogar etwas gefunden. Leider ist das was ich bekomme ein Zeiger auf eine Speicherstelle. Damit kann ich leider nicht viel Anfangen.

    Frage:
    Wie kann ich das o.g. Problem möglichst Elegant Lösen?
    Ich suche am besten etwas was mir direkt einen Array Key zurückliefert.

    Antwort:

    #include <stdio.h>
    
    void extract_path (char *in, char *out)
    {
        int state = 0;
        while (*in)
        {
            switch (state)
            {
                case 0:
                if (*in == ' ')
                    state = 1;
                break;
    
                case 1:
                if (*in == ' ')
                {
                    *out = 0;
                    return;
                }
                *out++ = *in;
                break;
            }
            in++;
        }
    }
    
    int main()
    {
        char *test1 = "GET /ordner1/index.html HTTP/1.1\r\nHost: 127.0.0.1\r\n";
        char *test2 = "GET /index.html HTTP/1.1\r\nHost: 127.0.0.1\r\n";
        char path[256];
        extract_path (test1, path);
        puts (path);
        extract_path (test2, path);
        puts (path);
    }
    

    Lösungseleganz:
    70/100 P.

    danke im voraus
    MfG _D4rk_

    //EDIT: bevor einer fragt -> Die Punkte "Antwort" und "Lösungseleganz" sollen eine Übersicht für die Leute sein die durch Google oder der Forensuche diese Lösung finden.



  • Du meinst mit "Zeiger als Ergebnis" strstr()? Wie auch immer, wenn du einen Zeiger auf Element x aus Array y hast, kannst du ja den Index direkt berehchnen. Wo ist genau das Problem?



  • nimm doch einfach 'strstr', etwa so:

    ...
    if (strstr(buffer, "GET") == buffer)
    {
       // GET wurde am anfang des buffers gefunden 
    }
    else if (strstr(buffer, "POST") == buffer)
    {
       // POST wurde am anfang des buffers gefunden 
    }
    ...
    

    ...und sei froh, dass du den http-request in einem array speichern konntest.
    🙂

    edit: viel zu lahm...
    edit2: der http-request im buffer muss nullterminiert sein.



  • Tim schrieb:

    kannst du ja den Index direkt berehchnen.

    Hm, wusste gar nicht das dass ohne Probleme geht. Kannst du mir vll ein Schlagwort für Google geben. Noch besser wär (wenn du nicht zu beschäftigt bist) mir zu erklären wie das geht.

    danke im voraus
    MfG _D4rk_
    //EDIT: @Apeman ich möchte den Key von 4 bis x und nicht nur von 4 ohne bis.



  • D4rk schrieb:

    //EDIT: @Apeman ich möchte den Key von 4 bis x und nicht nur von 4 ohne bis.

    ich verstehe nicht ganz, was du meinst. was meinst du mit 'key' 😕



  • Den Array-Key/Index also -> array[HierIstEinKey]

    Bsp.
    char string[11]="Hallo Welt!";
    printf("%c", string[3]);

    Ausgabe:
    l

    string[3 <- Das ist der Key ]



  • sowas?

    #include <stdio.h>
    #include <string.h>
    
    char *req[] = {"GET", "POST", "MAMA", "PAPA"};
    
    int find_req (char *in)
    {
        int s;
        for (s=0; s<sizeof(req)/sizeof(char*); s++)
            if (strstr(in, req[s]) == in)
                return s;
        return -1;
    }
    
    void main()
    {
        char *test = "MAMA GETS POST";
        int res = find_req (test);
        if (res >= 0)
            printf ("key is: %d, strstr found: %s\n", res, req[res]);
    }
    

    😕



  • Ok, ich versuche mit meiner Frage den mittleren großen Block von Plaintext zu Source zu machen (das ist eine extrem verkürzte und Modifizierte Version meines Servers)

    #include <windows.h>
    #include <stdio.h>
    #include <string.h>
    
    int main(void)
    {
    	char answer[12500]="";
    	char buf[1024];
    
    	int runterfahren=0;
    	long rc;
    
    	/* HTTP Header Empfangen */
    	rc=recv(connectedSocket,buf,1024,0);
    	if(rc!=0 && rc!=SOCKET_ERROR)
    	{
    		buf[rc]='\0';
    		printf("%s", buf);
    	}
    
    	/* HTTP Header auswerten und verarbeiten*/
    
    	/*******************************************
    	Hier muss ich jetzt herausfinden was zwichen
    	"GET " und " HTTP" steht. Das was dazwichen
    	steht verwende ich für das öffnen der Datei und
    	lese den Inhalt der Datei in das Array
    	"pagecontent"
    	*******************************************/
    
    	/* Hier habe ich dann das ganze hingeschrieben nur das die Variable
    	   in der der Name der Angeforderten Datei immer index.html ist */
    
    }
    

    Wenn z.B. die Abfrage dies ist:
    array="GET /index.html HTTP/1.1\r\nHost: 127.0.0.1\r\n";
    Dann wäre die Antwort auf meine Frage array[3] bis array[14] also "/index.html"

    Aber die abfrage kann ja auch so sein:
    array="GET /ordner1/index.html HTTP/1.1\r\nHost: 127.0.0.1\r\n";
    in dem Fall wäre die Antwort ja array[3] bis array[22]

    MfG _D4rk_



  • probier dies:

    #include <stdio.h>
    
    void extract_path (char *in, char *out)
    {
        int state = 0;
        while (*in)
        {
            switch (state)
            {
                case 0:
                if (*in == ' ')
                    state = 1;
                break;
    
                case 1:
                if (*in == ' ')
                {
                    *out = 0;
                    return;
                }
                *out++ = *in;
                break;
            }
            in++;
        }
    }
    
    int main()
    {
        char *test1 = "GET /ordner1/index.html HTTP/1.1\r\nHost: 127.0.0.1\r\n";
        char *test2 = "GET /index.html HTTP/1.1\r\nHost: 127.0.0.1\r\n"; 
        char path[256];
        extract_path (test1, path);
        puts (path);
        extract_path (test2, path);
        puts (path);
    }
    

    die handgemachte methode. kann sein, dass es mit 'strchr' einfacher geht.
    🙂



  • he, das ist Gut, dank dir.

    MfG _D4rk_


Anmelden zum Antworten