Najprostszy serwer HTTP

Najprostszy serwer HTTP
BX
  • Rejestracja:ponad 2 lata
  • Ostatnio:około rok
  • Postów:34
1

Potrzebuję minimalnego kodu C++ do ogarnięcia serwera HTTP, który będzie zwracał tylko podstawowe nagłówki i stringa, którego zdefiniuję. Trafiłem w sieci na YT na wideo, gdzie gość tworzył taki serwer, ale problem jest taki, że licencja nie jest określona...
https://github.com/codehoose/barebones-webserver/tree/release/video-2
Ktoś ma jakieś pomysły?

edytowany 1x, ostatnio: Riddle
ZD
  • Rejestracja:ponad 3 lata
  • Ostatnio:ponad rok
  • Postów:2310
1

Boost asio ma prawie gotowca


If you put a million monkeys at a million keyboards, one of them will eventually write a Java program - the rest of them will write Perl
enedil
  • Rejestracja:prawie 12 lat
  • Ostatnio:3 dni
  • Postów:1027
1
Marcin Marcin
  • Rejestracja:około 6 lat
  • Ostatnio:2 miesiące
  • Postów:610
0
ZrobieDobrze napisał(a):

Boost asio ma prawie gotowca

Chyba chodzi o serwer WWW bez dodatkowych bibliotek


Fan moderatora somekind
BX
  • Rejestracja:ponad 2 lata
  • Ostatnio:około rok
  • Postów:34
0
Marcin Marcin napisał(a):
ZrobieDobrze napisał(a):

Boost asio ma prawie gotowca

Chyba chodzi o serwer WWW bez dodatkowych bibliotek

Tak, bez dodatkowych bibliotek - im mniej includów tym lepiej.

Co do wspomnianego wyżej mongoose - odpada ze względu na licencję GPL, a komercyjnej nie kupię tylko po to, żeby krótki string wyświetlać :E

ZD
Zupelnie bez? To chyba w Delphi. Nawet to coś, co na Arduino dołączaja do hhtp, traktuje sie jako bibliotekę
ZD
A czy boost to naprawdę "dodatkowa biblioteka" ? To takie trochę poszerzenie / przedmoście (przyszłego) standardu
BX
Ja rozumiem dołączyć jakieś winsocki czy coś (bo to ogólnie na windowsie ma chodzić), ale dołączanie boosta to trochę za duży narzut na tak mały projekt...
enedil
Jak będziesz tylko hostować program (bez udostępniania binarek) to licencja GPL pozwala na to, bez dzielenia się kodem źródłowym.
ZD
  • Rejestracja:ponad 3 lata
  • Ostatnio:ponad rok
  • Postów:2310
0

Ja rozumiem dołączyć jakieś winsocki czy coś (bo to ogólnie na windowsie ma chodzić), ale dołączanie boosta to trochę za duży narzut na tak mały projekt... — beaver.xv 4

Chcesz liczyć bajty i przeliczać na znaki unikodu na Win API ? Chcesz to konserwować?
Na czym ten projekt, bo wiele libek już ma jakąś ideę do socketowania


If you put a million monkeys at a million keyboards, one of them will eventually write a Java program - the rest of them will write Perl
ZD
BTW co nazywamy narzutem?
winuser
@ZrobieDobrze: O jakim liczeniu bajtow kolega mowi? Czy moze chodzi o to, ze cale te programowanie to tak naprawde "przeliczanie bajtow"? To zadna technologia Ciebie nie zadowoli w takim razie.
AN
  • Rejestracja:około 19 lat
  • Ostatnio:około 10 godzin
1

Czy naprawdę jest to potrzebne? Twoja apka w C++ czy co tam chcesz może być zwykłym serwerem TCP/IP na gniazdach, która słucha na jakimś tam porcie, a do tego postawisz zwykły serwer jak Apache, Nginx czy jakikolwiek inny obsługujący np. Php i na serwerze uruchomisz skrypt PHP który w razie potrzeby otworzy połączenie localhost do Twojej apki w C++, wymieni dane i odda wynik w sposób standardowy przyjety w PHP. Oczywiście zamiast php może być cokolwiek innego, to nie ma znaczenia, ważne że serwer http to obsługuje i umiesz zrobić połączenie TCP po gnieździe. Pomiędzy apką w cpp a aplikacja w php protokół może być całkowicie dowolny, możesz sam wymyślić jakiś najprostszy, nie potrzeba implementować protokołu HTTP, bo serwer to zapewnia.

