Socketprogrammierung
-
Boah die Thread Scheiße ist noch zu kompliziert für mich als "Anfänger" da blick ich nicht durch..
Wo ich was einsetzen muss und wieviele Threads ich brauch u.s.w. vllt könntet ihr mir ne Starthilfe geben?!
-
Delta- schrieb:
Wo ich was einsetzen muss und wieviele Threads ich brauch u.s.w. vllt könntet ihr mir ne Starthilfe geben?!
CSpille schrieb:
Wenn du mehrere Client-Anfragen mit einem blocking socket gleichzeitig verarbeiten möchtest, wirst du für jede eingehende Verbindung einen neuen Thread starten müssen.
do { connectedSocket=accept(acceptSocket,NULL,NULL); startThread(connectedSocket); while(connectedSocket!=INVALID_SOCKET)
-
evtl. ist ein bischen am thema vorbei, aber den text fand ich ganz nett auch wenns englisch ist, aber das meißte ist eh code und der sollte doch eh in englisch sein oder
http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=/rzab6/rzab6xnonblock.htm
btw. ohne die kommentare ists auch nicht so lang...
lg lolo
-
@CSpille Was muss ich für die Funktion startTheard einbinden?
-
Delta- schrieb:
Find aber keine Einführung zu ThReads auf Deutsch.
Wenn du dich ernsthaft mit der Programmierung beschäftigen willst, wirst du nicht drumrumkommen englisch zu lernen. Es gibt viele Englische und wenige Deutsche Seiten zu den jeweiligen Themen, die meisten sind mittelmäßig und nur wenige wirklich gut und umfassend. Zu einem bestimmten Thema eine deutsche Seite zu finden, die alles gut und erschöpfend erklärt, ist also mehr als unwahrscheinlich. Deshalb: lerne Englisch.
Delta- schrieb:
Boah die Thread Scheiße ist noch zu kompliziert für mich als "Anfänger" da blick ich nicht durch..
Du hast dir für einen Anfänger ein recht komplexes Thema ausgesucht. Wenn du dabei bleiben willst musst du da wohl durch.
-
Hi,
eigentlich wollte ich dir gerade folgenden Link als Hinweis geben mit ein
paar deutschen Erläuterungen.
http://stackoverflow.com/questions/86046/best-way-to-start-a-thread-as-a-member-of-a-c-class
Allerdings bin ich jetzt etwas verwirrt, da ich glaube,
dass der folgende Code, obwohl er hoch bewertet wurde, nur sehr begrenzt
tauglich ist.#include <boost/function.hpp> #include <boost/thread.hpp> class cMyClass { public: void Run(); } cMyClass theClass; // start new thread by invoking method run on theClass instance boost::thread* pThread = new boost::thread( boost::bind( &cMyClass::Run, // member function &theClass ) ); // instance of class
Deswegen mal eine Frage in die Runde...
Der Code funktioniert nur, solange garantiert ist, dass das cMyClass-Object
dauerhaft lebt, oder sehe ich das falsch?
(Eventuell auch solange keine Felder und virtuellen Methoden vorhanden sind,
aber ich würde nicht erwarten, dass der Standard das garantiert)
Es wird doch nur eine Kopie des boost::bind-Objektes erstellt und die Zeiger
verweisen auf einen Speicherberich, der später ungültig wird / werden kann.
Generell würde ich das Beispiel einfach als nicht tauglich für eine variable
Anzahl von Threads einstufen, jedoch frag ich mich dann warum es so gut
bewertet ist...Mir ist klar, dass ich zur Verwendung von boost::thread einfach ein Object
erstellen kann, das einen Copy-Konstrukor hat und den operator()
implementiert, welches ich dann als Parameter übergebe.Gruß,
CSpille
-
Hi Delta-,
da muss ich pumuckl absolut recht geben...
Trotzdem werde ich versuchen dir nochmal mit einem allgemeinen Beispiel
zu helfen:Für Boost kannst du dir mal folgendes einfaches Beispiel ankucken:
CountingThread.h:
class CountingThread{ public: CountingThread(int f, int u); void operator()(); private: int from; int until; } void startCounter(int from, int until);
CountingThread.cpp:
#include <boost/thread.hpp> #include <iostream> CountingThread::CountingThread(int f, int u) : from(f), until(u) {} // Diese Methode wird aufgerufen, wenn der neue Thread gestartet wird. void CountingThread::operator()(){ for(int i=f; i<u; ++i){ std::cout << i << std::endl; } } void startCounter(int from, int until){ //Hier wird ein Objekt erstellt, das den operator() als Einstieg // für den neuen Thread haben muss CountingThread countingThread(from, until); //Dieser Befehl dient dem Starten eines neuen Threads, dabei wird das //Objekt per Kopier-Konstruktor kopiert -> keine Zeiger oder Referenzen in //das Objekt, die in dem Code nach diesem Befehl ungültig werden boost::thread thread(countingThread); }
Der Code ist ungetestet und ohne Garantien
und hoffentlich sind nicht zuviele Fehler drin ^^Für die native Windows-Version kannst du dir mal den Beitrag von Fux in folgenden
Thread durchlesen:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-39508.htmlGruß,
CSpille
-
CSpille schrieb:
boost::thread* pThread = new boost::thread( boost::bind( &cMyClass::Run, // member function &theClass ) ); // instance of class
Diese Zeile produziert natürlich auch noch nen memory leak, wie mir
gerade erst auffällt...
-
Aber die Klasse "ContuningThread" ergibt doch keinen Sinn, oder?
-
Ich wollte dir nicht die exakte Lösung posten, da der Lerneffekt sonst 0 wäre...
Wenn du anstelle der zwei Zahlen deinen acceptedSocket übergibst
und statt dem Zählen im operator() deine Eingaben von den Clients empfängst
und behandelst, hast du schon genau, was du willst...
-
BTW: boost::thread hat move semantik... nur als Hinweis.
-
theta schrieb:
BTW: boost::thread hat move semantik... nur als Hinweis.
Was heißt "hat move semantik"?
Beziehst du dich auf diesen Teil der boost-Doku:
Objects of type boost::thread are movable, however, so they can be stored in move-aware containers, and returned from functions. This allows the details of thread creation to be wrapped in a function.
http://www.boost.org/doc/libs/1_37_0/doc/html/thread/thread_management.html
Ehrlich gesagt, weiß ich nicht, wie ich den Kommentar jetzt einordnen soll...
-
-
Ehrlich gesagt, weiß ich nicht, wie ich den Kommentar jetzt einordnen soll...
Ich habs nur erwähnt, weil ich gesehen habe, dass im ersten Bsp. ein boost::thread Objekt auf dem Heap angelegt wurde, was in den meisten Fällen unnötig ist.
War, jetz wo ich alles lese, ein wenig am Ziel vorbei.
Simon
-
Ich schätze deine Geduld aber bin in C++ neu
Hab mir jetzt gedacht: "Ok, ne Schleife wäre ja das logischte."
mit dem Code hier:do { connectedSocket=accept(acceptSocket,NULL,NULL); //Thread.Start(connectedSocket); if(connectedSocket==INVALID_SOCKET) { cout << "Fehler: accept!" << endl; } else { cout << "Neue Verbindung!" << endl; } }while(connectedSocket!=INVALID_SOCKET);
Der klappt perfekt!
Doch dann häng ich für immer in der Schleife fest
Deswegen ja diese Thread Funktion
Aber kappiere immernoch nicht wie das funktioniert mit dem Thread..
Das man sagt "Wiederhole diese Schleife im Hintergrund die ganze zeit, und ich mach weiter mit dem nächsten Code" Aber verstehe ned welche Threadfunktion das macht und welche header datei ich dazu einbinden muss das die Funktion schon deklariert ist.
Ich werd mir diesen Beitrag nach ein Jahr anschauen und mich schämen, das ich so ne sinnlose scheiße schreibe^^
-
Kannst du denn schon richtig C++? Wenn nicht, dann tu dir das "langweilige" ISO-C++ erst mal an (dann magst du es vllt. auch auf einmal) und komme später zu Sockets zurück. Netzwerkprogrammierung gehört zu den allerschwierigsten Themen überhaupt, wenn man nicht gerade fertige Libraries benutzt (was nicht heißen soll, dass es dann super-einfach ist). Außerdem ist das Thema zu plattformabhängig, trotz Berkley-Sockets, die auf Unix und Windows ähnlich sind. Stell die konkreten Fragen in speziellen OS-Foren (hier WinAPI oder Linux/Unix oder ganz anders RudP), aber lerne in dieser Reihenfolge erst mal:
1. Englisch
2. C++
3. C++
4. Sockets
-
Netzwerkprogrammierung gehört zu den allerschwierigsten Themen überhaupt
ja ne is klar
-
Ich denke schon das ich die Grundlagen von C++ behersche, man lernt ja auch nicht alle Funktionen von heut auf Morgen.
Naja hab mir jetzt Grundlagen angeschaut von Hello World bis Klassen auch nicht von heut auf Morgen, sondern immer was neues gelernt..
Und jetzt wage ich mich an die GUI Programmierung mit Qt.
Naja wenn man was größeres mit Socket's machen möchte wird der Code schonmal kompliziert und man blickt schwer drüber, kann ich mir vorstellen ist bestimmt nicht nur bei der Socket Programmierung so.. Aber das was ich machen will ist ja nicht's weiter als so ne Art Chat da müssen nur Char's gesendet werden, naja auch wenn ich ein paar Datentypen nicht unbedingt kenne z.b HANDLE..
Thread's dürfte auch nicht ALLzuschwer sein, denn sein zweck ist (glaub) nur das er eine Funktion weiterlaufen lässt während das Programm weiterläuft oder so.
void Platform = Windows;
-
> Naja hab mir jetzt Grundlagen angeschaut von Hello World bis Klassen
Weiter gehts mit Vererbung, Templates und Std-Library, (u.a. STL)
> Ich denke schon das ich die Grundlagen von C++ behersche, man lernt ja auch nicht alle Funktionen von heut auf Morgen.
Man lernt in C++ mehr als nur Funktionen. Die braucht man nicht auswendig zu kennen, hauptsache man weiß was es gibt, der Rest steht im Manual.
> Und jetzt wage ich mich an die GUI Programmierung mit Qt.
Dann verwende doch auch gleich QThread und die Socket-Libraries von Qt.
> Aber das was ich machen will ist ja nicht's weiter als so ne Art Chat da müssen nur Char's gesendet werden, naja auch wenn ich ein paar Datentypen nicht unbedingt kenne z.b HANDLE..
"Nur" ein Chat ist auch relativ. Es steckt, wie du siehst, mehr dahinter als du denkst. Da du von HANDLE (#define HANDLE void*) sprichst, machst du also WinAPI. Lass es lieber, das ist C und im Vergleich zu Qt viel zu low-levelig. Nimm QSocket!
> Thread's dürfte auch nicht ALLzuschwer sein, denn sein zweck ist (glaub) nur das er eine Funktion weiterlaufen lässt während das Programm weiterläuft oder so.
Paralleles Rechnen, genau. Aber da steckt eine ganze Menge dahinter: Synchronisierung, Events, Threadsicherheit etc. pp.
-
Die Schnittstelle von Windows also WinApi brauch ich noch für meine geplanten Programme, finds nur überflüssig das man für void* nen Datentyp erstellt der das gleiche bezweckt aber anders heißt, sehr verwirrend für neulinge..
Naja das Qt ne eigene "SocketSprache" hatt wusst ich nicht nachdem ich mir Qt angeschaut hab werd ich es mir anschauen, wird warscheinlich auch Pflicht sein wenn ich mit der GUI von Qt arbeite.
Zum Thema "Grundlagen": Ich wusste nicht das Templates zu Grundlagen gehört?!
Das war mir auch klar das man Funktionen nicht auswendig lernen muss!Zum Thema Qt, da ich mich noch nie mit Qt beschäftigt habe bzw überhaupt mit GUI's ausser in Visual-C++ mit paar CLI Form Anwendungen, die keinen Sinn ergaben wollt ich fragen was für ein Buch ihr mir für den Einstieg bis zum "Professionell" bzw. Fortgeschritten programmierung mit der Qt Libary empfehlen könnt. Hab mich in Amazon schon mal umgeschaut und fand das HIER mit positiven Kundenrezensionen.
Fand noch einen Buch mit der neueren Qt Version vom gleichen Verlag, doch schlechter Bewertung. here