Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 10:16

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Server handling / Stack

Discussion on Server handling / Stack within the C/C++ forum part of the Coders Den category.

Closed Thread
 
Old   #1
 
Terrat's Avatar
 
elite*gold: 130
Join Date: Apr 2012
Posts: 1,173
Received Thanks: 670
Server handling / Stack

Hallo,
ich wollte gerne etwas für ein Projekt wissen. Normalerweise schreibe ich server derzeit mit dem Konzept each Client = 1 Thread. (boost)
Allerdings würde mich mal interessieren wen mehr als 2000 Threads am laufen sind sind, ist doch der Stack mit 1 GB voll, außer ich reduziere die Stacksize der Threads, was ich jedoch sehr ungerne mache. Wie schreibe ich denn eigentlich so ein Singlethread server ?
1 Thread Accept TCP (Befehle)
1 Thread Accept UDP (Gamedata)

1 Thread Receive Tcp ( alle clients, die der server anhand des sockets einer vorhandenen Klasse zuweist und danach das Packet clientspezifisch abarbeitet )
1 Thread Receive Udp( alle clients )
Terrat is offline  
Old 06/09/2015, 19:39   #2
 
suiluJ.'s Avatar
 
elite*gold: 0
Join Date: Nov 2009
Posts: 2,210
Received Thanks: 6,755
Schau dir mal boost asio an
suiluJ. is offline  
Thanks
1 User
Old 06/09/2015, 21:18   #3
 
elite*gold: 0
Join Date: Feb 2009
Posts: 1,137
Received Thanks: 573
Du solltest vielleicht über das Thread Pool System nachdenken:



Quote:
So, most real-world servers use a thread-pool approach, shown to the right. In the thread-pool approach, the main thread creates a fixed number of worker threads. The main thread is still responsible for accepting connections. As it does so, it creates request objects and places them into a data structure such as a linked list or an array. Each worker threads pulls requests out of the buffer according to some scheduling algorithm, and then produces the necessary response. Thus, the main thread can accept connections as long as memory is available, while a fixed number of threads churn away at maximum efficiency.
Quelle:
warfley is offline  
Thanks
1 User
Old 06/09/2015, 21:31   #4
 
Padmak's Avatar
 
elite*gold: 58
Join Date: Jun 2008
Posts: 2,311
Received Thanks: 8,420
Du solltest wie die anderen 2 schon sagten (mehr oder weniger), boost.asio verwenden.
Damit brauchst du bei weitem nicht so viele Threads, da nicht jede Connection ihren eigenen Thread bekommt sondern wie im Bild über mir einem Workerthread was zu tun gibt, das der dann abwickelt. Schau dir am besten die aktuellsten boost.asio-Beispiele an, vor allem im Zusammenhang mit C++11-Lambdas lässt sich damit wunderbar und mit relativ wenigen Zeilen Code performant und sicher arbeiten

Außerdem ist dein größtes Problem bei 2000 Threads sicher nicht der Speicherplatz, der für die Threadstacks draufgeht, sondern die schlichte Anzahl an Daten, die jeder Thread für sich auf dem Heap erzeugt und verwaltet

Padmak
Padmak is offline  
Thanks
1 User
Old 06/09/2015, 21:50   #5
 
Terrat's Avatar
 
elite*gold: 130
Join Date: Apr 2012
Posts: 1,173
Received Thanks: 670
Danke schonmal an alle, aber ich nutze bereits boost asio.
Allerdings lasse ich nach dem der Acceptor das Callback aufgerufen hat ein Thread für eine Client Klasse starten. Aber ich finde derzeit auch nur boost prinzipien mit dem selben beispiel. Hätte mal wer ein Beispiel welches die obrig genante Struktur verwendet ?
Terrat is offline  
Old 06/09/2015, 22:11   #6
 
Padmak's Avatar
 
elite*gold: 58
Join Date: Jun 2008
Posts: 2,311
Received Thanks: 8,420
Ich empfehle dir, deinen Server so aufzubauen:

Die dort benutzte Klasse 'session' entspricht im Großen und Ganzen einem deiner Clients, das ist laut meinem Wissen (ich lasse mich hier gerne korrigieren) eine der effizientesten und praktischten Arten, wie sich so etwas umsetzen lässt.

Die Struktur von oben funktioniert hier leider nicht so 1:1, da du ja die Verbindung offen halten möchtest und nicht für jeden Request eine neue aufmachen willst

Eigentlich sollte aber der Ansatz aus dem Beispiel als Grundidee genau das erreiche, was du haben möchtest.

Padmak
Padmak is offline  
Thanks
1 User
Old 06/10/2015, 06:40   #7
 
Terrat's Avatar
 
elite*gold: 130
Join Date: Apr 2012
Posts: 1,173
Received Thanks: 670
Danke, außer das ich die lamda functions mit callbacks austausche, da ich nicht wirklich gerne solche funktionen nutze.
Aber bei async_read_some, wird da nicht das thread suspendet bis ein packet kommt oder handelt der ioservice das selbst mit 1 thread?
Terrat is offline  
Old 06/10/2015, 15:34   #8
 
