C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Netzwerkprogrammierung

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Boris Glawe
Guest





PostPosted: Fri Jan 27, 2006 2:58 am    Post subject: Netzwerkprogrammierung Reply with quote



Hallo,

ich möchte gerne XML Dokumente als String über das Netzwerk schicken: Auf beiden
Seiten mache ich dafür einen Socket auf und schicke einfach Zeichen für Zeichen
über den Sockets zum anderen Rechner.

Vermutlich ist das aber nicht besonders plattformübergreifend oder doch? Ich
könnte mir vorstellen, dass schon kleine Unterschiede im Character Encoding etc
ausreichen, dass auf der andere Seite nur Müll ankommt. Muss/Kann ich
irgendendwelche Modifikationen am String vornehmen, bevor ich ihn verschickte
oder kann ich mich darauf verlassen, dass auf der anderen Seite auch das
Character ankommt, dass ich losgeschickt habe?

Sagt der C++ Standard etwas dazu?

Ich kenne Corba/Soap/Ice, aber das ist mir viel zu mächtig und zu undurchsichtig.

Grüße Boris

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
kanze
Guest





PostPosted: Fri Jan 27, 2006 7:36 pm    Post subject: Re: Netzwerkprogrammierung Reply with quote



Boris Glawe wrote:

Quote:
ich möchte gerne XML Dokumente als String über das Netzwerk
schicken: Auf beiden Seiten mache ich dafür einen Socket auf
und schicke einfach Zeichen für Zeichen über den Sockets zum
anderen Rechner.

Vermutlich ist das aber nicht besonders plattformübergreifend
oder doch? Ich könnte mir vorstellen, dass schon kleine
Unterschiede im Character Encoding etc ausreichen, dass auf
der andere Seite nur Müll ankommt.

Kann passieren. Kann sogar passieren, wenn die beiden Maschinen
dieselben Art sind und deiselben Betriebssysteme verwenden --
unter Unix ist die Codierung durch den Umgebungsvariable
LC_CTYPE bestimmt. (Was heißt, dass die Codierung sich von einem
Fenster auf dem anderen ändern kann.)

Gewöhnlicherweise, sofort es geht um mehr als eine Maschine,
wird ein Protokoll definiert. Bei XML, wenn ich mich nicht irre,
ist defaultsmässig UTF-8 vorgeschrieben. (Oder denke ich nur an
XHTML. In jedem Fall kann ich im Kopf von XHTML eine andere
Codierung spezifiziert, und das Übertragungsprotokoll HTTP
bietet es an, eine Codierung vor der Übertragung festzulegen.)

Quote:
Muss/Kann ich irgendendwelche Modifikationen am String
vornehmen, bevor ich ihn verschickte oder kann ich mich darauf
verlassen, dass auf der anderen Seite auch das Character
ankommt, dass ich losgeschickt habe?

Kommt darauf an, wer auf der anderen Seite steht. Wenn es um
dieselbe Maschinart, dasselbe Betriebsystem, und under derselben
Umgebungen geht, dann ist die Wahrscheinlichkeit groß, dass es
klappt.

Quote:
Sagt der C++ Standard etwas dazu?

Er sagt, dass es keine Sockets gibt, und keine Kommunikation
zwischen Rechnern.

Quote:
Ich kenne Corba/Soap/Ice, aber das ist mir viel zu mächtig und
zu undurchsichtig.

Corba finde ich relatif einfach. Sie löst aber dieses Problem
nicht.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Steffen Christgau
Guest





PostPosted: Fri Jan 27, 2006 8:54 pm    Post subject: Re: Netzwerkprogrammierung Reply with quote



kanze schrieb:
Quote:
Gewöhnlicherweise, sofort es geht um mehr als eine Maschine,
wird ein Protokoll definiert. Bei XML, wenn ich mich nicht irre,
ist defaultsmässig UTF-8 vorgeschrieben.

XML-Parser sollten mindestens UTF-8 und UTF-16 verstehen. Mehr wird von
ihnen nicht gefordert, aber die meisten können mehr.

