TCP /IP
-
Guten tag,
ich möchte ein mehr clienten System programmieren..Der Server sollte dabei gleichzeitig in der Lage sein:
- Alarme zu senden
- Quittierungen zu empfangen
- Auf eingehende Verbindungen warten
- Einen Timer laufen lassenwie mach ich denn das am besten?
Multithreading? hab da leider nur wenig Erfahrung drin..besteht auch die Möglichkeit einen Meldung an alle zu senden, also einen Rundruf?
muss ich eigentlich von jedem clienetn den socket speichern? (z.B. in einer hashtabele)
den Timer wollte ich für eine Verbindungsüberprüfung benutzten.
würde mich über ein paar Tipps und Ratschläge sehr freuen..
Mfg
-
Multithreading beim Server klingt sinnvoll ja.
immer wenn ne neue verbindung reinkommt erstellt der Server nen neuen Thread nur für den entsprechenden Client. Kann man auch schön in Klassen kapseln.Wenn du eine Meldung an alle Senden willst, muss das der Server machen. Der muss irgendwo alle Clients mitlocken und dann halt das Rundschreiben raushauen

Du kannst ja mal schauen, inwiweit dir die MFC da hilft. Gibt da auchn paar Socketklassen. Kann ich aber nicht viel zu sagen, wie die sind.
Ansonsten bei www.codeproject.com gibt es auch schöne Socket-Klassen, sodass du dir den "Grundschleim" ersparen kannst
-
immer wenn ne neue verbindung reinkommt erstellt der Server nen neuen Thread nur für den entsprechenden Client.
ist nicht sinnvoll
-
hmm... sondern?also ich hatte am anfang mal gedacht ich hab ne thread der die verbindungen aufbaut, also auf verbindungen wartet, einen der für das senden zuständig ist und einer der daten empfängt.
die drei müssen sich dann in gewissen zeitabständen mal dran lassen..
bekommt man das hin? oder wie sollte man da ran gehen?
-
individuum schrieb:
also ich hatte am anfang mal gedacht ich hab ne thread der die verbindungen aufbaut, also auf verbindungen wartet, einen der für das senden zuständig ist und einer der daten empfängt.
kannste so machen. ist das einfachste. dann brauchste auch keine sockets in den non-blocking modus umkonfigurieren...
-
ok, dann werd ich das mal so versuchen.. danke für die hilfe
ist es dann eigentlich möglich einen meldung an alle zu versenden?
-
individuum schrieb:
ist es dann eigentlich möglich einen meldung an alle zu versenden?
klar, wenn 'accept' rauskommt, haste ja einen 'kommunikationssocket'. den musste sowieso irgendwo speichern, also packste den in ein array oder eine liste und wenn du was an alle senden willst, dann gehste die in 'ner schleife durch und machst sowas wie:
for (int s=0; s<number_of_conneted_socket; s++) send (connected_sockets[s], .....);
-
bei der frage hat ich eigentlich an gleichzeitig gedacht, hab mich da wohl nicht klar genug ausgedrückt

die frage ist ob das überhaupt muss,
ich sende höchstens 126 KB bei 100Mbit/s100Mbit/s -> 12,5MByte/s
also brauch ich für 126KB 0,01s also 10 millisekunden.
also theoretisch natürlich kommt da noch tcp header und son kram zu..ist das richtig gerechnet?
kann ich eigentlich beliebig große Datein versenden oder muss ich die noch aufsplitten?mfg
-
individuum schrieb:
100Mbit/s -> 12,5MByte/s
nee, aber nicht wirklich

diese 100 Mbits/s sind wirklich der absolute maximalwert, mit dem die bits durch's medium schwirren können (bei ethernet 100BaseT z.b. sind's 125µS zwischen zwei clock pulsen). die nutzdatenrate liegt bei ethernet durch protokolloverhead, kollisionen, latenzzeiten der hardware, etc. deutlich niedriger. beispiel: wenn du von einem 10Mbit/s ethernet auf ein 100Mbit/s ethernet wechselst, haste keine 10fach höhere nutzdatenrate (wie man annehmen sollte), sondern nur etwa eine 2 bis 2.5 fache!
dazu kommen noch die schlimmsten bremsen: software - (anwendung, tcp/ip, treiber etc.) und schon ist die nutzdatenrate im keller...individuum schrieb:
kann ich eigentlich beliebig große Datein versenden oder muss ich die noch aufsplitten?
du brauchst nichts selber zu zerstückeln. allerdings musste aufpassen, wenn du der 'send'-funktion z.b. 1000 bytes gibt, und die meldet als rückgabewert: 700, dann musst du die fehlenden 300 bytes beim nächsten aufruf von 'send' nochmal schicken...
-
net schrieb:
individuum schrieb:
ist es dann eigentlich möglich einen meldung an alle zu versenden?
klar, wenn 'accept' rauskommt, haste ja einen 'kommunikationssocket'. den musste sowieso irgendwo speichern, also packste den in ein array oder eine liste und wenn du was an alle senden willst, dann gehste die in 'ner schleife durch und machst sowas wie:
for (int s=0; s<number_of_conneted_socket; s++) send (connected_sockets[s], .....);is doch scheisse. wenn eine verbindung lahm ist müssen alle darunter leiden.
-
-------- schrieb:
is doch scheisse. wenn eine verbindung lahm ist müssen alle darunter leiden.
ja, wenn ein socket blockt ist das doof

