Winsock
-
Hiho!
Wie kann man mit send() ein einen bestimmten Client eine Nachricht schicken. Ist der Socket, der bei accept() zurückgegeben wird, immer ein anderer? Also ich mein, wenn ich 5 mal accept() hab, bekomm ich 5 sockets, und wenn ich einen bei send() als Parameter angeb, kommt die Nachricht nur da an?
Und 2., ist ein Asynchroner Socket oder ein Thread schneller?
Danke scho mal
Mike
-
Servus m0rgu3 !
Das Schema eines Servers ist meist immer dasselbe.
1.)Socket erstellen(Methode socket | Anschließend wird der Socket gebunden(somit für die Clienten zugänglich gemacht),dannach erfolgt der Aufruf der Methode listen(Hier werden die max. Verbindungen festgelegt die der Server entgegennimmt,kann beliebig oft aufgerufen werden um zBsp.die Anzahl der mögl. Verbindungen zu ändern.))
2.)Aufruf der Methode bind(siehe oben)
3.)Aufruf der Methode listen(siehe oben)
4.)Aufruf der Methode accept(Hier werden die Anfragen der Clienten akzeptiert in Abhängigkeit der max.möglichen Verbindungen die in der Funktion listen angegeben wurde.)
Die Funktion accept gibt den Socket des betreffenden Clienten zurück.
Über diesen Socket hat der Server die Möglichkeit,Daten zum Client PC zu schicken.(Beim Clienten wird die Verbindung halt über die Funktion connect zum Server hergestellt,entweder über den Hostnamen oder über die IP,der dann wiederrum vom Server über accept akzeptiert wird.)Du brauchst also für jede Verbindung einen eigenen Socket(den wir beim Server durch accept erhalten),der sicherstellt ,daß die betreffenden Daten auch wirklich nur den betreffenden PC erreichen,der dann mit den gesendeten Daten auch was vernünftiges damit anfangen kann.
Nach Erhalt des Verbindungssocket,kann anschließend über send und recv etc. gesendet und empfangen werden etc.
Ob eine asynchrone Verbindung oder eine Verbindung über einen Thread schneller ist ?Hm....Ich selber verwende gerne Threads,weil man meiner Meinung etwas flexibler ist und eine etwas bessere Kontrolle hat.Glaube aber nicht ,daß ein allzugroßer Unterschied zwischen diesen zwei Varianten herrscht,jenachdem was man daraus macht.Die Entscheidung liegt beim Programmierer.
Hoffe konnte Dir helfen : )
Mfg Giga
-
Danke schön, das hilft ma um einiges weiter. Wenn ich bei listen die maximalen Benutzer erreicht hab, verbindet sich keiner mehr, soweit klar. Wenn nu einer wieder raus geht, kann sich dann wieder einer verbinden, oder sollt man das von hand machen?
Bye
Mike
-
Indem man den Socket auf der Clientenseite mit dem Aufruf closesocket schließt,gibt man wieder einen "Verbindungsplatz" frei.
Vergewissere Dich aber zuerst ob der Client dafür bereit ist,also gerade nicht sendet und/oder empfängt.Dies erreichst du mit der Methode select.Mfg Giga
-
Original erstellt von Gigabyte:
**Servus m0rgu3 !Ob eine asynchrone Verbindung oder eine Verbindung über einen Thread schneller ist ?Hm....Ich selber verwende gerne Threads,weil man meiner Meinung etwas flexibler ist und eine etwas bessere Kontrolle hat
Mfg Giga**könntest Du vielleicht ein Basis-Beispiel von Threads-Sockets posten? ich hab immer (blocking) sochets in Consolen programmiert, und jeztz will ich ein GUI mit MFC bauen, allerdings kann ich accept nicht einfach so benuzten, weil das ganze abstürtzen wird.
Danke
-
Original erstellt von Gigabyte:
Ob eine asynchrone Verbindung oder eine Verbindung über einen Thread schneller ist ?Hm....Ich selber verwende gerne Threads,weil man meiner Meinung etwas flexibler ist und eine etwas bessere Kontrolle hatVerbindung über einen Thread? hm? was du vielleicht meinst: das hauptprogramm lässt einen eigenen thread laufen, in dem die blokierenden netzwerkaufrufe liegen, damit es selbst weiterlaufen kann. (das ist glaub ich sogar ziemlich üblich ;))
Asynchrone sockets:
- Windows: WM_ASYNCSOCKET (oder so ähnlich, jedenfalls erhält dein programm eine window-msg dieser art, sobald sich was auf dem socket tut)
- linux: sockel mit select abfragen, und entsprechend agieren(faq faq faq suchen suchen suchen google google google: das thema kommt alle 3 tage!)
-
Servus mnab!
Wollte Dir zwar Sourcecode per Email schicken ,aber Deine Adresse ist nicht "vorhanden".
Original erstellt von Korbinian:
Verbindung über einen Thread? hm? was du vielleicht meinst: das hauptprogramm lässt einen eigenen thread laufen, in dem die blokierenden netzwerkaufrufe liegen, damit es selbst weiterlaufen kann. (das ist glaub ich sogar ziemlich üblich ) so ist es : )
Für alle die verzweifelt nach ein paar guten WinSock Tutorials suchen->
brauche Socket Klasse (Server reicht)
Mfg Giga