Goeiemiddag allen tesamen.
Om mijn C/C++ kennis serieus omhoog te schoppen, ben ik begonnen aan een leuk project: mijn eigen webserver. Qua code sta ik absoluut nog niet ver. Ik ben nog voornamelijk aan het denken hoe ik alles zou organizeren qua structuur. En ik wil er ook bij vertellen dat het mijn bedoeling is dat het zowel onder windows als linux kan draaien.
Nu zit ik vooral te denken aan hoe de requests te verwerken.
Bij 1 client is het simpel. Connectie accepteren, volledige request inlezen en data sturen om vervolgens de connectie weer te sluiten.
Bij meerdere clients kan ik gemakkelijk werken met het select()-model.
Als een client dan achter een grote file vraagt, moeten de andere clients wachten totdat die volledig doorgestuurd is. Is natuurlijk ook geen oplossing. Hiervoor vond ik als oplossing om maar telkens een stukje data te versturen (~1024 of zoiets). Dus op het einde van de select()-loop gewoon alle clients overlopen die nog data verwachten en een nieuw stukje versturen.
Dus waar ligt nu mijn probleem ? Ik zie het misschien te groot, maar ik zou in mijn webserver de mogelijkheid van een scripting taal willen inbouwen. Welke weet ik nog niet. Lua , Gamemonkey of misschien wel php. Maar hieromtrent heb ik dus nougabollen aan ervaring.
Maar met die scripts kom ik dan toch terug in een blocked state ? Een script mag nu voor mijn part 100mb aan data willen sturen naar de client, dit kan ik in stukjes doen. Als hij echter een half uur bezig is om die data aan te maken, kom ik in de problemen. Je kan moeilijk die verwerking “pauzeren” en bij de volgende select()-run, opnieuw effen wakker schudden om opnieuw te pauzeren. Het lijkt me dus dat ik niet veel anders zal kunnen dan met een thread per client te werken.
De vraag is natuurlijk hoe dit zich vertaalt naar resources / performantie.
Bij 3 clients zal het allemaal wel niet veel uitmaken, maar wat bij 1000 connected clients ?
Het zal waarschijnlijk nooit zover komen dat ik 1000 connected clients heb, maar het gaat om de oefening.
Onder windows kan ik werken met _beginthread (heb toch gelezen ergens op GoT dat deze het vriendelijkst is qua resources). Onder linux kan ik werken met oftewel fork() of pthread_* . Ik weet niet goed welke weg hier te kiezn. Pthreads lijkt mij op een gelijkaardige manier te werken als de windows threads, dus zal misschien gemakkelijker zijn om gelijkaardig te gebruiken.
Heb al eens zitten zoeken op threadpools, maar niets duidelijk gevonden. Dus weet ook niet precies wat het principe ervan is. Bijhouden van een aantal threads, die je dan kan hergebruiken ? Maar wat dan als je 1000 clients op een zelfde opgeblik hebt, kan je toch moeilijk met die 10 threads laten afhandelen ?
(als iemand een mooi linkje hieromtrent heeft, altijd welkom
)
Dus alle suggesties / commentaar / opmerkingen / .. zijn welkom.
Alvast bedankt om tot hier te lezen
Om mijn C/C++ kennis serieus omhoog te schoppen, ben ik begonnen aan een leuk project: mijn eigen webserver. Qua code sta ik absoluut nog niet ver. Ik ben nog voornamelijk aan het denken hoe ik alles zou organizeren qua structuur. En ik wil er ook bij vertellen dat het mijn bedoeling is dat het zowel onder windows als linux kan draaien.
Nu zit ik vooral te denken aan hoe de requests te verwerken.
Bij 1 client is het simpel. Connectie accepteren, volledige request inlezen en data sturen om vervolgens de connectie weer te sluiten.
Bij meerdere clients kan ik gemakkelijk werken met het select()-model.
code:
1
2
3
4
5
| select loop
indien connectie : accept it
indien data beschikbaar : inlezen en toevoegen aan buffer
indien request volledig : data versturen
end of select loop |
Als een client dan achter een grote file vraagt, moeten de andere clients wachten totdat die volledig doorgestuurd is. Is natuurlijk ook geen oplossing. Hiervoor vond ik als oplossing om maar telkens een stukje data te versturen (~1024 of zoiets). Dus op het einde van de select()-loop gewoon alle clients overlopen die nog data verwachten en een nieuw stukje versturen.
Dus waar ligt nu mijn probleem ? Ik zie het misschien te groot, maar ik zou in mijn webserver de mogelijkheid van een scripting taal willen inbouwen. Welke weet ik nog niet. Lua , Gamemonkey of misschien wel php. Maar hieromtrent heb ik dus nougabollen aan ervaring.
Maar met die scripts kom ik dan toch terug in een blocked state ? Een script mag nu voor mijn part 100mb aan data willen sturen naar de client, dit kan ik in stukjes doen. Als hij echter een half uur bezig is om die data aan te maken, kom ik in de problemen. Je kan moeilijk die verwerking “pauzeren” en bij de volgende select()-run, opnieuw effen wakker schudden om opnieuw te pauzeren. Het lijkt me dus dat ik niet veel anders zal kunnen dan met een thread per client te werken.
De vraag is natuurlijk hoe dit zich vertaalt naar resources / performantie.
Bij 3 clients zal het allemaal wel niet veel uitmaken, maar wat bij 1000 connected clients ?
Het zal waarschijnlijk nooit zover komen dat ik 1000 connected clients heb, maar het gaat om de oefening.
Onder windows kan ik werken met _beginthread (heb toch gelezen ergens op GoT dat deze het vriendelijkst is qua resources). Onder linux kan ik werken met oftewel fork() of pthread_* . Ik weet niet goed welke weg hier te kiezn. Pthreads lijkt mij op een gelijkaardige manier te werken als de windows threads, dus zal misschien gemakkelijker zijn om gelijkaardig te gebruiken.
Heb al eens zitten zoeken op threadpools, maar niets duidelijk gevonden. Dus weet ook niet precies wat het principe ervan is. Bijhouden van een aantal threads, die je dan kan hergebruiken ? Maar wat dan als je 1000 clients op een zelfde opgeblik hebt, kan je toch moeilijk met die 10 threads laten afhandelen ?
(als iemand een mooi linkje hieromtrent heeft, altijd welkom
Dus alle suggesties / commentaar / opmerkingen / .. zijn welkom.
Alvast bedankt om tot hier te lezen