Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

1

25.09.2007, 13:07

winsock

einige fragen sich vllt. was ich mit winsock am hut hab, wenn ich noch nichtmal das casten so richtig drauf hab.. ^^

aber wie dem auch sei..
ich versuche gerade einen chat zu schreiben!
das senden von nachrichten über netzwerk funktioniert, allerdings weiss ich nicht so ganz wie ich es anstellen soll, wenn ich mehrere clients zum server connecten lassen will.
das problem hab ich da mit der funktion accept();

sobald der server im listen modus ist und in die accept funktion geht, wartet der server auf eine verbindung.. und während er das macht kann ich keine nachrichten schicken..

also wenn jetz zb schon ein client eine verbindung hat, muss ich den socket wieder auf listen setzen.. naja.. dann passiert halt das oben beschriebene.

weiss da jemand ne lösung?

meine vorstellung von ner lösung wäre es dass ich irgendwie abfrage WANN ein client sich verbinden möchte, und dass ich erst dann die funktion accept aufrufe. nur weiss ich nicht wie das geht ^^
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

2

25.09.2007, 13:12

Soweit ich weiß hängt das vom Verbindungstyp oder sowas ab. Bin auch kein Fachmann in Sachen Netzwerkprogrammierung.
Hier die Seite(n) sollte(n) deine Frage beantworten.
http://www.c-worker.ch/tuts.php
Sprachen: C/C++, C#, Assembler (16-Bit), QuickBASIC

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

25.09.2007, 13:17

eine gängige lösung ist es, z.b. in einem extra thread auf eine verbindung zu warten und in anderen threads mit den clients zu kommunizieren.

unter windows gibts dann noch funktionen rund um WSAAsyncSelect(), damit kannst du dir praktisch den netzwerkverkehr über nachrichten an ein fenster schicken lassen.

und natürlich gibts dann noch die select funktion.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

25.09.2007, 13:23

Es gibt afaik 3 Möglichkeiten:

1. Multithreading -> einen eigenen Accept-Thread
2. select -> nur im Falle, dass was ansteht wird was gemacht
3. non-blocking Socket -> alle Funktionsaufrufe blockieren nicht mehr; allerdings ist das recht leistungsfressend
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

5

25.09.2007, 13:58

Ich hab es bis jetzt immer mit der Mutithreading Variante glöst und es hat prima funktioniert!
Eine ganz nette Einführung findest du HIER im Forum ;-)
Das Böse ist des Menschensbeste Kraft - Friedrich Nietzsche

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

6

25.09.2007, 15:26

wow, ich hab mir das mit dem multithreading angesehen.. das sieht ziemlich interessant aus..

habs dann auch gleich mal verscuht, und das klappt wunderbar..
das mit select hab ich mir jetzt nicht genauer angesehn ..

zuvor will ich fragen:
welche variante empfiehlt sich?

select oder multithread?

wenns die multithread-variante ist, wie weiss ich wieviel zeit ich welchen thread geben muss?

*edit:
eine weiter frage ist mir noch eingefallen..

was passiert wenn ich in einem thread die accept() funktion aufrufe? der bleibt dann ja "stehn".. arbeitet der andere thread dann normal weiter, also während der andere beispielsweise auf ne verbindung wartet?
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

7

25.09.2007, 15:38

Multithreading ist prinzipiell leicht, zieht aber einen Megarattenschwanz hinter sich her (Thema threadsafety). Auch macht es sich nicht gut wenn es zuviele Threads gibt.
select ist am elegantesten, allerdings hatte ich das Problem, dass wenn man das select auch für den accept-Part nutzt die Verbindung wegen Timeout nicht zustande kommt. kA wieso das so war/ist.

Zeit geben im dem Sinne kann man garnicht. Man kann einem Thread pausieren oder vom Thread aus die CPUZeit per Sleep() o.ä. abgeben. Von den Prioritäten würde ich erstmal die Finger lassen.

Ja klar arbeitet der andere Thread weiter. Genau das ist ja die Idee dahinter! Die einzelnen Programmabschnitte warten nicht aufeinander und wenn einer der Threads festhängt interessiert das die anderen Threads (prinzipiell) nicht.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

8

25.09.2007, 15:47

hm.. also mir als "noobie" kommt die thread variante sehr sympathisch vor ^^

klingt so einfach die 2 aufgaben in zwei jeweilige threads zu stopfen ^^
kannst du mir vllt. argumente sagen warum doch lieber select anstatt multithreading?

will nicht forsch wirken oder so.. mich interessiert immer nur der hintergrundgedanke warum was gewählt wird, damit ich irgendwann auch mal tipps geben kann, und nich immer nur fragen muss :roll:
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

9

25.09.2007, 16:11

Naja neben der Aufgabe neue Clients zu empfangen, muss man ja auch noch die Daten, die die Clients senden ja per recv "abholen". Man könnte jetzt natürlich für jeden Client einen eigenen Empfangenthread starten, aber jeder Thread bedeutet auch mehr Verwaltung und mehr Leistungsnutzer. Mit einem select kann das ganze mit nur einem Thread gelöst werden.

Hast du denn den Bereich über Syncronisation verinnerlicht und verstanden? Wo willst du denn die Clients speichern? In einer Liste, einem Array oder wo?
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

10

25.09.2007, 17:03

ne, das mit synchronisation hab ich mir nicht angesehen.. ist das für mich jetzt schon von bedeutung?

wo ich die clients speichern werde weiss ich noch nicht genau
zuerst hab ich mir überlegt das ganze in arrays zu packen.. aber was haltest du von verketteten listen?

edit:
was ist mit FD_SET ? :)
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

Werbeanzeige