edytowany 3x, ostatnio: andrzejlisek
several
  • Rejestracja:prawie 16 lat
  • Ostatnio:około 2 godziny
1

Co do wspomnianego wyżej mongoose - odpada ze względu na licencję GPL, a komercyjnej nie kupię tylko po to, żeby krótki string wyświetlać :E

To jak chcesz tylko stringa wyświetlić, to w czym Ci GPL przeszkadza? o_0 Ale trzymając się tematu...

Potrzebuję minimalnego kodu C++ do ogarnięcia serwera HTTP, który będzie zwracał tylko podstawowe nagłówki i stringa, którego zdefiniuję.

No to bierzesz serwerek z tutoriala BJa to ściągnięcia z GH TUTAJ i dorzucasz tylko te kilka nagłówków.


edytowany 1x, ostatnio: several
ZK
problem w tym, że przy pomocy tego samouczka możliwe, że coś napisze ale będzie miał bardzo dużo niedomówień i znaków zapytania - tak jak mam ja, bo ten samouczek tylko dotyka tematu i to dość pobieżnie, nie jest tam wyjaśnione co, skąd i dlaczego się wzięło... nie wspominając nawet o tym, że w użyciu są gotowe metody z bibliotek aha i nie jest to w C++ tylko w C :>
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:dzień
  • Postów:2100
4

https://github.com/yhirose/cpp-httplib.git

Kopiuj
// HTTP
httplib::Server svr;

svr.Get("/hi", [](const httplib::Request &, httplib::Response &res) {
  res.set_content("Hello World!", "text/plain");
});

svr.listen("0.0.0.0", 8080);

--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Koszalin
  • Postów:10094
0

Jeśli chcesz najprostszy, to nawet nie wiem czy w C++ jest sens to robić.

BX
  • Rejestracja:ponad 2 lata
  • Ostatnio:około rok
  • Postów:34
0
Adamek Adam napisał(a):

https://github.com/yhirose/cpp-httplib.git

Kopiuj
// HTTP
httplib::Server svr;

svr.Get("/hi", [](const httplib::Request &, httplib::Response &res) {
  res.set_content("Hello World!", "text/plain");
});

svr.listen("0.0.0.0", 8080);

Wydaje się być najlepszym rozwiązaniem. Sprawdzę na tygodniu i jak będzie hulać to będę miał to z głowy.

Co do niektórych innych pytań: przez "serwer http" rozumiem część kodu odpowiedzialną za wyświetlenie wspomnianego stringa. Cały program to jednak nie tylko serwer HTTP, ale także procesor requestów dla pewnej biblioteki DLL - stringi przesyłane przez HTTP będą pobierane z resultów z DLL'ki.

Marius.Maximus
chyba "w tygodniu" ? Albo ja już nie nadążam za nowomową :D
K8
  • Rejestracja:ponad 10 lat
  • Ostatnio:2 minuty
  • Lokalizacja:Małopolska
  • Postów:646
0

mam pytanie
mam server http
ale mam problem z forwarding portu 80
bo do serwera jest przypisany port 80 z ktorego korzysta jednoczesnie router przy ustawianiu opcji

edytowany 1x, ostatnio: krzychu82a
WY
Wypierdzistyy
Zwykle nie da się zalogować na router z zewnętrznego IP, tylko z poziomu LANa.
K8
moze zle to napisalem ale nie moge zmienic w okienku forwarding portu na 80
ZD
Cóż za precyzyjnie podane informacje
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:dzień
  • Postów:2100
0

