Einstieg ins Netzwerk gesucht

Thomasio

Erfahrenes Mitglied
Meine ersten Gehversuche in Sachen Netzwerk beschränken sich auf wininet
Auf der Suche nach weitergehenden Tutorials lande ich aber irgendwie im Nirwana

Was ich gern machen würde ist eine bidirektionale Verbindung zwischen 2 PC´s oder einem PC und einem Server aufbauen, über die ich Daten hin und her schicken kann, ohne jedesmal die Verbindung neu aufbauen zu müssen
Ansätze dazu habe ich 100te gefunden, aber nichts wirklich brauchbares, bzw nichts was ich Anfänger verstehen könnte, vor allem deshalb, weil ich eine Lösung in API plain suche, wo ich es "zu Fuss" machen kann, so dass ich dabei auch die Grundlagen der Sache lerne

Kennt jemand ein gutes Tutorial dazu?
 
Die Seite existiert in ähnlicher Form 100 mal im Web, haben alle 2 entscheidende Nachteile

1) Diese ist für Borland geschrieben und verwendet einige Sachen, die in API plain nicht funktionieren (das habe ich aber bereits gelöst, weil es eine fast identische Seite auch für API plain gibt)
2) Es wird beschrieben, wie man Sockets erstellt, damit ein Client einen Server abfragen kann, die typische Geschichte von verbinden, Anfrage senden, Antwort erhalten, Verbindung schliessen
Auf den ausführlichen Seiten wird dann noch beschrieben, wie man das mit mehreren Clients gleichzeitig macht und ein paar beschäftigen sich sogar noch mit mehreren Abfragen hintereinander

Was überall fehlt ist, wie man eine Verbindung zum Server (oder zwischen 2 Rechnern) aufbaut, so dass der Server dem Client auch ungefragt Daten senden kann, sprich bidirektionale Verbindung
Meine Lösung dazu sieht im Moment so aus, dass der Client den Server im Sekundentakt abfragt, aber das verursacht natürlich eine Menge unnötige Serverlast
 
Was überall fehlt ist, wie man eine Verbindung zum Server (oder zwischen 2 Rechnern) aufbaut, so dass der Server dem Client auch ungefragt Daten senden kann, sprich bidirektionale Verbindung
Ich verstehe glaube ich dein Problem nicht. Sockets sind natürlich bidirektional.
Du kannst mit read und write doch gegenseitig Daten senden und empfangen ?
Dafür muss natürlich eine Verbindung aufgebaut worden sein.

Oder habe ich dich falsch verstanden ?
 
Es ist durchaus möglich, dass ich Anfänger da irgendwas nicht kapiert habe, aber nach meinem Verständnis, bzw. dem was ich aus diesen Socket Tutorials herausgelesen habe, läuft das etwa so:

Client verbindet zum Server, stellt eine Anfrage und wartet auf Antwort
Server verarbeitet die Anfrage, sendet Antwort
Client erhält Antwort und verarbeitet diese

Das ist das Prinzip von Client und Server, was dabei fehlt, ist der offene Port beim Client, über den der Server ungefragt Daten senden kann, z.B. wenn man einen Chat-Server bauen will, davon ausgehend, dass die meisten Clients hinter einer Firewall hängen, dann müssen

- entweder alle verbundenen Clients ständig beim Server nachfragen, ob es was neues gibt
- oder die Clients müssten sich benehmen wie Server und ihrerseits ständig auf Nachrichten vom Server warten

Problem dabei ist, dass der Server keine Verbindung zum Client aufnehmen kann, es müsste also der Client die Verbindung herstellen, damit die Firewall Daten vom Server durchlässt, aber nachdem die Verbindung einmal hergestellt ist, müsste sie offen bleiben und alle beide sich benehmen wie Server und Client in einem
Der Server hat kein Problem damit Anfragen des Client zu beantworten, aber immer nur wenn er gefragt wird
Wie lasse ich nach Verarbeitung der ersten Anfrage die Verbindung offen, so dass der Server auch nach Stunden noch Daten an den Client senden kann, ohne dass der Client eine neue Anfrage stellt und wie bringe ich dem Client bei, dass er nach Verbindungsaufbau permanent "listen" soll?

Anderes gutes Beispiel sind P2P Verbindungen, wo 2 Clients sich miteinander verbinden, ohne dass überhaupt ein Server dazwischen hängt
Unter Stichwort LowIP findet man dort das Problem
Clients ohne public IP können von aussen nicht erreicht werden, trotzdem können Verbindungen aufgebaut und auch über lange Zeiträume Daten ausgetauscht werden, sofern nur einer der beiden Clients erreichbar ist
Es wird also offensichtlich eine Verbindung aufgebaut und offen gehalten, beide Clients "listen" ständig auf Nachrichten, ohne dass einer oder beide dazu Anfragen senden muss

Wie gesagt, es ist durchaus möglich, dass ich da etwas völlig falsch verstehe, oder mir einfach ein paar Grundlagen fehlen, genau darum suche ich ja ein Tutorial, wo ich das lernen kann
 
Zuletzt bearbeitet:
Hallo,

wenn sich der Client zum Server verbunden hat, dann bleibt diese Verbindung auch nach einem Frage/Antwort-Prozedere bestehen (außer sie wird explizit getrennt). Der Port zum Server ist also offen. Der Client muss halt nur ständig an diesem Port lauschen, etwa via "select()" - Befehl.

Gruß
MCoder
 
Die Seite existiert in ähnlicher Form 100 mal im Web, haben alle 2 entscheidende Nachteile