naja, wenn er pro socket einen extra thread aufmacht, dann könnte man z.b. einen event auslösen o.ä. damit der betreffende thread das selber macht...
-
wann blockt ein socket?
was da vll erschwerend hinzukommt..
die clienten sind per w lan angebunden und es kann durchaus sein das da mal einer aus der reichweite der repeater latscht!wie lange versucht er denn das zu senden?
oder bricht er das dann ziemlich zügig ab?
-
individuum schrieb:
wann blockt ein socket?
unterschiedlich. von der sendeseite betrachtet: wenn die anwendung den socket mit daten vollgepumpt hat, er aber das zeug noch nicht loswerden konnte (schlechte verbindung o.ä.)...
individuum schrieb:
was da vll erschwerend hinzukommt..
die clienten sind per w lan angebunden und es kann durchaus sein das da mal einer aus der reichweite der repeater latscht!
wie lange versucht er denn das zu senden?
oder bricht er das dann ziemlich zügig ab?naja, kommt drauf an. wenn einer beim wlan ausser reichweite gerät, dann bekommen das theoretisch alle mit (der client selber empfängt keine beacons mehr und der access point weiss auch irgendwie dass der client nicht mehr da ist). so'n wlan-treiber liefert diese information auch nach oben, aber ich weiss nicht was windoofs damit anstellt (wie netwerkkabel abgezogen?). kann sein dass offene tcp/ip-verbindungen noch 'ne weile bleiben (kann ja, sein, dass ich der client wieder einfindet oder per roaming an einem anderen AP hängt)...
-
Wenn die verbindung verloren geht, muss ich dann ne reconnect ausführen?
oder kann ich so tun als wäre nichts gewesen?
-
ich hät da noch ne frage..
Gibt es eine Funktion die überpüft ob daten zu verfügung stehen?
sowas wie dataavailable?
bei .net gibs das ja, gibs das auch bei den CSockets?
-
select()
-
net schrieb:
individuum schrieb:
100Mbit/s -> 12,5MByte/s
nee, aber nicht wirklich

diese 100 Mbits/s sind wirklich der absolute maximalwert, mit dem die bits durch's medium schwirren können (bei ethernet 100BaseT z.b. sind's 125µS zwischen zwei clock pulsen). die nutzdatenrate liegt bei ethernet durch protokolloverhead, kollisionen, latenzzeiten der hardware, etc. deutlich niedriger. beispiel: wenn du von einem 10Mbit/s ethernet auf ein 100Mbit/s ethernet wechselst, haste keine 10fach höhere nutzdatenrate (wie man annehmen sollte), sondern nur etwa eine 2 bis 2.5 fache!
dazu kommen noch die schlimmsten bremsen: software - (anwendung, tcp/ip, treiber etc.) und schon ist die nutzdatenrate im keller...net, das stimmt so net

Ich hab selbst schon über ein 100mbit Netz >7mb/sec drübergedrückt - das ist kein Problem. Solange man nicht viel Kollisionen hat -- bloss die bremsen ein 10mbit Netz genauso.
Sogar aus meinem 1000mbit Netz bekomm ich mehr als 25mb/sec raus (nämlich ca. 40mb/sec), und das ohne Server Netzwerkkarten (mit Server Netzwerkkarten kommt man schon auf > 60mb/sec).
-
hustbaer schrieb:
net, das stimmt so net

Ich hab selbst schon über ein 100mbit Netz >7mb/sec drübergedrückt...tjä, ausnahmen bestätigen die regel. was ich da geschrieben hab' stammt von 'nem vergleich windoofs <--> selbstgebastelter hardware, 100mbits ethernet, tcp/ip loopback in einem kleinem netzwerk (1 switch, etwa 5 teilnehmer dran), paketgrössen zwischen etwa 600 und 1460 bytes.
windows(xp) <--> windows(xp) war sogar ein tickchen langsamer (etwa 2MB/s).btw: was sind server netzwerkkarten?
-
nett schrieb:
select()
da find ich nicht recht was zu..
also ich möchte eine automatische reconncet funktion erstellen:
wie kann man das unterbinden das er bei Socket.listen() eweig wartet?
-
net schrieb:
btw: was sind server netzwerkkarten?
Das sind welche wo "Server" draufsteht

Die sind dann teurer als "normale", aber eben schneller. Im Prinzip einfach bessere Karten, und meist mit PCI-X oder neuerdings PCIe Anbindung.Die haben dann auch bessere Treiber, erledigen diverse Aufgaben auf der Karte (teile des TCP/IP Stacks), und können über Busmaster selbst diverse "Auftragslisten" aus dem RAM holen und abarbeiten -- so dass die CPU nichtmehr für jedes einzelne blöde Packet nen PCI Zugriff machen muss.
Im Endeffekt haste mit einer guten Server Netzwerkkarte kaum CPU Auslastung während das Teil jenseits der 60MB/sec über 1000Base-T raushaut.
----
Klar kann man auch einfach "gute Netzwerkkarte" dazu sagen, bloss Intel z.B. verwendet den Begriff selbst ("Intel PRO/1000 MT Server Adapter"), und kaum ein Heimanwender kauft sich so eine teure Karte, von daher finde ich es nicht verkehrt einfach "Server Netzwerkkarte" zu sagen -- so wie man ja auch "Server Platte" sagt etc.
-
hustbaer schrieb:
Die haben dann auch bessere Treiber, erledigen diverse Aufgaben auf der Karte (teile des TCP/IP Stacks), und können über Busmaster selbst diverse "Auftragslisten" aus dem RAM holen und abarbeiten -- so dass die CPU nichtmehr für jedes einzelne blöde Packet nen PCI Zugriff machen muss.
wow, find ich interessant. wo krieg ich infos darüber?