Quote:
(Oder denke ich nur an
XHTML. In jedem Fall kann ich im Kopf von XHTML eine andere
Codierung spezifiziert,

Geht in XML auch:
<?xml version="1.0" encoding="UTF-8" ... ?>

MfG Steffen

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Boris Glawe
Guest





PostPosted: Sat Jan 28, 2006 7:00 pm    Post subject: Re: Netzwerkprogrammierung [etwas OT] Reply with quote

Quote:

Ich kenne Corba/Soap/Ice, aber das ist mir viel zu mächtig und
zu undurchsichtig.


Corba finde ich relatif einfach. Sie löst aber dieses Problem
nicht.

Das löst in sofern das Problem, als dass ich mit den XML Dokumenten ein
eingetretenes Ereignis beim Server melden möchte. Diese Problemstellung muss
nicht unbedingt mit XML Dokumenten geschehen. Ich habe aber keine Lust, mein
ganzes Projekt auf Corba umzustellen.

Ich möchte einfach nur zwei Rechner miteinander vernetzen. Ich weiß, wie ich
Daten verschicke, aber mehr verraten mir diverse tutorials nicht.

Im Grunde ist die Idee meines Projektes ganz allgemein, dass die Clients
bestimmte Ereignsse senden, die der Server benutzt um Berechnungen
durchzuführen, und dann alle Clients über veränderungen benachrichtigt. Meine
Idee ist, dass die Rechner untereinander XML Dokumente austauschen.

Der Datenaustausch findet auf sehr tiefer Ebene statt, wenn ich einfach nur
strings über eine Socket auf die Reise schicke: Es werden einfach nur Bytes
ausgetauscht. Ich weiß jetzt aber nicht, wie ich mit C++ sicherstelle, dass bei
der Gegenstelle auch das ankommt, was ich erwarte. Es kann doch nicht sein, dass
man für jedes Projekt eine eigenes Netzwerkprotokoll schaffen muss, indem man
erst einmal die Byteorder, die Kodierung, etc augehandelt werden müssen!?

Diese Rad scheint aber schon erfunden zu sein. Hat hier jemand einen Hinweis für
mich? Greift ihr zu Curl Bibliotheken, wenn ich solche Funktionen implementiert
oder tatsächlich immer zu Corba, etc?

Grüße Boris

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Richard
Guest





PostPosted: Sun Jan 29, 2006 3:26 am    Post subject: Re: Netzwerkprogrammierung [etwas OT] Reply with quote

Boris Glawe wrote:
Quote:


Ich kenne Corba/Soap/Ice, aber das ist mir viel zu mächtig und
zu undurchsichtig.


Corba finde ich relatif einfach. Sie löst aber dieses Problem
nicht.

Das löst in sofern das Problem, als dass ich mit den XML Dokumenten ein
eingetretenes Ereignis beim Server melden möchte. Diese Problemstellung
muss nicht unbedingt mit XML Dokumenten geschehen. Ich habe aber keine
Lust, mein ganzes Projekt auf Corba umzustellen.

Ich möchte einfach nur zwei Rechner miteinander vernetzen. Ich weiß, wie
ich Daten verschicke, aber mehr verraten mir diverse tutorials nicht.

Im Grunde ist die Idee meines Projektes ganz allgemein, dass die Clients
bestimmte Ereignsse senden, die der Server benutzt um Berechnungen
durchzuführen, und dann alle Clients über veränderungen benachrichtigt.
Meine Idee ist, dass die Rechner untereinander XML Dokumente austauschen.

Der Datenaustausch findet auf sehr tiefer Ebene statt, wenn ich einfach
nur strings über eine Socket auf die Reise schicke: Es werden einfach
nur Bytes ausgetauscht. Ich weiß jetzt aber nicht, wie ich mit C++
sicherstelle, dass bei der Gegenstelle auch das ankommt, was ich
erwarte. Es kann doch nicht sein, dass man für jedes Projekt eine
eigenes Netzwerkprotokoll schaffen muss, indem man erst einmal die
Byteorder, die Kodierung, etc augehandelt werden müssen!?

Diese Rad scheint aber schon erfunden zu sein. Hat hier jemand einen
Hinweis für mich? Greift ihr zu Curl Bibliotheken, wenn ich solche
Funktionen implementiert oder tatsächlich immer zu Corba, etc?


Also ich versende in so einem Fall einfach simple chars, ASCII:-)


Quote:

Grüße Boris


--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Daniel Albuschat
Guest





PostPosted: Mon Jan 30, 2006 9:00 am    Post subject: Re: Netzwerkprogrammierung [etwas OT] Reply with quote

Boris Glawe wrote:
Quote:

Ich möchte einfach nur zwei Rechner miteinander vernetzen. Ich weiß, wie
ich Daten verschicke, aber mehr verraten mir diverse tutorials nicht.

Mehr brauchst du ja auch nicht.
Am besten schickst du die Laenge des XML Dokuments vorab und danach
einfach jedes einzelne Zeichen.

Quote:
Im Grunde ist die Idee meines Projektes ganz allgemein, dass die Clients
bestimmte Ereignsse senden, die der Server benutzt um Berechnungen
durchzuführen, und dann alle Clients über veränderungen benachrichtigt.
Meine Idee ist, dass die Rechner untereinander XML Dokumente austauschen.

Fuer blosse Ereignisse brauchst du XML? Gibt es so viele verschiedene
Parametertypen und Umstaende, dass sich der riesen Overhead lohnt?
Ansonsten wuerde ich dazu raten, einfach ein simples Netzwerkprotokoll
zu entwickeln. Etwa so:
Erste zwei Bytes: Kommandotyp
Abhaengig vom Kommandotyp kommen danach Parameter:
Zwei Bytes fuer die Gesamtlaenge der Parameter,
danach kommandotypabhaengig die Parameter.