Padmak's Avatar
 
elite*gold: 58
Join Date: Jun 2008
Posts: 2,311
Received Thanks: 8,420
Wie, du nutzt nicht gerne "solche Funktionen"? Solange dein Compiler C++11 mit Lambdas unterstützt, solltest du sie auch verwenden - dein Code wird wesentlich kürzer, klarer und schöner lesbar (und deine Klasse ist nicht voll mit Funktionen, die sich um Verbindungen kümmern)

Nichts wird suspended bis ein Packet kommt, siehe die Referenz dazu:
Alle async_*-Funktionen returnen immer sofort, darum heißen die ja auch "async"

Padmak
Padmak is offline  
Thanks
1 User
Old 06/10/2015, 16:10   #9
 
Terrat's Avatar
 
elite*gold: 130
Join Date: Apr 2012
Posts: 1,173
Received Thanks: 670
Quote:
Originally Posted by Padmak View Post
Wie, du nutzt nicht gerne "solche Funktionen"? Solange dein Compiler C++11 mit Lambdas unterstützt, solltest du sie auch verwenden - dein Code wird wesentlich kürzer, klarer und schöner lesbar (und deine Klasse ist nicht voll mit Funktionen, die sich um Verbindungen kümmern)

Nichts wird suspended bis ein Packet kommt, siehe die Referenz dazu:
Alle async_*-Funktionen returnen immer sofort, darum heißen die ja auch "async"

Padmak
Danke hasi !"_! , mag aber trotzdem lieber callbacks @_@ <3 #nohomo
Terrat is offline  
Old 06/10/2015, 16:40   #10
 
Padmak's Avatar
 
elite*gold: 58
Join Date: Jun 2008
Posts: 2,311
Received Thanks: 8,420
O_o, was auch immer.
Im Endeffekt ist es deine Sache, trotzdem finde ich es komisch wenn du dich gegen Sachen wehrst, die deinen Code besser machen würden
Aber wenn du nicht möchtest, funktionieren wird es so auch

Padmak
Padmak is offline  
Old 06/19/2015, 18:26   #11
 
elite*gold: 0
Join Date: Jun 2015
Posts: 3
Received Thanks: 1
Just use
public:
Quote:
session(tcp::socket socket)
: socket_(std::move(socket))
H-Cheats is offline  
Old 06/22/2015, 22:35   #12
 
ლʕಠᴥಠʔლ's Avatar
 
elite*gold: 0
Join Date: Mar 2015
Posts: 118
Received Thanks: 23
Ich benutze einfach
Es ist auch sehr schön dokumentiert.
ლʕಠᴥಠʔლ is offline  
Old 06/22/2015, 23:18   #13
 
Terrat's Avatar
 
elite*gold: 130
Join Date: Apr 2012
Posts: 1,173
Received Thanks: 670
Bitte schliesen das thema war schon mit Seite 1 abgeschlossen.
Terrat is offline  
Old 06/23/2015, 00:46   #14

 
snow's Avatar
 
elite*gold: 724
Join Date: Mar 2011
Posts: 10,479
Received Thanks: 3,318
Am besten den Thread immer reporten, dann sehen wir Mods das schneller.

#closed
snow is offline  
Closed Thread


Similar Threads Similar Threads
[WBT] Ectos 3,5€/stack | Zkeys 2€/stack | Arms 0,50@/ea |Rare Pets | Trims!
01/10/2015 - Guild Wars Trading - 0 Replies
Heyho Community I wanna BUY! Ectos 3,5€/stack Zaishenkeys 2€/stack Arms 0,50€/ea Unded/ded Rare Pets And Trimmed guilds Cheers
WTS 3-4 stack ecto and 7 stack lockpicks and 1k gold
06/08/2014 - Guild Wars Trading - 1 Replies
1 stack ecto=7€ lockpick and gold gw1 offers plz add my skype abel.velasco67
[Selling] Zkey stack 11 eur/ Ecto stack 10eur
07/18/2013 - Guild Wars Trading - 1 Replies
closed
Koopa's Discount-Offer:Ectos 13,99€/stack! Lpicks 3,99/stack!
04/04/2012 - Guild Wars Trading - 0 Replies
Hey ;) My special offer until monday or sold-out. Enjoy :) Ectos in stock: 10 Stacks http://gwah.onlinewelten.com/images/Ektoplasmakuge l.png 8 stacks sold 1 Stack = 13,99€
Koopas Special -> Ektos für 15/€ Stack -- Dietriche 4,99€/Stack
04/03/2012 - Guild Wars Trading - 1 Replies
Servus ;) Ich biete euch hier die einmalige Gelegenheit, Ektos und Dietriche zu einem sehr günstigen Preis zu kaufen. Ektos auf Lager: 15 Stacks http://gwah.onlinewelten.com/images/Ektoplasmakuge l.png 1 Stack = 15,00€



All times are GMT +1. The time now is 10:16.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.