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?
Najprostszy serwer HTTP
- Rejestracja: dni
- Ostatnio: dni
- Postów: 34
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2310
Boost asio ma prawie gotowca
- Rejestracja: dni
- Ostatnio: dni
- Postów: 1028
Może mongoose? https://github.com/cesanta/mongoose
- Rejestracja: dni
- Ostatnio: dni
- Postów: 610
ZrobieDobrze napisał(a):
Boost asio ma prawie gotowca
Chyba chodzi o serwer WWW bez dodatkowych bibliotek
- Rejestracja: dni
- Ostatnio: dni
- Postów: 34
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
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2310
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
- Rejestracja: dni
- Ostatnio: dni
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.
- Rejestracja: dni
- Ostatnio: dni
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2202
https://github.com/yhirose/cpp-httplib.git
// 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);
- Rejestracja: dni
- Ostatnio: dni
- Postów: 10227
Jeśli chcesz najprostszy, to nawet nie wiem czy w C++ jest sens to robić.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 34
Adamek Adam napisał(a):
https://github.com/yhirose/cpp-httplib.git
// 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.
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Małopolska
- Postów: 649
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
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2202
@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
- Rejestracja: dni
- Ostatnio: dni
- Postów: 69
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2202
Nie ma to jak polecać w dziale C/C++ coś co nie jest C/C++
- Rejestracja: dni
- Ostatnio: dni
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ę :>
- Rejestracja: dni
- Ostatnio: dni
- Postów: 1028
zkubinski napisał(a):
prawdopodobnie potrzebujesz
raw socket
Bzdury, surowe gniazda służą do zupełnie innych celów.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 69
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 socketja 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".
- Rejestracja: dni
- Ostatnio: dni
- Postów: 34
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...
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2202
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
- Rejestracja: dni
- Ostatnio: dni
- Postów: 34
Adamek Adam napisał(a):
https://github.com/yhirose/cpp-httplib.git
// 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?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2202
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 ;)
- Rejestracja: dni
- Ostatnio: dni
- Postów: 34
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 :)
- Rejestracja: dni
- Ostatnio: dni
- Postów: 1028
beaver.xv napisał(a):
Adamek Adam napisał(a):
https://github.com/yhirose/cpp-httplib.git
// 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:
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:
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);
}