Also, das ist jetzt nur ein Vorschlag. Ich kenne deine Umstaende ja
nicht. Aber so macht man soetwas fuer gewoehnlich.
Das Vorgehen ist aehnlich wie beim Entwickeln eines Dateiformats.
Mit ein wenig Uebung hat man soetwas in ein paar Stunden
zusammengestrickt.

Quote:
Der Datenaustausch findet auf sehr tiefer Ebene statt, wenn ich einfach
nur strings über eine Socket auf die Reise schicke: Es werden einfach
nur Bytes ausgetauscht. Ich weiß jetzt aber nicht, wie ich mit C++
sicherstelle, dass bei der Gegenstelle auch das ankommt, was ich
erwarte.

Nicht mit C++, mit den Systemfunktionen meinst du :)

Quote:
Es kann doch nicht sein, dass man für jedes Projekt eine
eigenes Netzwerkprotokoll schaffen muss, indem man erst einmal die
Byteorder, die Kodierung, etc augehandelt werden müssen!?

Die Byteorder ist immer vorgegeben. Sie ist die Net Byte Order, in die
man mit htons oder htonl konvertiert. hton{s,l} machen immer das, was
du erwartest (also entweder die Bytes umdrehen, damit sie richtig sind,
oder so lassen, wie sie sind, wenn sie schon richtig stehen, abhaengig
von CPU Architektur).
Und die Kodierung ist sowieso im XML Dokument hinterlegt! Zumindest in
einem richtigen (tm).
Also musst du hier nichts aushandeln. Und so, wie du das beschrieben
hast, sieht es fuer mich eh nicht aus, als ob du ueberhaupt eine
non-ASCII Kodierung benutzen muesstest.

Quote:
Diese Rad scheint aber schon erfunden zu sein. Hat hier jemand einen
Hinweis für mich? Greift ihr zu Curl Bibliotheken, wenn ich solche
Funktionen implementiert oder tatsächlich immer zu Corba, etc?

Fuer curl muesstest du ja einen http oder ftp Server schreiben.
Ich glaube nicht, dass du das willst. Und Corba ist hier nicht noetig.
Nimm einfach BSD oder win32 Sockets, je nach Platform.
Das sollte alles sehr einfach und elegant damit loesbar sein.
Und vergiss nicht, Dokumentation fuer das Netzwerkprotokoll und ein RFC
zu schreiben. ;-)

MfG,
Daniel

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Rolf Magnus
Guest





PostPosted: Mon Jan 30, 2006 12:01 pm    Post subject: Re: Netzwerkprogrammierung [etwas OT] Reply with quote

Boris Glawe wrote:

Quote:
Das löst in sofern das Problem, als dass ich mit den XML Dokumenten ein
eingetretenes Ereignis beim Server melden möchte. Diese Problemstellung
muss nicht unbedingt mit XML Dokumenten geschehen. Ich habe aber keine
Lust, mein ganzes Projekt auf Corba umzustellen.

Wieso "umzustellen"? Ich denke, diese XML-Geschichte hast du noch nicht. Was
muß dann umgestellt werden?

Quote:
Ich möchte einfach nur zwei Rechner miteinander vernetzen. Ich weiß, wie
ich Daten verschicke, aber mehr verraten mir diverse tutorials nicht.

Im Grunde ist die Idee meines Projektes ganz allgemein, dass die Clients
bestimmte Ereignsse senden, die der Server benutzt um Berechnungen
durchzuführen, und dann alle Clients über veränderungen benachrichtigt.
Meine Idee ist, dass die Rechner untereinander XML Dokumente austauschen.

Dann nimm xmlrpc.

Quote:
Der Datenaustausch findet auf sehr tiefer Ebene statt, wenn ich einfach
nur strings über eine Socket auf die Reise schicke: Es werden einfach nur
Bytes ausgetauscht. Ich weiß jetzt aber nicht, wie ich mit C++
sicherstelle, dass bei der Gegenstelle auch das ankommt, was ich erwarte.

Darum müßte sich die xml-Bibliothek schon kümmern.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
kanze
Guest





PostPosted: Mon Jan 30, 2006 1:01 pm    Post subject: Re: Netzwerkprogrammierung [etwas OT] Reply with quote

Boris Glawe wrote:

Quote:
Ich kenne Corba/Soap/Ice, aber das ist mir viel zu mächtig
und zu undurchsichtig.

Corba finde ich relatif einfach. Sie löst aber dieses
Problem nicht.

Das löst in sofern das Problem, als dass ich mit den XML
Dokumenten ein eingetretenes Ereignis beim Server melden
möchte. Diese Problemstellung muss nicht unbedingt mit XML
Dokumenten geschehen. Ich habe aber keine Lust, mein ganzes
Projekt auf Corba umzustellen.

Anderseits: Corba kümmert sich um die ganze Verbindung, und
nicht nur die Serialisierung. Es gibt aber viele andere
Lösungen. Für eine direkte Verbindung zwischen zwei Rechnern, wo
man den Software auf beiden Seiten beherrscht, finde ich XML
besonders schwer und aufwendig. Aber es kommt freilich auf der
Komplexität des Ergebnisses an.