@krzychu82a nie powinieneś pisać tutaj o problemie tylko założyć nowy watek, jak dobry router to ma opcje zmiany portu uslugi i wtedy przenosisz na inny port zarzadzanie a 80+443 zostawiasz na HTTP i HTTPS (twojego serwera ktory jest za NAT), jak router nie ma opcji to nie pozostaje nic innego jak używać np. 8080, alternatywa to kupic lepszy router


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
edytowany 1x, ostatnio: Marius.Maximus
winuser
  • Rejestracja:prawie 9 lat
  • Ostatnio:około 9 godzin
  • Postów:68
0

Najlepiej uzyc do tego Pythona - ma mnostwo mozliwosci prostych serwerow http.

Jesli juz musisz C++, najprosciej bedzie uzyc Winsock/BSD sockets, kod jednowatkowy na select(). Mozna napisac tak, ze bedzie przenosny miedzy windows oraz linux (oraz FreeBSD) z kilkoma ifdefami.

Pisalem takie aplikacje wiele lat temu, kiedy Python nie byl jeszcze popularny i da sie to zrobic w okolo 300-400 liniach kodu (w miare eleganckiego) w C++. W C nieco wiecej. Oczywiscie mowimy o totalnie prostym przypadku, brak obslugi 95% protokolu HTTP. Obsluge zwyklego GET mozna tak napisac szybko.

Ale generalnie odradzam takie zabawy, chyba ze uczysz sie dopiero C++, roznych api i bibliotek, inaczej nie widze zasadnosci.

edytowany 1x, ostatnio: winuser
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:dzień
  • Postów:2100
0

Nie ma to jak polecać w dziale C/C++ coś co nie jest C/C++


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
winuser
Kiedy ktos bladzi, warto wskazac prawidlowa droge.
ZK
  • Rejestracja:około 19 lat
  • Ostatnio:4 miesiące
0
beaver.xv napisał(a):

Potrzebuję minimalnego kodu C++ do ogarnięcia serwera HTTP, który będzie zwracał tylko podstawowe nagłówki i stringa, którego zdefiniuję.

prawdopodobnie potrzebujesz raw socket ja ogólnie kręcę się przy tym temacie i jest bardzo dużo klocków do poskładania z zagranicznej dokumentacji. Gdyby to forum i programiści którzy tu są wykorzystali cały swój potencjał i rzeczywiście chcieli podzielić się wiedzą, to możliwe, że powstałaby fajna polska dokumentacja na ten i różne tematy - ale większość mądrali stwierdzi "po co" bo są po "angielsku"...

ale no właśnie "po co" ? Tacy rosjanie produkują dla swoich rodaków lepsze samouczki niż te które są po angielsku i dzięki temu rosjanie mają najlepszych programistów na świecie, nie wspominając o matematykach - a w polsce jak zwykle "po co" ? A potem społeczeństwo jest nie wyedukowane, ma braki w edukacji i wykształceniu ale megalomania w narodzie o swojej nieuzasadnionej wielkości z jakiegoś powodu pozostała... chociaż nie wiem czemu w polsce panuje przekonanie o "wielkości" narodu ??? Chyba wielkości głupoty w narodzie, to walimy w tym względzie cały świat na ryj - w tym to się zgodzę :>


bla
CZ
Może sam zaczniesz robić samouczki
Inclouds
Ale kolegę odkleiło, chyba nie znalazł gotowca na stackoverflow i musiał dać upust frustracji.
enedil
  • Rejestracja:prawie 12 lat
  • Ostatnio:3 dni
  • Postów:1027
5
zkubinski napisał(a):

prawdopodobnie potrzebujesz raw socket

Bzdury, surowe gniazda służą do zupełnie innych celów.

winuser
  • Rejestracja:prawie 9 lat
  • Ostatnio:około 9 godzin
  • Postów:68
1
zkubinski napisał(a):
beaver.xv napisał(a):

Potrzebuję minimalnego kodu C++ do ogarnięcia serwera HTTP, który będzie zwracał tylko podstawowe nagłówki i stringa, którego zdefiniuję.

