Clientsockets aus der vhlib
-
volkard schrieb:
virtuell Realisticer schrieb:
wie lange hat es gedauert, bis du bemerkt hast, daß dein compiler das schlüsselwort switch gar nicht kennt?
Das habe ich nicht verstanden, bitte um Erklaerung.
kann dein compiler switch? woher weißte das? du hast dich sicherlich seizt dem letzten compilerupdate das wort switch gar nicht benutzt. ich meinte das als beispiel für was sehr seltenes.
Ok, jetzt hab ichs
mfg
v R
-
virtuell Realisticer schrieb:
Ich bin im Designen so unwahrscheilich schlecht.
unfug.
alle sind von natur aus im designen unwahrscheinlich schlecht.das ist genau wie mit dem gedichte-schreiben. wobei ich mal eher die klassischen gedichte meine, die sich reimen, die einem nahe gehen und dennoch nicht unanständig sind. manch ein modernes gedicht ist ja offensichtlich hingekotzt und die geschickte wird auch entsprechend richten. den dichtern fließt auch nicht einfach ein meisterwerk nach dem anderen aus der feder, sondern es ist echt arbeit. unendliches gefummele und ausprobieren. den guten dichter macht zunächst nicht aus, daß er ein glückliches händchen hat, obwohl das erstens sehr hilfreich ist und zweitens sich sich auch mit jahrzehntelangem training auch einigermaßen ausbildet, sondern der qualitätsanspruch des dichters. das schlagwort der "brotlosen kunst" drängt sich auf. für auftragsprojekte kannste einfach nicht sehr breit suchen und nachher was haben, von dem du echt überzeugt bist (außer der auftraggeber wünscht genau das, aber ist sehr selten).
und die leute, die von sich sagen, daß sie gut designen können, sind sehr gut vergleichbar mit den leuten, die auch sagen, daß sie gute Moderatoren wären. wer um mod-rechte bettelt, ist mit sicherheit kein guter mod. und wer drum bettelt, designen zu dürfen, der kann mit sicherheit nicht coden. und ich kenne ach, so viele, die in irgendwelche projektleiterstellungen schlüpfen wollen, weil sie ihr info-diplom haben aber nicht coden können (nach eigenen messungen können 3/4 von denen nichtmal doppelten dreisatz!).
dich kenne ich jetzt recht lange aus dem forum und wenn ich in der lage wäre, dich oder einen wildfremden einzustellen, dannn würde ich dich nehmen, egal, welche diplomnote der andere hätte. auch, wenn wir mal unterschiedlicher meinung sind, so ist doch immer wieder klar, daß du die meinungen nicht nur "fühlst", sondern "erdenkst". kannst sie außerdem vertreten und bisher übersehene gegenargumente einbauen.
sag lieber sowas wie
virtuell Realisticer schrieb:
Ich bin im Designen zwar deutlich überdurchschnittlich, aber zu schlecht für meine eigenen Maßstäbe.
-
kannst du vielleicht immer mal wieder ne neue version hochladen?
-
neueVersion.rar schrieb:
kannst du vielleicht immer mal wieder ne neue version hochladen?
jo. immer unter dem gleichen namen vhlib.rar
hab gerade den aktuellen stand hochgeladen. compiliert zwar nicht, aber man sieht die weiteren absichten.neu:
Range.h
klasse zum speichern von begin-end-paarenString.h
klasse String (so simpel wie möglich)
und StringLiteral (naja, es hat mich übermannt)und der Reader hat getLine() gelernt, damit ich bald die zeilen einer http-request lesen darf.
-
Sicher, dass es der gleiche Link ist? In der Datei befindet sich bei mir keine
Range.h oder String.h.mfg
v R
-
-
hier schrieb:
?
Ah, bin von dem anderen Link (neueVersion.rar) ausgegangen, danke
mfg
v R
-
virtuell Realisticer schrieb:
Ah, bin von dem anderen Link (neueVersion.rar) ausgegangen
damit es spannend bleibt, ändere ich schon wieder den dateinamen.
in http://volkard.de/vhlib.tar.bz2zum einen packt .tar.bz2 besser als .rar, zum anderen sind bzip2.exe und tar.exe auch für win einfach zu beschaffen und ich brauche keine fallunterscheidung im makefile. und wie ich mir berichten ließ, haben die meisten unter win ja WinZIP oder WinRar oder sowas drauf, daß sie auch so schon .tar.bz2 lesen können.
neu:
cin und cout sind nicht mehr zwei objekte, sondern nur zwei referenzen auf die selbe konsole.credits.cpp, wo ich aufliste, wer alles geholfen hat.
und die sache compiliert endlich wieder durch und liest und zeigt ne web-page an.
-
Zumindest von WinRAR weiss ich, dass es bz2 beherrscht.
Weisst du jetzt schon, wie du das mit den Sockets machen willst? Wenn ich mich
noch recht entsinne und so lange war es ja noch nicht her, dann wollteste
SocketServer auch nicht so recht. Also am besten fuer beides Socket.Waere hier vielleicht ein Template angebracht? Also dass ich sowas schreibe:
Socket<Client> clientSocket; Socket<Server> serverSocket;
Oder Sieht das eher bloed aus? Oder sollte das vielleicht doch ganz anders
genannt werden? Vielleicht TCPSocket und UDPSocket (ja udp haben wir ja auch
noch und so ganz selten wird es ja auch nicht genutzt)?Nun aendert sich bei TCPSocket und UDPSocket ja nicht so wahnsinnig viel. Also
koennen wir auch dahergehen und sagen, ich gebe beim CTor an, welche Art von
Socket ich haben will.Ich habe mal in meinem Abschlussprojekt ein Enum von Protokollen gemacht, so
dass der Enum auch der entsprechenden internationalen Protokollnummer
entspricht. Sicherlich auch einiges dabei, was man nicht brauchen wird, aber
wenn du magst, kann ich dir das mal zukommen lassen und du schaust es dir
einfach mal an.Hab dafuer auch noch eine Klasse gemacht, die einen Protokollstring (z. B. TCP)
in den entsprechenden Enum mapped. Naja, das ist allerdings nicht so toll
programmiert ;).Also falls du daran interesse hast, einfach kurz Bescheid sagen, dann schick
ich dir das und du kannst dir den grauenhaften Code mal anschauen :p.Aber jetzt bin ich ja wieder vom Thema abgeschweift. Also eigentlich braeuchten
wir ja wirklich nur Socket, denn was macht denn ein ServerSocket anderes als
ein ClientSocket?Nun der ServerSocket ruft nunmal kein connect, sondern bind und listen auf und
ausserdem macht er noch accept.Und der ClientSocket, der ruft nur connect auf und recv und send machen beide.
Aber wie das nun gescheid trennen?
mfg
v R
-
virtuell Realisticer schrieb:
Waere hier vielleicht ein Template angebracht? Also dass ich sowas schreibe:
Socket<Client> clientSocket; Socket<Server> serverSocket;
nee. das schmerzt mich. und es ist nix anderes als ClientSocket und ServerSocket.
Vielleicht TCPSocket und UDPSocket (ja udp haben wir ja auch
noch und so ganz selten wird es ja auch nicht genutzt)?UDP biete ich bis auf weiteres gar nicht an. ich hab's noch nie gebraucht.
Nun aendert sich bei TCPSocket und UDPSocket ja nicht so wahnsinnig viel. Also koennen wir auch dahergehen und sagen, ich gebe beim CTor an, welche Art von Socket ich haben will.
ich denke, die schnittstelle ist schon sehr anders. aber ich mach eh keine UDP-sockets.
Ich habe mal in meinem Abschlussprojekt ein Enum von Protokollen gemacht, so dass der Enum auch der entsprechenden internationalen Protokollnummer entspricht.
win möchte eh, daß ich den port oder service-namen als string übergebe.
Socket s("192.168.1.1","http");
mal abwarten, was linux da zu bieten hat.
Hab dafuer auch noch eine Klasse gemacht, die einen Protokollstring (z. B. TCP) in den entsprechenden Enum mapped. Naja, das ist allerdings nicht so toll programmiert ;).
falls linux nicht sowas schon hat, kann ich den mapper brauchen, damit ich ne einheitliche schnittstelle habe. ich melde mich gegebenenfalls bei dir.
Aber jetzt bin ich ja wieder vom Thema abgeschweift. Also eigentlich braeuchten
wir ja wirklich nur Socket, denn was macht denn ein ServerSocket anderes als
ein ClientSocket?
Nun der ServerSocket ruft nunmal kein connect, sondern bind und listen auf und
ausserdem macht er noch accept.ähm. das ist doch ein Riesenunterschied. dewr usewr darf doch nicht auf einem Clientsocket einfach mal accept aufrufen können.
Und der ClientSocket, der ruft nur connect auf und recv und send machen beide.
eigentlich gibt es drei sockets.
ClientSocket: macht connect
ServerSocket: wird von accept erzeugt
ListeningSocket: ist halt der, der am port lauscht und die ServerSockets erzeugt.zusammenfassen konnte ich ClientSocket und ServerSocket gut. die haben nur verschiedene konstruktoren aber die haben << und >> gemeinsam und auch den gleichen destruktor (mit shutdown() und closesocket()).
der ListeningSocket ist ne eigene klasse, sie hat ja so vieles anders. anderer ctor, anderer dtor, keine op<< und op>>, aber dafür accept. alles ist da anders, außer ::socket() und ::closesocket().
und ich nehme als namen ListeningSocket oder SocketListener oder PortListener oder was weiß ich. egal, was ich jetzt nehme, in nem halben jahr ändere ich eh meine meinung wieder. *g*
aber die andere sorte nene ich einfach nur Socket. egal, ob der clientseitig oder serverseitig verwendet wird.
-
volkard schrieb:
virtuell Realisticer schrieb:
Waere hier vielleicht ein Template angebracht? Also dass ich sowas schreibe:
Socket<Client> clientSocket; Socket<Server> serverSocket;
nee. das schmerzt mich. und es ist nix anderes als ClientSocket und ServerSocket.
Vielleicht TCPSocket und UDPSocket (ja udp haben wir ja auch
noch und so ganz selten wird es ja auch nicht genutzt)?UDP biete ich bis auf weiteres gar nicht an. ich hab's noch nie gebraucht.
Was aber doch nicht heissen sollte, dass man dem User die Moeglichkeit es zu
benutzen verweigern sollte, oder? Wie leicht waeren die Aenderungen zu machen,
es nachtraeglich einzubauen?Nun aendert sich bei TCPSocket und UDPSocket ja nicht so wahnsinnig viel. Also koennen wir auch dahergehen und sagen, ich gebe beim CTor an, welche Art von Socket ich haben will.
ich denke, die schnittstelle ist schon sehr anders. aber ich mach eh keine UDP-sockets.
Ich habe mal in meinem Abschlussprojekt ein Enum von Protokollen gemacht, so dass der Enum auch der entsprechenden internationalen Protokollnummer entspricht.
win möchte eh, daß ich den port oder service-namen als string übergebe.
Socket s("192.168.1.1","http");
mal abwarten, was linux da zu bieten hat.
Kein Problem: getservbyname bzw. getservbyport sind dein Freund :).
Hab dafuer auch noch eine Klasse gemacht, die einen Protokollstring (z. B. TCP) in den entsprechenden Enum mapped. Naja, das ist allerdings nicht so toll programmiert ;).
falls linux nicht sowas schon hat, kann ich den mapper brauchen, damit ich ne einheitliche schnittstelle habe. ich melde mich gegebenenfalls bei dir.
Was ja dank o. genannter Funktionen doch wieder unnoetig geworden ist :).
Aber jetzt bin ich ja wieder vom Thema abgeschweift. Also eigentlich braeuchten
wir ja wirklich nur Socket, denn was macht denn ein ServerSocket anderes als
ein ClientSocket?
Nun der ServerSocket ruft nunmal kein connect, sondern bind und listen auf und
ausserdem macht er noch accept.ähm. das ist doch ein Riesenunterschied. dewr usewr darf doch nicht auf einem Clientsocket einfach mal accept aufrufen können.
Ja richtig, da hab ich nicht richtig nachgedacht.
Und der ClientSocket, der ruft nur connect auf und recv und send machen beide.
eigentlich gibt es drei sockets.
ClientSocket: macht connect
ServerSocket: wird von accept erzeugt
ListeningSocket: ist halt der, der am port lauscht und die ServerSockets erzeugt.Ah ok, das hoert sich gut. Also ich kann dann sowas wie
ServerSocket servSock = listeningSocket.accept();
schreiben und dann schoen damit weiterarbeiten.
Aber: Unser bind und listen kommt dann natuerlich in ListeningSocket und nicht
in ServerSocket. ServerSocket ist hier nichts anderes als die Verbindung zum
Client, der eine Anfrage an den Dienst, auf dem ListeningSocket horcht,
gesendet hat. Also wenn dem so ist, dann ist ServerSocket auch wieder nur ein
Socket.zusammenfassen konnte ich ClientSocket und ServerSocket gut. die haben nur verschiedene konstruktoren aber die haben << und >> gemeinsam und auch den gleichen destruktor (mit shutdown() und closesocket()).
Wenn du einen ListeningSocket hast, dann ist ClientSocket == ServerSocket, denn
bind und listen wird nicht vom ServerSocket gemacht und dieser bietet auch gar
kein accept an, sondern wird vom letzteren erzeugt. Wir haben also doch nur
einen normalen Socket, das andere erledigt ListingSocket.der ListeningSocket ist ne eigene klasse, sie hat ja so vieles anders. anderer ctor, anderer dtor, keine op<< und op>>, aber dafür accept. alles ist da anders, außer ::socket() und ::closesocket().
und ich nehme als namen ListeningSocket oder SocketListener oder PortListener oder was weiß ich. egal, was ich jetzt nehme, in nem halben jahr ändere ich eh meine meinung wieder. *g*
Aber bis dahin haben wir ja noch ein bisschen Zeit :D.
aber die andere sorte nene ich einfach nur Socket. egal, ob der clientseitig oder serverseitig verwendet wird.
Ah, also doch nur zwei Klassen. Aber ich hoffe ich habe das gut nachvollzogen ;).
mfg
v R
-
volkard schrieb:
damit es spannend bleibt, ändere ich schon wieder den dateinamen.
in http://volkard.de/vhlib.tar.bz2zum einen packt .tar.bz2 besser als .rar, zum anderen sind bzip2.exe und tar.exe auch für win einfach zu beschaffen und ich brauche keine fallunterscheidung im makefile. und wie ich mir berichten ließ, haben die meisten unter win ja WinZIP oder WinRar oder sowas drauf, daß sie auch so schon .tar.bz2 lesen können.
Find Ich klasse, brauch mich endlich nicht mehr mit unrar rumquälen.
Was mich sonst noch interessieren würde ist, warum "baust" du die vhlib?
Das einzige was Ich mitbekommen habe ist das du die Std-Bibliothek nicht benutzen möchtest. Aber warum?
Erzähl mal ein bisschen, bitte.
-
Unter Linux gibts doch auch getaddrinfo und getnameinfo
-
v6 schrieb:
Unter Linux gibts doch auch getaddrinfo und getnameinfo
Stimmt, damit waeren wir auch protokollunabhaengig.
mfg
v R
-
Socket s("192.168.1.1","http");
ist es eigentlich irgendwo dokumentiert welche protokolle getaddrinfo kennt?
-
80 schrieb:
Socket s("192.168.1.1","http");
ist es eigentlich irgendwo dokumentiert welche protokolle getaddrinfo kennt?
Ich weiß nicht ob POSIX da etwas vorschreibt. Aber unter /etc/protocols kannst du die Protokolle einstellen.
-
Konrad schrieb:
Was mich sonst noch interessieren würde ist, warum "baust" du die vhlib?
Das einzige was Ich mitbekommen habe ist das du die Std-Bibliothek nicht benutzen möchtest. Aber warum?
Erzähl mal ein bisschen, bitte.ich mag tolle sachen. und wenn etwas das prädikat "nicht toll" verdient hat, dann die standard-lib von c++.
bereits den anfänger nervt es, daß headers keine extension haben. der editor verzchtet deswegen aufs systax-highlighting, der packer packt nicht mehr toll. dann der verzicht auf großbuchstaben mit der folge vermehrter namenskollission. das weglassen von get/set, womit kein arsch wissen kann, ob foo.begin() das foo anfangen läßt oder ob's den anfang zurückliefert. und das sind nur die offensichtlichsten sachen.
subtiler ist, daß die streams default-konstruktoren haben und lebende und zugleich ungültige zombie-streams existieren können. daß der default-ctor von vector keinen speicher allokiert, daß delete(0) legal ist, daß assert keine exception wirft, daß die streams hoffnungslos verkompliziert sind, daß vector nur freispeicher mag und damit prinzipiell zu lahm für kleine aufgaben ist, daß die baume aufwärtszeiger haben, daß man irgendwe immer wieder gezwungen wird, zeiger zu nehmen, wo man gar keine zeiger haben mag, sondern objekte, und daß man dann zu smart-pointers gezwungen wird und sich auf einmal fragt, warum das in C schneller ging.ich mach mal das verzeichnis mit den standard-headers auf und meckere alle ab.
algorithm
jo, die ist gut. supi.bitset
ist kein zufall, daß ich seit jahren ne eigene klasse BitField habe.complex
naja, stört nicht.template<typename _Tp> inline complex<_Tp> operator-(const _Tp& __x, const complex<_Tp>& __y) { complex<_Tp> __r(__x, -__y.imag()); __r.real() -= __y.real(); return __r; }
deque
die ist auch ganz ok.exception
why gibt nen string aus, der irgendwie mit new speicher holt? oder einen char*, der vielleicht static ist? warum kann sich die exception nicht in einen stream schreiben und wer echt nen string haben muss, läßt sich in nen stringstream schreiben?fstream
default-ctor. komische sachen wie ios::append. private erblichkeit für coole hacks. unduchsichtig. wer braucht eigentlich locales?functional
ausgetobt mit exceptions, aber weitgehend ohne praktischen nutzen? ok, nehmen wir mal an, wir hätten wenigstens typeof verfügbar.iomanip
entweder klickibunti oder konsole unformatiert. iomanip zum formatieren braucht man eigentlich nicht. was macht iomanip noch?ios
iosfwd
daß <iosfwd> nötig wurde, sagt was über andere headers aus.iostream
eigentlich ein sehr komischer name für eine datei, die nur cin, cout, cerr und clog berreitstellt.istream
iterator
mal schauen, ob ich sowas brauchen werde. ich hoffe, es ist nicht nötig.limits
ok.list
zu schwach. man braucht wenigstens einfach-verkettete liste als stack und als queue, doppelt verketteten ring und dazu jede sorte nochmal als intrusive version.locale
wer braucht das?map
avl-tree mit aufwärtszeigern. wozu sind die aufwärtszeiger gut? und die schnittstelle ist umständlich wenn man speed will und teuer wen man [] schreiben will.memory
?(ein paar ausgelassen)
stack
ganz schlimmes ding. man mag stack nicht benutzen. es tut einem weh.string
copy-on-write ist out. wegen weil wir ganz viel multithreading machen wollen und weil wir nix locken wollen. und weil die allokatoren schneller geworden sind.typeinfo
schade, daß man zu einem sprachmittel gleichzeitig die klasse exception kaufen muss. das erinnert mich stark an java, wo string-literale von objekt erben.vector
zu teuer. es fehlt die alternative für statischen speicher, es fehlt reinkonstruieren statt reinkopieren mit push_back.ist alles nichts schlimmes. aber so alles zusammen nervt's dann doch ein wenig. und ich hab im moment viel zeit. und ich lerne viel dabei. allerdings auf die gefahr hin, daß ich nächstes jahr gar nicht mehr mit normalem c++ arbeiten kann.
-
volkard schrieb:
bereits den anfänger nervt es, daß headers keine extension haben. der editor verzchtet deswegen aufs systax-highlighting.
Dann würd ich mir einen vernünftigen Editor oder IDE besorgen?
VC++2003 zeigt mir sogar in Realtime dynamisch Hilfetexte aus der MSDN an, wenn ich mich mit dem Cursor im Source bewege. (da ist Syntax Highlightning ein Witz gegen)
Beispiele? Hier:
http://www.kharchi.de/vcpp2003/dynhelp.png
http://www.kharchi.de/vcpp2003/dynhelp2.png
http://www.kharchi.de/vcpp2003/dynhelp3.pngC++ sollte man es nicht in die Schuhe schieben, nur weil einige Editoren oder IDEs micht mächtig genug sind.
-
Artchi schrieb:
volkard schrieb:
bereits den anfänger nervt es, daß headers keine extension haben. der editor verzchtet deswegen aufs systax-highlighting.
Dann würd ich mir einen vernünftigen Editor oder IDE besorgen?
VC++2003 zeigt mir sogar in Realtime dynamisch Hilfetexte aus der MSDN an, wenn ich mich mit dem Cursor im Source bewege. (da ist Syntax Highlightning ein Witz gegen)
Beispiele? Hier:
http://www.kharchi.de/vcpp2003/dynhelp.png
http://www.kharchi.de/vcpp2003/dynhelp2.png
http://www.kharchi.de/vcpp2003/dynhelp3.pngC++ sollte man es nicht in die Schuhe schieben, nur weil einige Editoren oder IDEs micht mächtig genug sind.
Gut, wo du ja jetzt bezueglich volkards gesagtem uns gezeigt hat, wie das
Syntaxhighlighting in einer std-Header ausschaut, koennen wir ja jetzt wieder zum
Thema ueber die Sockets in der vhlib zurueckkommen, oder?mfg
v R
-
Artchi schrieb:
volkard schrieb:
bereits den anfänger nervt es, daß headers keine extension haben. der editor verzchtet deswegen aufs systax-highlighting.
Dann würd ich mir einen vernünftigen Editor oder IDE besorgen?
die ide kennt eine liste von dateinamen, die als C++-Source interpretiert werden sollen. na, klasse. was ein trick. helau!
es ändert nix daran, daß das weglassen der dateinamenerweiterung eine größliche fehlentscheidung war. wieviele jahre wird es dauern, bis sich alle ides angepaßt haben? und dann gibts noch den explorer, woher soll der den dateityp kennen? andere explorer? ja, auch ein ftp-uploader, der anhand der erweiterung den binary-modus setzt oder nicht (also *.pl, *.cgi als ascii und *.jpg als binary). soll der raten?VC++2003 zeigt mir sogar in Realtime dynamisch Hilfetexte aus der MSDN an, wenn ich mich mit dem Cursor im Source bewege. (da ist Syntax Highlightning ein Witz gegen)
wegen solcher sachen benutze ich das VS nicht mehr. mit notapad, einem makefile und ein ganz wenig framework hat man inzwischen mehr spaß, als mit dem VS. als es angefangen hat, daß der focus ins fehlermeldungendfenster geht, statt im source-fenster zu bleiben, isses für mich gestorben. und es wird immer schlechter.
C++ sollte man es nicht in die Schuhe schieben, nur weil einige Editoren oder IDEs micht mächtig genug sind.
kannste mir sagen, weshalb die erwreiterungen abgeschafft wurden? kannste mir einen vernünftigen weg zeigen, wie ein ftp-uploader den dateityp erkennt, wenn auf einmal jeder keine erweiterungen mehr benutzt?
kannst dich ja noch auf den standpunkt stellen, daß würde nur c++ betreffen und für die paar files könne man ne feste liste machen. aber erstens ist das weit gefehlt, weil die compilerbauer mehr files bauen als im standard vorgeschrieben ist und die files machen sie sinnvollerweise ohne erweiterungen. und dann würde die dateityperkennung sogar wissen müssen, welchen compiler in welcher version du drauf hast. nein mehr noch, was ist, wenn jemand mehrere compiler benutzt? und wenn die anderen communitoes mit dem gleichen recht anfangen, ihre erweiterungen fallenzulassen, dann ist aber schluß mit lustig. dem mp3-player ist egal, wie die datei heißt. und mit meinen hard-rock-kumpels spiele ich hier im keller songs mit feinen namen wie iostream oder new. da guckste! und die ide guckt auch, wenn sie ein 12M großes lied aufmachen soll und gerade nachdenkt, welcher schwachmat denn so viel code in eine datei packt. aber die ersten zeichen bis zum eof werden lustig eingefärbt. wenigstens etwas.wie war nochmal dein argument gegen dateinamenerweiterungen? man soll sie abschaffen, weil es ides gibt, die sie nicht brauchen?