TCP
-
oder du nimmst sockets/die api des betriebssystems das du verwendest
für sockets gibts bei www.c-worker.ch ein gutes einführendes tutorial
-
Hi, ich habe zu den Thema noch eine kleine Frage (eigendlich sinds´es genauer betrachtet 2):
ich sende mit
cin >> buf;
send(s,buf,strlen(buf),0);
einen String zum Server, aber dort kommen, je nach den enthaltenen Leerzeichen mehrere Pakete an. zB ich geben per Tastatur bem client ein "ist nur ein test", dann kommen beim Server 4 Pakete an, wie kann ich das verhindern?Wie checke ich bei einem Client den Paketbuffer, ob eins anliegt, welches ich dann mit recv empfangen kann?
MfG
Ifi
-
Du musst erstmal was wichtiges verstehen: TCP kennt und hat keine Pakete. TCP ist streambasiert (es ist ein Datenstrom ohne 'Anfang' oder 'Ende'). 'Pakete' sind bei TCP wenn dann auf Layer 5-7 realisiert - d.h. es werden Pakete auf den Stream raufgeprägt und wieder geparst (ein Protokoll).
Also solltest Du erstmal sagen, welches Protokoll Du mit dem Server sprechen willst. Ich gehe mal davon aus, dass Du HTTP reden willst? Bei HTTP wüsste ich spontan nicht, wie Pakete terminiert werden. Versuch mal, mit CR (LF) zu beenden. Ansonsten TCP Half-Close. Oder Du liest die entsprechende RFC dazu:
http://www.faqs.org/rfcs/rfc2616.html
Du brauchst aber nur die Get-Methode, lass dich von dem Rest nicht verschrecken.Wenn Dir das alles nichts sagt und kompliziert ist, solltest Du Dich etwas mehr mit Sockets befassen. Das ist leider nötig dafür.
Das klärt hoffe ich deine erste Frage.
Zu 2.:
Schau Dir mal select an. Damit kannst Du testen, ob ein Socket lesbar oder schreibbar ist. Achte darauf, nicht zu pollen (d.h. ständig und ohne Pause immer wieder select aufzurufen - das ist Verschwendung von Rechenzeit)
-
IFI ManiA schrieb:
ich sende mit
cin >> buf;
send(s,buf,strlen(buf),0);cin>>buf liest nur bis zum nächsten ' ' oder 'Return'. d.h. du musst:
cin.getline(buf,1000);
benutzen. dann kommt afaik alles zusammen an. ich arbeite auch mit wsock und hab bisjetzt nie probs gehabt.
-
ein speziellles Protokoll will cih nicht verwenden. Mein server/client basiert auf dem c-worker tutorial. nur eben auf meine bedürfnisse angepasst. Die Übertragung funktinioiert auch soweit bis auf das problem, dass jedes leerzeiches als neuer string ausgewertet wird.
Übertragen werden soll ja nur ein einfacher String als position für ein multiplayergame, bzw chattexte.PS: @ lars: danke, cih werde es mal versuchen
PPS: ganz scheint es nicht zu funktionieren, die Tastatureingabe funktioniert nicht. Kann das sein, dass es am borland5.5 compiler liegt?
-
Tja, da merkst Du die erste Schwierigkeit: Du weißt nicht, wie Du Leerzeichen übertragen sollst. Daraus Schlussfolgern 2 Punkte:
1. : Du hast ein Protokoll. Und zwar arbeitet es mit Leerzeichen-Trennung.
2. : Du musst Dein Protokoll erweitern, um Leerzeichen übertragen zu können, ohne dein Protokoll aus dem 'Takt' zu bringen.Überleg mal, vielleicht fällt Dir ja eine Idee dazu ein
Ansonsten frag einfach nochmal.
Edit:
Ich hab deine erste Frage nur flüchtig überflogenLars hat natürlich mit seiner Lösung schonmal recht. Allerdings musst Du Dich immernoch darauf einstellen, dass Du ein besseres Protokoll brauchst (Du hast schon eins, aber kein zuverlässiges).
-
ich denke schon, dass es an der eingabeprozedur hängt, als ich den client mit winapi und editfeldern gemacht habe, hat es einwandfrei funktioniert. Nur ich habe lange nix mehr mit Konsolenanwendungen gemacht ...
Áber ich kann mir ehrlich gesagt nicht vorstellen, dass es am compiler liegt, da der compiliervorgang ohne fehler und warnungen verläuft.Oder kann es daran liegen, dass strlen() an dieser stelle nicht richtig das gewünschte ergebnis liefert? gibt es eine alternative zu strlen??
PS: habs nochmal getestet, indem ich beim senden die länge nicht mit strlen(buf), sondern einfach 256 eingegeben habe, jetzt funktionierts, aber kann ich die länge trotzdembeschneiden? ich benutze wieder cin >> ... weil cin.getline irgendwie nicht zu funktinieren scheint.
-
Ääähm...
string str; getline( cin, str, '\n'); send( s, str.c_str(), str.size(), 0);
Und btw, benutzt Du Borland 5 oder MS VC++ 6? Die haben beide nen Bug im getline.
-
jup, ich nutze von Borland den Freeware Comandline Compiler 5.5 .
ich werde einfach eine eigene lengthfunction schreiebn, dann hab ich Ruhe :), indem ich von hinten die chars abchecke und warte, bis -kein leerzeichen kommt
Funktioniert zwar auch, wenn ich konstant 256 zeichen schicke, aber ich will den Datenfluss soweit wie möglich reduzieren.
-
oder einfach mingw benutzen!