1) Diese ist für Borland geschrieben und verwendet einige Sachen, die in API plain nicht funktionieren (das habe ich aber bereits gelöst, weil es eine fast identische Seite auch für API plain gibt)
2) Es wird beschrieben, wie man Sockets erstellt, damit ein Client einen Server abfragen kann, die typische Geschichte von verbinden, Anfrage senden, Antwort erhalten, Verbindung schliessen
Auf den ausführlichen Seiten wird dann noch beschrieben, wie man das mit mehreren Clients gleichzeitig macht und ein paar beschäftigen sich sogar noch mit mehreren Abfragen hintereinander

Was überall fehlt ist, wie man eine Verbindung zum Server (oder zwischen 2 Rechnern) aufbaut, so dass der Server dem Client auch ungefragt Daten senden kann, sprich bidirektionale Verbindung
Meine Lösung dazu sieht im Moment so aus, dass der Client den Server im Sekundentakt abfragt, aber das verursacht natürlich eine Menge unnötige Serverlast

Es ist
1. NICHT für Borland geschrieben,
2. und IST beschrieben, wie man mit mehreren Clients umgeht.

Wieso liest du dir nicht einfahc die Seite genau durch, bevor du so einen Wirrwarr verbreitest?
 
Hm, ja, ich glaube das bekomme ich mit etwas exmerimentieren dann schon hin
Zuerst mal danke dafür

Zusatzfrage:
Kann der Server auch Clients direkt verbinden und wenn ja, dann wie?
Idee dahinter ist ein Chat Server, der auch private Sessions erlaubt, ohne den Server weiter zu belasten, also

Clients verbinden sich zum Server, wo sie Server based Chat Messages austauschen können, so weit klar
Wenn jetzt der Server zwei Clients den Port des jeweils anderen gibt, der ja dank der aufgenommenen Verbindung zum Server noch offen ist, können die beiden dann auch direkt über diesen Port kommunizieren oder brauchen sie immer den Server als Zwischenstation?

Mir ist schon klar, dass der Client dann unterscheiden muss, von wem die Daten kommen, die Frage ist ob grundsätzlich ein Client Daten von mehreren Quellen über den selben Port empfangen kann
 
@Teambeta

Mag sein, dass ich einfach nur zu viele schlechte Erfahrungen habe, oder noch einfacher, schlicht zu doof bin bzw. noch nicht weit genug um es zu verstehen, aber ich habe eines gelernt

WENN in einem Tutorial die Zeile auftaucht, wie z.B. bei c-worker.ch gleich in Teil1, Grundlagen:

Ich habe die Datei mal sock.c genannt und habe sie folgendermassen kompiliert:
C:\borland\Bin>bcc32 C:\sock.c

und dazu auch noch mehrmals auf der Seite Hinweise stehen, dass man mit Visual Studio evetuell noch ein paar Sachen anders machen muss, dann werde ich mit MinGW/GCC++ nicht weit kommen
In den meisten Fällen sind es nur Kleinigkeiten, die von einem Compiler zum Anderen eine minimal andere Syntax erfordern, aber wenn ein Anfänger diese Unterschiede nicht kennt, dann steht man da wie die Kuh vorm Bahnhof

Mag sein, dass es in diesem Fall nicht so ist, aber aus meiner Erfahrung dauert es länger die Unterschiede zu suchen und zu berichtigen als gleich eine andere Seite zu suchen, die nicht für oder mit Borland gemacht wurde

Mag gut sein, dass ich im Moment an etwas arbeite, für das ich wirklich noch einige ganz grundsätzliche Grundlagen brauchen würde, sprich ich mich damit noch gar nicht beschäftigen sollte, aber ich lerne ja "nur", ich verfolge keinen festen Zweck, sondern schnüffel nur mal hinein, probiere 100 Sachen aus und ob ich überhaupt jemals eine echte Verwendung für den Kram haben werde steht in den Sternen
 
@Teambeta

Mag sein, dass ich einfach nur zu viele schlechte Erfahrungen habe, oder noch einfacher, schlicht zu doof bin bzw. noch nicht weit genug um es zu verstehen, aber ich habe eines gelernt

WENN in einem Tutorial die Zeile auftaucht, wie z.B. bei c-worker.ch gleich in Teil1, Grundlagen:

Ich habe die Datei mal sock.c genannt und habe sie folgendermassen kompiliert:
C:\borland\Bin>bcc32 C:\sock.c

und dazu auch noch mehrmals auf der Seite Hinweise stehen, dass man mit Visual Studio evetuell noch ein paar Sachen anders machen muss, dann werde ich mit MinGW/GCC++ nicht weit kommen
In den meisten Fällen sind es nur Kleinigkeiten, die von einem Compiler zum Anderen eine minimal andere Syntax erfordern, aber wenn ein Anfänger diese Unterschiede nicht kennt, dann steht man da wie die Kuh vorm Bahnhof

Mag sein, dass es in diesem Fall nicht so ist, aber aus meiner Erfahrung dauert es länger die Unterschiede zu suchen und zu berichtigen als gleich eine andere Seite zu suchen, die nicht für oder mit Borland gemacht wurde

Mag gut sein, dass ich im Moment an etwas arbeite, für das ich wirklich noch einige ganz grundsätzliche Grundlagen brauchen würde, sprich ich mich damit noch gar nicht beschäftigen sollte, aber ich lerne ja "nur", ich verfolge keinen festen Zweck, sondern schnüffel nur mal hinein, probiere 100 Sachen aus und ob ich überhaupt jemals eine echte Verwendung für den Kram haben werde steht in den Sternen

Kannst du mal aufhören totalen Nonsens zu verbreiten?
Der Quellcode ist ANSI-C, nachlesen.

Ich kann ihn mit jedem beliebigen Compiler kompilieren, das hat nichts mit dem Quellcode zu tun.
 
Zurück