In jedem Fall, wenn du beide Seite beherrscht, ist das Leben
wesentlich einfacher.

Quote:
Ich möchte einfach nur zwei Rechner miteinander vernetzen. Ich
weiß, wie ich Daten verschicke, aber mehr verraten mir diverse
tutorials nicht.

Im Grunde ist die Idee meines Projektes ganz allgemein, dass
die Clients bestimmte Ereignsse senden, die der Server benutzt
um Berechnungen durchzuführen, und dann alle Clients über
veränderungen benachrichtigt. Meine Idee ist, dass die Rechner
untereinander XML Dokumente austauschen.

Oder ASN.1. Oder...
Wie gesagt, XML ist relativ schwer und aufwendig.

Quote:
Der Datenaustausch findet auf sehr tiefer Ebene statt, wenn
ich einfach nur strings über eine Socket auf die Reise
schicke: Es werden einfach nur Bytes ausgetauscht. Ich weiß
jetzt aber nicht, wie ich mit C++ sicherstelle, dass bei der
Gegenstelle auch das ankommt, was ich erwarte. Es kann doch
nicht sein, dass man für jedes Projekt eine eigenes
Netzwerkprotokoll schaffen muss, indem man erst einmal die
Byteorder, die Kodierung, etc augehandelt werden müssen!?

Entweder schaffst du dein eigenes Protokoll, oder du benutzt
ein existierendes. In beiden Fällen hast du das Problem, den
internen Format im Format des Protokolls umzuwandeln.

Quote:
Diese Rad scheint aber schon erfunden zu sein.

Da bin ich nicht sicher. XML bedeckt nur einen ganz kleinen
Anteil des Problems.

Quote:
Hat hier jemand einen Hinweis für mich? Greift ihr zu Curl
Bibliotheken, wenn ich solche Funktionen implementiert oder
tatsächlich immer zu Corba, etc?

Für sehr einfache Dinge benutze ich in Haus geschriebenen ad hoc
Lösungen. Amsonsten Corba.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Daniel Albuschat
Guest





PostPosted: Mon Jan 30, 2006 2:01 pm    Post subject: Re: Netzwerkprogrammierung [etwas OT] Reply with quote

kanze wrote:
Quote:
Daniel Albuschat wrote:

Boris Glawe wrote:

Es kann doch nicht sein, dass man für jedes Projekt eine
eigenes Netzwerkprotokoll schaffen muss, indem man erst
einmal die Byteorder, die Kodierung, etc augehandelt werden
müssen!?

Die Byteorder ist immer vorgegeben. Sie ist die Net Byte
Order, in die man mit htons oder htonl konvertiert. hton{s,l}
machen immer das, was du erwartest (also entweder die Bytes
umdrehen, damit sie richtig sind, oder so lassen, wie sie
sind, wenn sie schon richtig stehen, abhaengig von CPU
Architektur).

Das ist quatsch. Darstellung (einschließlich Byteorder) kann
beliebig vom Protokoll bestimmt werden.

Ja, "kann". Ich wuerde Protokolle, die die Host Byte Order benutzen,
aber als seltsam bezeichnen. Aber natuerlich gibt es auch hierfuer
Gruende.

Quote:
Unt htonl u.s.w.
funktionnieren nur für bestimmten Typen, und nicht immer auf
allen Rechnern. (Vorsicht auf Problemen von Alignment auf neuen
Rechnern.)

Dass sie fuer bestimmte Typen funktionieren... ist halt so.
Aber huh? Nicht immer auf allen Rechnern? Das musst du naeher
erlaeutern.

Quote:
Im Internet benutzen die meisten Protokolle entweder
"Internet-ASCII" (telnet, SMTP, NNTP, HTTP...) oder ASN.1/BER
(LDAP, SNMP...). "Internet-ASCII" ist, wie sein Name sagt, Text,
und ASN.1/BER benutzt zwei unterschiedene Darstellungen von
Ganzzahle, je nach dem.

Err. Ein Byte hat keine Byteorder. Genau wie ein Stein alleine
nicht in einer bestimmten Reihenfolge liegen kann.
Was ASN.1/BER angeht, weiss ich nicht, was dadurch genau definiert
wird.

Quote:
Für einfache Dinge würde ich eine einfache Darstellung in Text
definieren.

Eine Zahl ist etwas einfaches. Die wuerde ich bei einem
Netzwerkprotokoll aber, sofern es nicht gravierende Nachteile haette,
niemals als Text definieren.

Quote:
Und die Kodierung ist sowieso im XML Dokument hinterlegt!
Zumindest in einem richtigen (tm). Also musst du hier nichts
aushandeln.

Irgendwo wohl. Wenn ich eine XML Datei in JIS bekomme, muss ich
es lesen können.

