2013-07-25 20 views
5

Używam czegoś takiego, aby utworzyć serwer przy użyciu C. Gdy przejdę do 127.0.0.1:5000 z mojej przeglądarki, widzę "Hello Worlds", ponieważ wysyłam ją jako bufor. Ale chcę, aby zadziałało 127.0.0.1:5000/filename.html. Ale nie wiem jak dostać filename że przychodzi po 127.0.0.1:5000 w C.Uzyskaj żądany adres w programowaniu gniazd za pomocą C

używam tego, aby gra:

serv_addr.sin_family = AF_INET; 
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); 
    serv_addr.sin_port = htons(5000); 

    bind(listenfd, (struct sockaddr*)&serv_addr,sizeof(serv_addr)); 

    connfd = accept(listenfd, (struct sockaddr*)NULL ,NULL); 
+0

czy wdrażasz serwer http? –

+0

Tak! Sortuj: :) – sadaf2605

+0

@ sadaf2605: Zaktualizowałem swoją odpowiedź, z jakiegoś powodu nie mogę tego komentować. – dreamlax

Odpowiedz

5

przeglądarka będzie wysyłać do serwera żądania HTTPże zawiera adres URL, który jest po. Żądanie może wyglądać następująco:

GET /filename.html HTTP/1.1 
Host: 127.0.0.1:5000 

swój program C musi przeczytać tę prośbę z gniazdka i analizowania to, aby znaleźć adres URL. Zauważ, że żądanie prawdopodobnie zawiera więcej informacji niż powyższe, ale zawsze powinno kończyć się pustą linią (abyś wiedział, gdzie przerwać parsowanie). Linie w żądaniach HTTP powinny kończyć się zarówno karetką, jak i linią ("\r\n").

Otrzymujesz dane przez to samo gniazdo, którego używasz do wysyłania danych. Kroki odczytywania żądania HTTP mogą być następujące:

  1. Deklaracja bufora o wystarczającym rozmiarze, być może 4096 bajtów lub więcej.

  2. dane wczytywane do tego bufora używając read i twoi connfd do:

    1. Wysłaliśmy 4095 bajtów (w tym przypadku serwer powinien odpowiedzieć z błędem 413)

    2. Masz napotkał znaki "\r\n\r\n" (oznacza to pustą linię)

    3. Minęło trochę czasu i żadne z powyższych nie wystąpiło. Aby wprowadzić limit czasu, musisz użyć select() lub poll().

  3. Po otrzymaniu żądania HTTP do swojego bufora, analizować go:

    1. Pierwsza linia jest prośba Linia który dyktuje sposób wniosek, URI, a numer wersji protokołu. Możliwym sposobem analizy tego wiersza jest podzielenie go za pomocą spacji.

    2. Kolejne wiersze reprezentują pola nagłówka HTTP i generalnie można je przeanalizować jako Key: Value\r\n. Te pola nagłówka zawierać pliki cookie, informacje o kliencie składającego wniosek, itp

  4. Trzeba tworzyć swoją odpowiedź HTTP również.Reakcja, gdy URI określa poprawną zasobu (takiego jak filename.html) mogą być:

    HTTP/1.1 200 OK 
    Date: Thu, 25 Jul 2013 03:55:00 GMT 
    Server: sadaf2605-server/1.0 
    Content-Type: text/html 
    Content-Length: 40595 
    
    < contents of filename.html follows here > 
    

    W powyższym Content-Length określa liczbę bajtów w pliku filename.html. Podobnie jak w przypadku żądania, odpowiedź jest oddzielana od danych za pomocą pustej linii.

+1

HTTP 1.1 jest określony w [RFC 2616] (http://www.rfc-editor.org/rfc/rfc2616. tekst). – Casey

+0

Czy możesz mi pomóc trochę więcej? Jak uzyskać/odczytać/odebrać żądanie GET w C? Nadal szukam! :/ – sadaf2605

0

Gdy dane są odbierane w prawidłowym stanie, spróbuj przeanalizować je jako żądanie http. Poczekaj na CRLF CRLF (wskazujący koniec nagłówków HTTP) przed analizą nic

#define CRLF "\r\n" 

wtedy należy szukać w ciąg znaków z wykorzystaniem

strnstr(data,CRLF CRLF,data_len) 

Następnie url jest tuż obok, prawda +1 Znajdziesz tam.

+0

Moje pytanie brzmiało, w jaki sposób mogę pobrać URL użytkownika:/ – sadaf2605

+0

Przepraszam, że edytowałem swoją odpowiedź, teraz widzę – Ishmeet