prawdopodobnie potrzebujesz raw socket ja ogólnie kręcę się przy tym temacie i jest bardzo dużo klocków do poskładania z zagranicznej dokumentacji. Gdyby to forum i programiści którzy tu są wykorzystali cały swój potencjał i rzeczywiście chcieli podzielić się wiedzą, to możliwe, że powstałaby fajna polska dokumentacja na ten i różne tematy - ale większość mądrali stwierdzi "po co" bo są po "angielsku"...

ale no właśnie "po co" ? Tacy rosjanie produkują dla swoich rodaków lepsze samouczki niż te które są po angielsku i dzięki temu rosjanie mają najlepszych programistów na świecie, nie wspominając o matematykach - a w polsce jak zwykle "po co" ? A potem społeczeństwo jest nie wyedukowane, ma braki w edukacji i wykształceniu ale megalomania w narodzie o swojej nieuzasadnionej wielkości z jakiegoś powodu pozostała... chociaż nie wiem czemu w polsce panuje przekonanie o "wielkości" narodu ??? Chyba wielkości głupoty w narodzie, to walimy w tym względzie cały świat na ryj - w tym to się zgodzę :>

Wyglada na to, ze nie masz pojecia o czym piszesz. Na win32 wystarczy zwykly SOCK_STREAM. Prove me wrong.

Co do dokumentacji pisanej w jezyku Polskim. Nie wiem jak to skomentowac. Trolujesz? Jakies 99.9 % programistow ktorych znam nie wpadloby na to, bo nie ma takiej potrzeby. Byloby to wrecz szkodliwe. Dokumentacje po polsku czytalem bedac w gimnazjum sto lat temu, ale szybko sie z tego wyleczylem. Najczesciej byly to przestarzale materialy. Nawet juz wtedy swiat IT pedzil tak szybko, ze nie bylo sensu tego tlumaczyc, a co dopiero dzisiaj.

Ale po co ja to pisze, zapewne i tak moja wiadomosc nie zostanie poprawnie zrozumiana, "bo jezyk polski".

kq
Dyskusje z nim są z reguły bezcelowe, wystarczy przejrzeć historię jego postów.
BX
  • Rejestracja:ponad 2 lata
  • Ostatnio:około rok
  • Postów:34
0
winuser napisał(a):

Wyglada na to, ze nie masz pojecia o czym piszesz. Na win32 wystarczy zwykly SOCK_STREAM. Prove me wrong.

Możesz rozwinąć wypowiedź? Może faktycznie powinienem zahaczyć o ten temat...

kq
To prawie na 100% było do zkubińskiego
BX
Wiem, ale może z tym SOCK_STREAM coś ciekawego jest :)
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:dzień
  • Postów:2100
0

Hoł ! Hoł !
Proszę posłuchać trochę świątecznych hiciorów (np. RMF Classic), i włączyć tryb świątecznej życzliwości :)
Ewentualnie w oddzielnym wątku zawody na najprostszy/najlepszy serwer HTTP technologia dowolna


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
BX
  • Rejestracja:ponad 2 lata
  • Ostatnio:około rok
  • Postów:34
0
Adamek Adam napisał(a):

https://github.com/yhirose/cpp-httplib.git

Kopiuj
// HTTP
httplib::Server svr;

svr.Get("/hi", [](const httplib::Request &, httplib::Response &res) {
  res.set_content("Hello World!", "text/plain");
});

svr.listen("0.0.0.0", 8080);

Jako, że nie jestem w 100% płynny w C++, to jeszcze podpytam: czy jest możliwość w tej libce dodania dependency injection na requeście albo w funkcji callbackowej do konkretnego patha?