Da er aber beide Seite beherrscht, braucht er nicht unbedingt
alle der Möglichkeiten vorzusehen.

Wahrscheinlich werden die Infos sowieso nicht ueber das hinaus gehen,
was in ASCII passt.

[snip]

MfG,
Daniel

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
kanze
Guest





PostPosted: Mon Jan 30, 2006 2:01 pm    Post subject: Re: Netzwerkprogrammierung [etwas OT] Reply with quote

Daniel Albuschat wrote:
Quote:
Boris Glawe wrote:

Es kann doch nicht sein, dass man für jedes Projekt eine
eigenes Netzwerkprotokoll schaffen muss, indem man erst
einmal die Byteorder, die Kodierung, etc augehandelt werden
müssen!?

Die Byteorder ist immer vorgegeben. Sie ist die Net Byte
Order, in die man mit htons oder htonl konvertiert. hton{s,l}
machen immer das, was du erwartest (also entweder die Bytes
umdrehen, damit sie richtig sind, oder so lassen, wie sie
sind, wenn sie schon richtig stehen, abhaengig von CPU
Architektur).

Das ist quatsch. Darstellung (einschließlich Byteorder) kann
beliebig vom Protokoll bestimmt werden. Unt htonl u.s.w.
funktionnieren nur für bestimmten Typen, und nicht immer auf
allen Rechnern. (Vorsicht auf Problemen von Alignment auf neuen
Rechnern.)

Im Internet benutzen die meisten Protokolle entweder
"Internet-ASCII" (telnet, SMTP, NNTP, HTTP...) oder ASN.1/BER
(LDAP, SNMP...). "Internet-ASCII" ist, wie sein Name sagt, Text,
und ASN.1/BER benutzt zwei unterschiedene Darstellungen von
Ganzzahle, je nach dem.

Für einfache Dinge würde ich eine einfache Darstellung in Text
definieren.

Quote:
Und die Kodierung ist sowieso im XML Dokument hinterlegt!
Zumindest in einem richtigen (tm). Also musst du hier nichts
aushandeln.

Irgendwo wohl. Wenn ich eine XML Datei in JIS bekomme, muss ich
es lesen können.

Da er aber beide Seite beherrscht, braucht er nicht unbedingt
alle der Möglichkeiten vorzusehen.

Quote:
Und so, wie du das beschrieben hast, sieht es fuer mich eh
nicht aus, als ob du ueberhaupt eine non-ASCII Kodierung
benutzen muesstest.

Diese Rad scheint aber schon erfunden zu sein. Hat hier
jemand einen Hinweis für mich? Greift ihr zu Curl
Bibliotheken, wenn ich solche Funktionen implementiert oder
tatsächlich immer zu Corba, etc?

Fuer curl muesstest du ja einen http oder ftp Server
schreiben. Ich glaube nicht, dass du das willst. Und Corba ist
hier nicht noetig.

Kommt immer darauf, was er eigentlich macht. Corba hat für
einige Anwendungen große Vorteile. Für andere nicht.

Quote:
Nimm einfach BSD oder win32 Sockets, je nach Platform. Das
sollte alles sehr einfach und elegant damit loesbar sein. Und
vergiss nicht, Dokumentation fuer das Netzwerkprotokoll und
ein RFC zu schreiben. Wink

Die Dokumentation ist eigentlich das Hauptpunkt. Die oberen
Schichten eines Protokolls zu codieren, ist gar nicht schwierig.
Nur muss man zuerst wissen, was zu tun ist.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Olaf Krzikalla
Guest





PostPosted: Mon Jan 30, 2006 4:00 pm    Post subject: Re: Netzwerkprogrammierung [etwas OT] Reply with quote

Hi,

und sorry für's OT-drifting...

Boris Glawe wrote:
Quote:
Der Datenaustausch findet auf sehr tiefer Ebene statt, wenn ich einfach
nur strings über eine Socket auf die Reise schicke: Es werden einfach
nur Bytes ausgetauscht.
Der Socket selbst hat ja schonmal ein Protokoll (TCP, UDP o.ä.). Wenn Du

beide Seiten beherrscht, ist ein einheitliches Netzwerkprotokoll also
schonmal einfach.

Quote:
Ich weiß jetzt aber nicht, wie ich mit C++
sicherstelle, dass bei der Gegenstelle auch das ankommt, was ich
erwarte.
Hängt vom Protokoll ab. Mit TCP kommt auf der Gegenstelle zumindest das

an, was auch gesendet wurde (und zwar ohne Lücken etc.). Das sollte
erwartungsgemäß das sein, was die Gegenstelle erwartet Wink Mit C++ hat
das erstmal nichts zu tun.

Quote:
Es kann doch nicht sein, dass man für jedes Projekt eine
eigenes Netzwerkprotokoll schaffen muss, indem man erst einmal die
Byteorder, die Kodierung, etc augehandelt werden müssen!?
Mit 'Netzwerkprotokoll' meinst Du jetzt die Schicht über TCP und Co.

