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?
Boost asio ma prawie gotowca
Może mongoose? https://github.com/cesanta/mongoose
ZrobieDobrze napisał(a):
Boost asio ma prawie gotowca
Chyba chodzi o serwer WWW bez dodatkowych bibliotek
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
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
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.
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.
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);
Jeśli chcesz najprostszy, to nawet nie wiem czy w C++ jest sens to robić.
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.
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
@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
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.
Nie ma to jak polecać w dziale C/C++ coś co nie jest C/C++
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ę :>
zkubinski napisał(a):
prawdopodobnie potrzebujesz
raw socket
Bzdury, surowe gniazda służą do zupełnie innych celów.
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".
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...
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
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?
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 ;)
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 :)
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);
}