Zobacz pozostałe 15 komentarzy
enedil
@Althorion: przecież rzutowanie na pałę się zazwyczaj nie skompiluje (chyba, że rzutujesz wskaźniki, ale to inna kwestia w ogóle)
Althorion
Miałem na myśli właśnie takie naprawdę na pałę, przez reinterpret_cast, lub jeszcze większy hardkor (kto nie „kocha” używania void * do wszystkiego…).
ZK
@enedil: & @Althorion dobra, nie zaśmiecam tutaj - ale ogólnie chcę tylko napomknąć, że moja dygresja na temat rzutowania jest taka jak rozumieć rzutowanie - rozumiem, że np typ int można rzutować na double lub na char - ale co z typem np "Button" a "window" - tak dwa różne obiekty z czapy - tutaj nie piszcie, bo po co. Ale chcę zobrazować o co mi chodzi - może założę o tym wątek
Althorion
Załóż. To jest ten przypadek właśnie, o którym piszę, że jak się mocno uweźmiesz, to kompilator na to machnie ręką i przepuści, ale rezultat nie będzie miał sensu.
ZK
@Althorion: no dobra, to grzeję kotleta który zrobił się gorący
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:dzień
  • Postów:2100
1

A lambda w przykładzie nie wystarcza czy nie znasz tej koncepcji ? Ewentualnie inne przykłady kodu na stronie projektu nie załatwiają tematu ?
Albo opisz to jakoś szerzej ;)


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
BX
  • Rejestracja:ponad 2 lata
  • Ostatnio:około rok
  • Postów:34
0
Adamek Adam napisał(a):

A lambda w przykładzie nie wystarcza czy nie znasz tej koncepcji ? Ewentualnie inne przykłady kodu na stronie projektu nie załatwiają tematu ?
Albo opisz to jakoś szerzej ;)

Koncepcji nie znam - C++ nie tykałem odkąd skończyłem technikum - moja praca aktualnie opiera się bardziej o PHP, ale spróbuję poczytać. Dzięki za nakierowanie :)

Zobacz pozostałe 2 komentarze
ZD
Kuźma,. będziesz miał problem z tym IDE powyżej dużej bańki dochodu z C++
BX
@ZrobieDobrze: psychiatra. to już pewne :)
BX
i co jeszcze za ciebie zrobić? @ZrobieDobrze XD
BX
człowiek całkowicie odklejony XD
enedil
  • Rejestracja:prawie 12 lat
  • Ostatnio:3 dni
  • Postów:1027
2
beaver.xv napisał(a):
Adamek Adam napisał(a):

https://github.com/yhirose/cpp-httplib.git

Kopiuj
// HTTP
httplib::Server svr;

svr.Get("/hi", [](const httplib::Request &, httplib::Response &res) {
  res.set_content("Hello World!", "text/plain");
});

svr.listen("0.0.0.0", 8080);

Jako, że nie jestem w 100% płynny w C++, to jeszcze podpytam: czy jest możliwość w tej libce dodania dependency injection na requeście albo w funkcji callbackowej do konkretnego patha?

no to coś takiego:

Kopiuj
void start_server() {
    httplib::Server svr;

    jakas_klasa obiekt;
    
    svr.Get("/hi", [&obiekt](const httplib::Request &, httplib::Response &res) {
        // uwaga na jakieś asynchroniczne listen - wtedy musisz zadbać, żeby `obiekt` nadal był w scopie
        obiekt.metoda();
        res.set_content("Hello World!", "text/plain");
    });

    svr.listen("0.0.0.0", 8080);
}

alternatywnie można jakoś tak:

Kopiuj
httplib::Server setup_routes() {
    httplib::Server svr;

    std::shared_ptr<jakas_klasa> obiekt = std::make_shared(obiekt{});
    
    svr.Get("/hi", [obiekt](const httplib::Request &, httplib::Response &res) {
        obiekt->metoda1();        res.set_content("Hello World!", "text/plain");
    });

    svr.Get("/bye", [obiekt](const httplib::Request &, httplib::Response &res) {
        obiekt->metoda2();        res.set_content("Goodbye World!", "text/plain");
    });

    
    return svr;
}

void start_server(httplib::Server& svr) {
    svr.listen("0.0.0.0", 8080);
}
edytowany 5x, ostatnio: enedil
BX
czyli po prostu w bracketach referencja do obiektu? OK :D
enedil
zaktualizowałem posta
BX
później sprawdzę, jak to będzie działało z moim kodem. wielki plus za pomoc :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.