(diese Schichten haben Nummern, TCP gehört zur dritten Schicht)?

Quote:
Diese Rad scheint aber schon erfunden zu sein.
Schon öfters. Dein Problem ist IMHO, dass Du eigentlich über 2 Schichten

nachdenken willst. Schau Dir nur mal die 4.Schicht im deutschen
Wikipedia-Eintrag zu TCP/IP an. Da stehen z.B. so Sachen wie HTTP, die
z.B. die Länge einer kompletten Dateneinheit oder evtl. Encodierungen
festlegen. Aber noch nicht die Grammatik (z.B. XML) der eigentlichen
Dateneinheit. Das kommt dann noch ein Stückchen weiter oben.

Wenn ich Dich aber richtig verstehe, brauchst Du es eigentlich
gar nicht so kompliziert. Dann schau Dir mal OSC an:

http://www.opensoundcontrol.org/

Das darunterliegende Protokoll ist schnell, einfach und durchaus auch
allgemein einsetzbar.


MfG
Olaf Krzikalla

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Boris Glawe
Guest





PostPosted: Tue Jan 31, 2006 5:11 am    Post subject: Re: Netzwerkprogrammierung -- Danke für die Antworten Reply with quote

Danke für eure Antworten!

Was mir auf jeden Fall weiterhilft, ist dass es allgemein üblich zu sein
scheint, dass man Daten in Textform verschickt. Möchte man Probleme mit
Zeichensätzen vermeiden, dann schickt man am besten nur reines ASCII über das
Netz, schicke ich die Kodierung mit (wie es in XML Dokumenten der Fall wäre),
dann kann ich beliebigen Text schicken, ohne Angst haben zu müssen, dass
unterwegs etwas schief geht. Kann man das so stehen lassen?

Wenn das so stimmt, dann werde ich mich daran machen, meine Events in XML
Strukturen zu packen. XML ist in sofern sinnvoll, als das meine Events
hierarchisch geordent sind und mit einem Event ein ganzer Haufen an
Informationen mitgesendet werden. Ob ich jetzt ein XML Dokument parse oder ob
ich die Syntax meiner eigenes eigenen Protokolls parse ist vermutlich bezüglich
Geschwindigkeit nicht relevant, wohl aber in der Stabilität

Danke nochmal!!

Grüße Boris

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Erik G.
Guest





PostPosted: Tue Jan 31, 2006 3:02 pm    Post subject: [OT] Byteübertragung mit TCP und UDP (Was: Netzwerkprogrammi Reply with quote

Hallo Boris Glawe,

Quote:
ohne Angst haben zu müssen, dass
unterwegs etwas schief geht.

Also ich hab schon auf den unterschiedlichsten Platformen mit TCP und UDP gearbeitet und man kann sich drauf verlassen das die Bytes
auf der anderen Seite so ankommen wie Du sie ursprüglich abgeschickt hast. Wenn Du direkt die platformspezifischen Socketfunktionen
nutzt wirst Du wohl eh mit 'char[]' arbeiten müssen und wenn das XML komplett in ASCII ist dann sehe ich damit auch keine Probleme.
Codierungsprobleme können IMHO erst in den Schichten über TCP/UDP entstehen wenn dort z.B. Nicht-ASCII-Zeichen irgentwie in eine
Bytedarstellung überführt werden und die andere Seite die Rückführung mit einer anderen Codierung erledigt oder wenn 0x41 auf dem
einen System 'A' bedeutet und auf dem Anderen '?'.

Bei TCP und UDP hab ich es noch nicht erlebt das die übergebenen Bytes in irgenteiner Form verändert wurden, das Internet würde wohl
zusammenbrechen wenn sowas vor käme.

Es geht also um die Wandlung XML<>'char[]', da diese immer in Deiner Hand ist bist Du für eventuelle Problem selbst verantwortlich
;-)

Wenn in Deinem XML wirklich nur ASCII-Zeichen drin sind dann sind IMO keine Codierungsprobleme zu befürchten und Du kannst das XML
einfach als 'char[]' abschicken und auf der anderen Seite wieder als 'char[]' entgegennehmen.


Grüße
Erik

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
kanze
Guest





PostPosted: Tue Jan 31, 2006 5:01 pm    Post subject: Re: Netzwerkprogrammierung [etwas OT] Reply with quote

Daniel Albuschat wrote:
Quote:
kanze wrote:
Daniel Albuschat wrote:

Boris Glawe wrote:

Es kann doch nicht sein, dass man für jedes Projekt eine
eigenes Netzwerkprotokoll schaffen muss, indem man erst
einmal die Byteorder, die Kodierung, etc augehandelt
werden müssen!?

Die Byteorder ist immer vorgegeben. Sie ist die Net Byte
Order, in die man mit htons oder htonl konvertiert.
hton{s,l} machen immer das, was du erwartest (also entweder
die Bytes umdrehen, damit sie richtig sind, oder so lassen,
wie sie sind, wenn sie schon richtig stehen, abhaengig von
CPU Architektur).

