Głośnik: Teraz nurkowania do kodu dystrybucji i spojrzeć w kontekście w którym kod piszesz będzie działać. Na koniec dnia, idziesz do wdrożenia Całość serwera. Ale mamy pod Ci ze szkieletem Kod, który ma pewne funkcje, w szczególności związane z sieci. Rzućmy okiem. Więc tutaj ku górze pliku jest kilka z funkcją testowania wymagania makro. Teraz jest to tylko cecha c, przy czym zgodnie z bandą stron man należy zdefiniować niektóre te stałe, aby mogło być prawdziwe lub być nawet tak, że konkretne numery masz dostęp do niektórych funkcji. W przeciwnym razie zostaną one nielegalnej i nie będzie miał dostępu. Więc zrobiłem to w drodze czytania stron podręcznika. Teraz na dole, w linie 15 do 17, my mają całą masę granicach zadeklarowanych. A my pożyczył je od popularny serwer WWW Apache nazywa. A to tylko numery, które będą cap całkowitą ilość bajtów, które są dozwolone w różnych kontekstach do żądania HTTP że przeglądarka może wysłać do mnie. Następnie definiujemy oktety. Teraz oktet jest tylko fantazyjny sposób mówić bajt lub osiem bitów. Okazuje się, że w przeszłości bajtów niekoniecznie osiem bitów, tak oktet jest zawsze osiem bitów. Więc w tym przypadku mamy przyjęte co jest powszechne w sieci Świat dzwoniąc osiem bajtów oktetów. Tutaj mam określić, że oktety będzie za 512, tak, że podobnie jak w medycynie sądowej gdy czytamy kilka bajtów w czasie, również tutaj mamy zamiar przeczytać kilka oktetów w czasie. Następny całą masę plików nagłówkowych. Skąd wiem, że na to jest? Cóż, po prostu przeczytać człowieka stron dla wielu funkcji że będziemy korzystać w tej dystrybucji Kod i to w tych Polecono mi. A teraz mamy typ danych. Mamy ogłoszony oktet być char. Zobaczymy później, że to używane w kodzie. I mamy zadeklarowane cała masa prototypów, i będziemy chodzić szybko przez każda z tych funkcji. Wreszcie, a może przede ważne, aby utrzymać się w nic w tym momencie historia, jest to, że nie są w rzeczywistości cały kilka zmiennych globalnych na początku pliku, korzeń CFD, SFD, wniosek, plików i ciało. Teraz na ogół przy użyciu tak wielu globalnym zmiennych lub zmienne globalne w ogóle, Praktyka nie jest powrotem. Ale okazuje się, jesteśmy również za pomocą technika zwana obsługa sygnałów później w kodzie, co pozwala nam wykryć, kiedy użytkownik wciśnie coś jak CTRL C i wyłączenie Serwer wdziękiem. A żeby to zrobić bezpiecznie i faktycznie zwolnić pamięć, musimy mieć dostęp do te zmienne globalne. A teraz rzućmy okiem na główną, która napędza całość tego programu. Po pierwsze, w górnej tutaj mieć zmienną liczbę błędów które wydaje się nie mieć typ, ale to bo to rzeczywiście zdefiniowane w pliku o nazwie Błąd errno.h które znajduje się wyżej. Jeśli tak rzeczywiście człowiek errno zobacz definicję dla tej rzeczy, zobaczysz, że jest to Specjalna zmienna globalna, że jest przez całą masę funkcji nie jest napisane przez nas, ale przez twórców Linuksa i inne systemy faktycznie ustawione Numer do tej zmiennej, gdy coś pójdzie nie tak, aby można było na całym świecie dowiedzieć się, co poszło nie tak. Teraz na dole zobaczysz nowe Technika może korzystaniu z getopt Funkcja, która pomaga polecenie parsującej Argumenty wiersza, tak, że nie muszą niepokoić tracić czas na zastanawianie się, jak analizować coś jak 8080, lub łącznik p lub kreska h, aby uzyskać pomoc. Getopt zasadniczo robi to za nas. Zobacz na stronie man więcej. Następnie możemy zrobić trochę błędów kontroli, aby upewnić numer portu, który znajduje się w Zakres ten w spec. Następnie widzimy wywołanie funkcji rozpocząć, którego definicja będziemy przyjrzeć się w jednej chwili, a jak jej nazwa wskazuje, ten uruchamia serwer WWW. Tutaj mamy wywołanie funkcji zwany sygnał, który mówi, czy i kiedy słyszysz sterowania C z Klawiatura użytkownika, śmiało nazwać Funkcja o nazwie, która będzie obsługi ostatecznie czyste rzeczy i zatrzymać serwer. Poniżej to, co wydaje się być nieskończonej pętli, z których pierwsza linia skuteczne jest połączenie do funkcji o nazwie zresetować, które my sami realizować w dalszej kolejności zwolnić niektóre z naszych państw globalnych. Po to jest linia Kod, który warunkowo sprawdza powrót Wartość podłączony. Teraz związane wygląda jak orzecznika, coś, co zwraca prawdę lub fałsz. I tak jest, ale nie ma coś szczególnego w podłączony na tym, że jest to wywołanie blokowanie. Będzie tam siedzieć i czekać aż przeglądarce użytkownika próbuje połączyć się z tej sieci serwer i dopiero wtedy to będzie powrót prawdziwe lub fałszywe, tak że przystąpimy do wnętrza tej instrukcji if. Tam zauważył tę funkcję na Funkcja o nazwie parse, które pisaliśmy, która przetwarza wszystkie oktetów wszystkich bajtów pochodzących z przeglądarki do serwera, tak, że możemy oddać kopii ostatecznie wartość jednego z tych zmiennych globalnych, które sklepy wszystkich bajtów w tak Nagłówki, które wniosek, nie ciało gdyby nie było w rzeczywistości ciało do niego. Teraz na dole zaczynamy analizować te nagłówki wyodrębnić podzbiorem informacji że zależy nam. W szczególności, na Specyfikacja, najpierw chciałem zwrócić linię, która jest tylko, że pierwszy wiersz, który mam nadzieję, że coś mówi Uzyskaj slash lub niektóre ścieżki i HTTP 1.1. Używamy tej metafory igły w stogu siana szukać szczególności znaki lub adresy. I rzeczywiście, nie ilość funkcje w naszym kodzie dystrybucji że tobie też może się przydać przy poszukiwaniu konkretnych wartości. Ostatecznie możemy skopiować te bajty do linii zmiennej o nazwie, który zauważył też, mamy alokowane na stosie drodze dynamicznego zwymiarowana tablicy. A my świadomie próbuje aby uniknąć wywołania malloc bo raz, ponieważ od sterowania C jest Potencjał cechą tego programu, możemy nie chce mieć ten kod nagle przerwane przez uderzenia użytkownika Sterowanie C, czego wynikiem jest to, że mogę nie mieć szansę za darmo coś mam malloced. Więc staram się używać jak najwięcej stosu to mogę tutaj. Następna w kolejce, całą masę do zadania. Specyfikacja będzie wykładać na co dokładnie tu spodziewać, ale komentarze daje podpowiedź, co nas czeka. Najpierw należy zatwierdzić linię zapytania i upewnij się, że wygląda na to, Dane gramatyka, że ​​tak powiem, mówi, że powinien. Następnie należy wyodrębnić coś zwany zapytanie, rzeczy się po znakiem zapytania, jak widzieliśmy w naszym przykładzie Google przechodząc w parametrze HD. Następnie złączyć razem główny serwer WWW ze ścieżką, która jest w że wniosek pierwszej linii i tworzą pełną ścieżkę Plik chcemy szukać. Następnie jedziemy do upewnij się, że plik istnieje i jest czytelny. A potem mamy zamiar wydobyć jego Rozszerzenie pliku, .html lub .php, lub niektóre takie rozszerzenie to jest w Bardzo koniec łańcucha jest wniosek. Następna w kolejce jest cała czek kodu pisaliśmy faktycznie generuje PHP treści generowane dla Ciebie. W skrócie, to Kod ma w nazwie pliku chcesz PHP do interpretacji. Mijamy go przez coś zwane Rura do interpretera PHP. Wracaj odpowiedzi jako że odpowiedzi były sam plik. A potem iteracyjnego, że pliku bajtów, ciągnąc je wszystkie w jednym buforze tak abyśmy mogli w końcu wydrukować je. Rzeczywiście, wszystkie te wzywa, żeby dprintf pozwala nam wydrukować coś zwany deskryptor pliku, który jest po prostu liczbą całkowitą reprezentującą pliku. Bardzo podobne w duchu, ale zasadniczo różni się od pliku gwiazda wskaźnik. Zauważ, jak można użyć składni jak printf tutaj tak, że mogę dynamicznie wstawić coś w długości za wartość nagłówka HTTP nazwie Content-Length. I ostatecznie użyłem Funkcja prawo faktycznie Napisać ciało na życzenie. Niestety, tylko realizowane wsparcie dla dynamicznie Wygenerowane pliki PHP. Nie wdrożyć wsparcie dla Pliki statyczne, jak i JPEG, GIF, CSS i HTML i pliki. To, niestety, pozostawia się do Ciebie w odpowiedzi na potrzeby klientów tego zrobić. Więc tam przekonasz się, że nie ma nie wiele inspiracji w tym bloku, ale jeśli trochę wyżej, w jaki sposób udaliśmy się na temat interpretacji kodu PHP, funkcje będziesz używać są nieco inne. W rzeczywistości, można pożyczyć niektóre funkcje być może z kryminalistyki Zestaw problem, ponieważ na koniec dnia wszystko, co trzeba zrobić tutaj jest, gdy wiesz, co otworzyć pliku i gdy wiesz, to tak zwane Typ MIME lub typu treści, trzeba czytać w tych bajtach i jakoś pluć je z powrotem. A teraz to wycieczka inne funkcje pliku. , Pierwsza jest połączona które po prostu zwraca true kiedy w końcu słyszy Połączenie z użytkownikiem. Następna w kolejce jest błąd. Błąd, w międzyczasie, jak to funkcja napisał do obsługi wszystkich różnych 400 HTTP i status 500 Kody, które możesz chcieć wysłać z powrotem do użytkownika, ze standardowym komunikacie. Następna w kolejce jest obciążenie, szczególnie mięsisty funkcja, której celem w życiu jest do zapoznania się z gwiazdy wskaźnik pliku zawartość pliku do bufora globalnym że zadeklarowana globalnie powyżej [? Głównym. ?] Jest to trochę skomplikowane, bo my Trzeba czytać bajtów z pliku ale sprawdź na każdej iteracji już, czy mamy trafić na koniec pliku lub jeszcze coś poszło nie tak. I używamy realloc upewnić się, że co bufor używamy rośnie i rośnie i rośnie i zawsze wyprzedzenie liczby bajtów że musimy zmieścić się w tam. Handler, w międzyczasie, Funkcja, która dostaje nazywany drodze posiadające zarejestrowany sterowania C jako sygnał że chcemy przechwytywać. Zauważ tu obsługi że to ostatecznie Połączenia stop, co oczywiście zatrzymuje serwer WWW. I niestety, wyszukiwania nie jest realizowane. W duchu, to dość prosta funkcja. Biorąc pod uwagę rozszerzenie pliku, musi powrót to tzw MIME Rodzaj lub typ treści. A my określić w specyfikacji co to odwzorowanie musi być. Ale trzeba tłumaczyć ostatecznie do kodu c. Następna w kolejce jest nasza funkcja podobnie mięsisty zwany parse, którego celem w życiu jest czytać, a nie z pliku, ale z połączenia sieciowego. Konkretnie, czytania i analizowania Żądania HTTP, który przyjechał z przeglądarki z serwerem, dzięki czemu ostatecznie możemy analizować co tylko nagłówki w żądaniu linii i powrót tych do Ciebie za pomocą buforu, że globalne zadeklarowaliśmy powyżej [? Głównym. ?] Reset, w międzyczasie, Funkcja definiujemy która jest wywoływana wewnątrz iteracyjnie głównego za każdym razem masz zamiar gotowy, aby rozpocząć odtwarzanie dla nowego połączenia tak, że zawsze wiemy stan naszych zmiennych i tak, że mamy również uwolnił żadnego pamięć mogły być przeznaczone na poprzednie połączenie sieciowe. Następna będzie rozpocząć, funkcja pisaliśmy która zawiera całość dużo kodu sieciowego które ostatecznie uruchamia serwer WWW. Ostatnio się to funkcja nazywa przystanek, które robi dokładnie to, że go zatrzymuje serwer WWW. Ale najpierw zwalnia żadnej pamięci które jeszcze zostały przydzielone. Ale ostatecznie wzywa wyjścia nawet bez powrotu kontroli do naszej głównej funkcji. W końcu jedna z Najważniejsze techniki przy realizacji tego serwera www jest będzie trochę prób i błędów, posiadające jedną przeglądarki otwartym oknie na prawo i na okno terminala w lewo, konsola serwery okna, tak aby można zobaczyć wiadomości, które są wyświetlane na ekranie. Ale jeszcze lepiej byłoby trzeci okno, drugie okno terminala, w którym za pomocą usługi Telnet, wykorzystanie dla których jest przewidziany w specyfikacji. I Telnet jest po prostu bardzo Prosty program w sieci który pozwala udawać być w jednym oknie przeglądarki podczas rozmowy do innego okna. W ten sposób można zobaczyć, dokładnie polecenia tekstowe które wracają z serwera do klienta bez wywiercenie wokół dewelopera Chrome narzędzia w inny sposób clunkier interfejs.