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?
- Rejestracja:ponad 2 lata
- Ostatnio:11 miesięcy
- Postów:34
- Rejestracja:około 3 lata
- Ostatnio:ponad rok
- Postów:2310
Boost asio ma prawie gotowca

- Rejestracja:ponad 11 lat
- Ostatnio:7 dni
- Postów:1027
Może mongoose? https://github.com/cesanta/mongoose

- Rejestracja:prawie 6 lat
- Ostatnio:18 dni
- Postów:610
ZrobieDobrze napisał(a):
Boost asio ma prawie gotowca
Chyba chodzi o serwer WWW bez dodatkowych bibliotek
- Rejestracja:ponad 2 lata
- Ostatnio:11 miesięcy
- 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:około 3 lata
- Ostatnio:ponad rok
- 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:prawie 19 lat
- Ostatnio:około 2 godziny
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:ponad 15 lat
- Ostatnio:mniej niż minuta
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:ponad 14 lat
- Ostatnio:3 minuty
- Postów:2064
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:ponad 2 lata
- Ostatnio:11 miesięcy
- 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:ponad 10 lat
- Ostatnio:około 2 miesiące
- Lokalizacja:Małopolska
- Postów:643
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:ponad 14 lat
- Ostatnio:3 minuty
- Postów:2064
@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:prawie 9 lat
- Ostatnio:około 5 godzin
- Postów:68
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:około 19 lat
- Ostatnio:2 miesiące
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:ponad 11 lat
- Ostatnio:7 dni
- Postów:1027
zkubinski napisał(a):
prawdopodobnie potrzebujesz
raw socket
Bzdury, surowe gniazda służą do zupełnie innych celów.

- Rejestracja:prawie 9 lat
- Ostatnio:około 5 godzin
- Postów:68
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".

- Rejestracja:ponad 2 lata
- Ostatnio:11 miesięcy
- 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:ponad 14 lat
- Ostatnio:3 minuty
- Postów:2064
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:ponad 2 lata
- Ostatnio:11 miesięcy
- 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?


reinterpret_cast
, lub jeszcze większy hardkor (kto nie „kocha” używania void *
do wszystkiego…).
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


- Rejestracja:ponad 14 lat
- Ostatnio:3 minuty
- Postów:2064
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:ponad 2 lata
- Ostatnio:11 miesięcy
- 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:ponad 11 lat
- Ostatnio:7 dni
- Postów:1027
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);
}