Das ist quatsch. Darstellung (einschließlich Byteorder) kann
beliebig vom Protokoll bestimmt werden.

Ja, "kann". Ich wuerde Protokolle, die die Host Byte Order
benutzen, aber als seltsam bezeichnen. Aber natuerlich gibt es
auch hierfuer Gruende.

Ich glaube, dass du mir misverstanden hast. Es geht nicht um
Host Byte Order, da es an der Leitung (der "Host") keine Order
gibt. Aber gerade deshalb hat es wenig Sinn, über Net Byte Order
zu reden -- auf dem Netz wird die Darstellung (nicht den Byte
Order) vom Protokoll festgelegt. Am häufigsten (TelNet, SMTP,
NNTP, HTTP...) wird ASCII Text dafür verwendet. ASN.1 BER kommt
auch vor (LDAP). Einige Protokolle der niedrigen Ebenen bzw.
einige älteren Protokolle benutzen nacktes binär,
32 Bit zweier-Komplement -- auf dem Internet (aber nicht
unbedingt anderswo) ist dann meistens High Byte First verwendet.

(In der Tat ist es noch komplizierter, weil auf der Leitung gibt
es kein Bytes, nur Bits. Und fast ausschließlich wird Low Bit
First gesendet. Was heißt, dass wenn du ein 32-Bit Ganzzahl
schickst, dass es in der Reihenfolge 24, 25, ... 31, 16, 17 ...
23, 8, 9 ... 15, 0, 1, ... 7 gesendet wird. Glücklicherweise
braucht man selten darum zu kummern:-).)

Quote:
Unt htonl u.s.w. funktionnieren nur für bestimmten Typen,
und nicht immer auf allen Rechnern. (Vorsicht auf Problemen
von Alignment auf neuen Rechnern.)

Dass sie fuer bestimmte Typen funktionieren... ist halt so.
Aber huh? Nicht immer auf allen Rechnern? Das musst du naeher
erlaeutern.

Na ja, sicher nicht auf einen Unisys 2200. Wo int 36 Bits ist,
und mit einer-Kompliment dargestellt wird. Aber auf meinem
Rechner (beide hier in der Arbeit und zu Hause) sind long 64
Bits -- htonl arbeitet nicht auf long, sondern auf int.

Aber dass stellt nur ein kleines Problem vor. Diese Funktionnen
gibt es gar nicht für Gleitkommatypen. Und auch nicht für long
(auf meinem Rechner).

Diese Funktionnen wandeln eigentlich nicht auf "Net Byte Order"
(wie, wie gesagt, hängt vom Protokol ab), die mappen nur interne
Darstellungen zu und von den Darstellungen XDR. Abgesehen davon,
dass XDR auch 64-Bit Gleitkomma- und Ganzzahl-Typen enthält
(siehe RFC 1014, soweit ich weiß, ist XDR nur im Protokol RPC
verwendet). Und da habe ich auch ein Problem: XDR verlangt nur
eine Ausrichtung der Adressen (oder der Offsets innerhalb eines
Puffers) auf mehrfächer von 4 Bytes -- auf meinem Sparc aber
müssen long long und double auf einem Mehrfach von 8
ausgerichtet werden. Was heißt, dass ich die Werte sowieso
nicht direkt im Puffer benutzen kann.

Quote:
Im Internet benutzen die meisten Protokolle entweder
"Internet-ASCII" (telnet, SMTP, NNTP, HTTP...) oder
ASN.1/BER (LDAP, SNMP...). "Internet-ASCII" ist, wie sein
Name sagt, Text, und ASN.1/BER benutzt zwei unterschiedene
Darstellungen von Ganzzahle, je nach dem.

Err. Ein Byte hat keine Byteorder.

Hat aber eine Bitorder. Ich verstehe aber nicht die Relevanz.

Das Problem beschränkt sich nicht auf der Byte Order. Es geht um
die Darstellung. Heute verwenden die meisten Protokolle eine
Text-Darstellung, genau um Unterschieden in der internen
Darstellung umzugehen.

Weil im Ende geht es um, die Darstellung festzulegen. Und die
Darstellung fasst viel mehr, als nur die Reihenfolge von Bytes.
Auch wenn du eine Text-Darstellung hast, musst du festlegen:
ASCII, UTF-8, ISO 8859-1... oder sogar EBCDIC. (Ich habe schon
auf Protokollen gearbeitet, die EBCDIC verwendet haben. Das war
aber mehr als 20 Jahre her.) Bei binären Protokollen geht es
nicht nur um die Byte-Reihenfolge, sondern auch um die Länge
und die Darstellung negativer Zahlen -- dazu könnte auch
die Ausrichtung berücksichtigt werden. (Wenn du auf den
niedrigen Ebenen der Internet-Protokolle anschaust, wie IP, UDP
oder TCP, wirst du merken, dass Ganzzahlwerte normallerweise 4
Bytes sind, und auch immer auf einem 4-Byte Grenze ausgerichtigt
sind. Als diese Protokolle entwickelt wurden, hat man schon mit
htonl u.s.w. gearbeitet. Heute hat man gelernt, dass das nicht
so eine gute Idee ist.)

Quote:
Genau wie ein Stein alleine nicht in einer bestimmten
Reihenfolge liegen kann. Was ASN.1/BER angeht, weiss ich
nicht, was dadurch genau definiert wird.

Für einfache Dinge würde ich eine einfache Darstellung in
Text definieren.

Eine Zahl ist etwas einfaches. Die wuerde ich bei einem
Netzwerkprotokoll aber, sofern es nicht gravierende Nachteile
haette, niemals als Text definieren.

Es gibt einen guten Grund, aber, warum man immer häufiger
Text-Formatte bevorzieht. Es ist halt wesentlich einfacher, sie
zu entwickeln. Wenn man Zeilenorientiert arbeitet, mit
Network-ASCII, kann man sogar mit Telnet testen. Ich wurde nur
bei zwingenden Grunden einen nicht-Text Protokoll verwenden.

Quote:
Und die Kodierung ist sowieso im XML Dokument hinterlegt!
Zumindest in einem richtigen (tm). Also musst du hier nichts
aushandeln.

Irgendwo wohl. Wenn ich eine XML Datei in JIS bekomme, muss
ich es lesen können.

Da er aber beide Seite beherrscht, braucht er nicht
unbedingt alle der Möglichkeiten vorzusehen.

Wahrscheinlich werden die Infos sowieso nicht ueber das hinaus
gehen, was in ASCII passt.

Kommt darauf an. In Deutschland oder in Frankreich kommen
akzentierten Zeichen häufig vor. (Wenn ich nicht willkurliche
Benutzerdaten übertragen muss, würde ich aber wohl versuchen,
nur reine ASCII zu benutzen.)

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
kanze
Guest





PostPosted: Tue Jan 31, 2006 5:02 pm    Post subject: Re: Netzwerkprogrammierung [etwas OT] Reply with quote

Olaf Krzikalla wrote:

[...]
Quote:
Es kann doch nicht sein, dass man für jedes Projekt eine
eigenes Netzwerkprotokoll schaffen muss, indem man erst
einmal die Byteorder, die Kodierung, etc augehandelt werden
müssen!?

Mit 'Netzwerkprotokoll' meinst Du jetzt die Schicht über TCP
und Co. (diese Schichten haben Nummern, TCP gehört zur
dritten Schicht)?

Nur eine Kleinigkeiten, aber TCP gehört zur vierten.

Die Schichten haben sogar Namen, und nicht nur Nummern. Es gibt
sieben ins gesamt. Wenn man aber über Sockets arbeitet, muss man
nur um die drei obersten kummern; das Betriebssystem kummert
sich um die unteren vier: Session, Presentation und Application.
Wieviel man darum kummern muss, kommt darauf an -- wenn es um
eine Verbindung, die nur zwischen zwei bekannten Rechnern auf
demselben Lokalnetz bindet, kann man oft zum Beispiel die
Session-Schicht nachlassen.

Man kann sich auch freilich auf existierenden Protokollen
basieren. Z.B. Internet-ASCII oder XDR (oder XML -- ist aber
viel, viel aufwendiger) für die Presentation-Schichte, oder
mindestens einen Teil davon.

Quote:
Diese Rad scheint aber schon erfunden zu sein.

Schon öfters.

"The nice thing about standards is that there are so many to
choose from." Habe ich schon irgendwo gelesen.:-)

Quote:
Dein Problem ist IMHO, dass Du eigentlich über 2 Schichten
nachdenken willst. Schau Dir nur mal die 4.Schicht im deutschen
Wikipedia-Eintrag zu TCP/IP an.

Die vierte Schicht *ist* TCP (oder UDP, je nach dem). Wenn es
anders im Wikipedia steht, dann ist es ein Fehler.

Sofern möglich soll er aber freilich eine existierende
Presentation-Schicht benutzen, und nicht seine eigene
entwickeln. (Ich weiß nicht, ob es noch dem Fall ist, aber in
der Zeit hat Dietmar Kühl eine Implementierung eines XDR-Strom
zur Verfugung gestellt.)

Wenn man mit C++-Streams arbeitet, unter einem Betriebssysteme
mit Sockets, kann man sagen, dass den streambuf um das Socket,
und also um die erste vier Schichte kummert, und der
[io]Xxxstream um die Schichte sechs, also die Darstellung (was
man auch Formattierung nennen könnte). Die Session-Schichte,
wenn nötig, steckt man irgendwo dazwischen, meistens als
zusetzliche Funktionnen des [io]stream bzw. des streambuf. (Man
könnte die Funktionnen filebuf/[io]fstream::open bzw.
filebuf/[io]fstream:close dieser Schichte assimilieren.) Die
Applikations-Schichte ist dann die Applikation, die der Strom
verwendet.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.