Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
27.11.2002, 15:09
JP



Ich habe angefangen mit meinen neuen winsock "kenntinssen" einen kleinen instant messenger in der cmd zu
programmieren, das hat bis jetzt auch wunderbar geklappt, abet ich find einfach keine möglichkeint
nachrichten mit leerzeichen zu versenden...
bis jetzt habe ich es immer mit einem "char array" und der "send (SOCKET s,const char FAR * buf,int len,int flags);"
funktion versucht, aber wenn ich z.b. als nachricht eingebe: Hallo wie gehts? sendet er :

hallo
wie
gehts?

kann mir einer helfen?

[edit]:

ach, noch ne frage, wie kann ich was in der registry eintragen, oder einfach in ein verzeichnis kopieren?
Sprache:(c++)

[/edit]

--

Free your mind and your ass will follow!


Dieser Beitrag wurde am 27.11.2002 um 15:28 von JP bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
001
27.11.2002, 16:24
Prefect



send() sendet einen Stream, das heißt eine Folge von Bytes. Wenn du send() anweist, "Hello World" (Länge: 11) zu senden, dann werden auch 11 Bytes gesendet.

recv() dagegen empfängt einen Stream, d.h. eine Folge von Bytes. Bei TCP empfängt recv() alle Bytes, die gesendet wurden, und es empfängt sie auch in der selben Reihenfolge. Allerdings ist die Aufstückelung der einzelnen Rückgaben von recv() nicht vorhersehbar.
Beispiel: Du sendest zuerst 6 Bytes "Hello " (mit Leerzeichen) und dann 5 Bytes "World". Nun kann es sein, daß recv() alle 11 Bytes auf einmal empfängt. Es kann aber auch sein, daß es zuerst 1 Byte "H" empfängt und dann erst die restlichen 10 Bytes "ello World".

Letztendlich hast du also wohl eher ein Verständnisproblem was die Funktion vom Netzwerk angeht. Wenn du einzelne Strings versenden willst und die Grenzen der Strings beibehalten mußt, dann mußt du zusätzliche Informationen schicken um deutlich zu machen, wo die Stringgrenzen sind. Dazu gibt es zwei Möglichkeiten: Entweder du schickst die Länge des Strings vor dem eigentlichen String, oder du verwendest ein Delimiterzeichen. Wenn du nur Strings verschickst bietet sich letzteres an, da C-Strings schon Delimiterzeichen (nämlich \0) verwenden. Dazu sendest du mit send() einfach nicht nur strlen(string) Bytes, sondern strlen(string)+1 Bytes um die abschließende \0 mitzuschicken.
Auf der Empfängerseite mußt du dann ein allerdings verhältnismässig komplexes Bufferingsystem aufbauen: Jedesmal, wenn du ein paar Bytes mit recv() empfangen hast hängst du sie an einen Puffer an. Dann durchsuchst du den Puffer, ob schon ein \0-Zeichen angekommen ist. Wenn nein, recv() noch einmal. Wenn ja, hole den String aus dem Puffer und lösche den String aus dem Puffer, z.B. indem du alle Daten, die noch im Puffer verbleiben um strlen(string+1) Bytes nach vorne verschiebst.

Registry eintragen: MSDN durchsuchen.
In Verzeichnis kopieren: Naja, im Prinzip mußt du dafür einfach eine Datei im Zielverzeichnis öffnen und Daten in diese Datei schreiben. Wenn die Daten aus einer anderen Datei in einem anderen Verzeichnis kommen, dann hast du die Datei effektiv kopiert. Ja nach OS gibt es aber auch Funktionen, die die Kopierfunktion gleich für dich erledigen.

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
002
27.11.2002, 17:33
JP



du hast mich glaube ich falsch verstanden perfect... bzw ich habs schlecht erklärt...

cin>>buffer;
rc=send(s,buffer,strlen(buf)+1,0);

auf der anderen seite:

rc=recv(connectedSocket, buf, 128, 0);
cout<<buf<<endl;

so sieht das innere der schleife aus, und ich bin der meinung, das er schon beim "cin>>buffer" befehl einen fehler macht und nicht beim senden, ich weiss nicht ob du recht hast, aber bei meinem vorherigen programm (einem texterschlüssler) hatte ich das selbe
problem, ohne send und recv...
ich glaube er macht:

cin>>buffer; [eingabe: hallo <enter> wie <enter> gehts? <enter> ]

bei dem verschlüssler hat er nämlich wenn man als Text "hallo wie gehts" eingab
als text "hallo" und als schlüssel "wie" genommen, obwohl:

char Text[256];
...
cin>>Text;
cin>>Schlüssel;
...

aber trotzdem THX

--

Free your mind and your ass will follow!


Dieser Beitrag wurde am 27.11.2002 um 17:39 von JP bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
003
27.11.2002, 18:04
Tron



cin nimmt leerzeichen, eingabetaste, tabulator als trenner, d.h. du gibst "hello world" _auf einmal_ ein und die schleife wird 2mal durchlaufen, einmal enthaelt buffer dann "hello" und das andere mal "world".

aber prefect hat auch recht, beim empfaenger kannst du nicht erwarten, dass deine nachricht in einmem stueck ankommt (oder 2 nachrichten getrennt)
das ist der nachteil von streams protokollen wie tcp, deswegen musst du einen nachricht-ende-marker anfuegen, hier bietet sich das bewaehrte '\0' an, oder du sendest vorab die laenge einer nachricht und dann erst den inhalt.

<edit>
ganz vergessen:
mit cin.getline(buffer) solltest du den gewuenschten effekt beim einlesen erzielen, das nimmt nur eingabetaste als trenner
</edit>

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett


Dieser Beitrag wurde am 27.11.2002 um 18:05 von Tron bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
004
28.11.2002, 10:46
Kriz



Mach's genauer, Tröni =)

cin.getline(char* buffer, int length_of_buffer, char delimiter='\n');

Aber ich find's immer wieder lolig, wenn Leute versuchen schon komplexere Projekte in Angriff zu nehmen und kaum Basiskenntnisse der Sprache haben, denn cin.getline() ist für C++ Basiswissen... Naja, ist wohl mittlerweile ne Art "Coderkrankheit" oso. Wie auch immer.

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)


Dieser Beitrag wurde am 28.11.2002 um 10:47 von Kriz bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
005
28.11.2002, 12:51
CN



da bin ich deiner meinung.. vorallem in php kommt sowas oft vor
manche leute wissen nichtmal das print keine funktion ist und daher keine ( )s benötigt

~_-

--

zum Seitenanfang zum Seitenende Profil || Suche
006
29.11.2002, 14:10
King of Darkness



aber printf ist eine ;)

aber mal zu dem cin ehrlich gesagt wuste ich von der cin.getline aber würde es nicht auf anhib einsetzen ... weil man nich dran denkt und weil man es sehr selten brauch ... da dos progies meiner meinung nach in vergessenheit geradeten (zu wenig möglich keiner der grafischen gestalltung)

--

Coding Center --- Tutorials über Programmierung und andere Themen
Amazon Preisbeobachung mit Preisalarm

zum Seitenanfang zum Seitenende Profil || Suche
007
29.11.2002, 15:51
apfelkorn



print wird aber in der nächsten version von php ( php 5 ) eine echte funktion und bleibt kein sprachelement mehr, wie echo... ja, ich freu mich schon drauf.

--

zum Seitenanfang zum Seitenende Profil || Suche
008
30.11.2002, 13:14
JP



Zitat:
Kriz postete

Aber ich find's immer wieder lolig, wenn Leute versuchen schon komplexere Projekte in Angriff zu nehmen und kaum Basiskenntnisse der Sprache haben, denn cin.getline() ist für C++ Basiswissen... Naja, ist wohl mittlerweile ne Art "Coderkrankheit" oso. Wie auch immer.

Kritz, hast du noch nie was davon gehört das man so am effektivsten lernt? ausserdem will ich SPAß haben und mich nicht nur mit
theorie rumschlagen. Dafür ist doch ein forum... und cin.getline() hab ich nirgendwo vorher im zusammenhang mit leerzeichen gesehen.

Jetzt, noch ne frage...
ich wollte einbauen, das man auch dateien verschicken/empfangen kann und habe gemerkt, das das wirklich meine kenntnisse übersteigt.
Das war mein ansatz:

Quellcode:


//Verschicken
bool sendFile(SOCKET socket, char* file)
{
char buffer[2];
ifstream openfile;

    openfile.open(file, ios::binary);
    if(!openfile.is_open()) return false;
    
    while(!openfile.eof())
    {
    openfile.read(buffer, sizeof(buffer)-1);
    send(socket,buffer,strlen(buffer)+1,0);
    };
   send(socket,"<>",3,0); // wusste nicht wie ich der anderen seite sage, das die darei fertig ist
return true;
};


//Empfangen
bool getFile(SOCKET socket, char* dest)
{
char buffer[2];
ofstream writefile;

    writefile.open(dest, ios::binary);
    if(!writefile.is_open()) return false;
    
    while(!strcmp(buffer,"<>"))
    {
    recv(socket,buffer,2,0);
    writefile << buffer;
    };
return true;
};

also, wenn mir einer helfen kann...
oder ein tutorial kennt...

danke im vorraus!

--

Free your mind and your ass will follow!

zum Seitenanfang zum Seitenende Profil || Suche
009
01.12.2002, 10:20
[RMen]OneStone



Zitat:
Ausserdem will ich SPAß haben und mich nicht nur mit
theorie rumschlagen. Dafür ist doch ein forum...

Nein!

--

georg-wicherski@pixel-house.net | http://www.pixel-house.net/ - Coding Resource| http://www.google.de/

zum Seitenanfang zum Seitenende Profil || Suche
010
01.12.2002, 12:15
JP



Dann klär mich doch bitte auf OneStone...

--

Free your mind and your ass will follow!

zum Seitenanfang zum Seitenende Profil || Suche
011
01.12.2002, 17:29
[RMen]OneStone



Was gibbet da aufzuklären? Man soll erstselber denken, und wenn es keinen anderen Weg mehr gibt in ein Forum posten, nicht andersrum.

--

georg-wicherski@pixel-house.net | http://www.pixel-house.net/ - Coding Resource| http://www.google.de/

zum Seitenanfang zum Seitenende Profil || Suche
012
03.12.2002, 15:48
JP



Noch ne frage.
Wie geht es, das man bei der "system(...)" funktion das was das Sys zurückgibt als string hat,
um das dann zu versenden?

ich will also auf der einen seite "system("dir");" ausführen und das ergebnis zur anderen seite
senden. Ich habe " char text[128] = system("dir"); " versucht, aber da system(); ja eine "int" zurück gibt ging das
natürlich nicht...

Weiss einer wies geht?

--

Free your mind and your ass will follow!


Dieser Beitrag wurde am 03.12.2002 um 15:51 von JP bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
013
03.12.2002, 16:22
Ornest



Zitat:
CN postete
manche leute wissen nichtmal das print keine funktion ist und daher keine ( )s benötigt

Kewl, in meinem PHP Buch (Jetzt lerne ich PHP) steht als Frage:

"Welche Funktion schreiben Sie, damit Zeichenketten im Browserfenster ausgegeben werden?"

Antwort: Print()

btw. Sorry for OT

--


Dieser Beitrag wurde am 03.12.2002 um 16:22 von Ornest bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
014
05.12.2002, 14:08
[RMen]OneStone



JP: Crossposts sind net gern gesehen. (siehe ResourceCode Forum f. Antwort)

--

georg-wicherski@pixel-house.net | http://www.pixel-house.net/ - Coding Resource| http://www.google.de/

zum Seitenanfang zum Seitenende Profil || Suche
015
05.12.2002, 16:02
CN



hm mit dem buch hab ichs auch gelernt o_.
auf jeden fall stehts da so: www.php.net/print (weh mir kommt einer mit php3.de)

--

zum Seitenanfang zum Seitenende Profil || Suche
016
11.12.2002, 02:46
Gott



hab vor einiger zeit mal nen messenger in delphi gebaut falls es dir was hilft kann ichs ja irgendwo hin uploaden , ach ja nen tool für denn win 2000 / xp nachrichten dienst hab ich hier auch noch ..

--

millirem und bequerel , kleine kinder sterben schnell

Arsch für alles bei War in Europe
www.warineuropemod.com

zum Seitenanfang zum Seitenende Profil || Suche
017
11.12.2002, 08:59
Kriz



CN, da möchte ich mal widersprechen was print bei PHP angeht! Der Befehl echo z.B. ist keine Funktion, obwohl man ihn in zwei Varianten anwenden darf:

echo "Hallo!";

und

echo("Hallo");

(Die Varianten mit 'Hallo' und "Hallo" skippe ich mal... =)

Der Befehl print dagegen ist eine Funktion, ob mit oder ohne Klammern:

print "Hallo";

print("Hallo");

Der Grund ist der, daß print im Gegensatz zu echo einen Wert an den Aufrufer zurückgibt. Funktionen liefern i.d.R. einen Wert zurück, egal ob dieser Wert einen "Wert" hat oder nicht (void ist auch ein Wert, wenn auch ohne Inhalt und Datentyp). Funktionen ohne Wertrückgabe dagegen definiert die Informatik als Prozedur. Ich persönlich finde diese Trennung etwas schleierhaft, da in C/C++ z.B. eine Funktion void DoSomething(void) zwar als Funktion auftritt, aber im Grunde eine Prozedur ist. Prozeduren dürfen eigentlich keine direkte Änderung an Variablen durchführen, aber in C/C++ ist das sehr wohl möglich, indem innerhalb von DoSomething() globale Variablen verändert werden können. Daher finde ich diese Trennung suspekt.

Nun denn, in PHP ist echo eher eine Art Makro wie cout, während print() deutlich an printf() herantritt. cout liefert auch keinerlei Werte zurück im Sinne einer Funktion (cout liefert nur eine Referenz auf sich selber zurück, wenn cout in einer Ausgabekette verwendet wird).

Wie dem auch letztendlich sei: print ist in PHP eine Funktion, während echo eher in Richtung Prozedur/Makro geht.

Cu

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)


Dieser Beitrag wurde am 11.12.2002 um 09:02 von Kriz bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
018
11.12.2002, 13:27
CN



lass gut sein ×_#

--


Dieser Beitrag wurde am 11.12.2002 um 13:39 von CN bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
019
11.12.2002, 13:58
Fraghunter



Zitat:
CN postete
hm mit dem buch hab ichs auch gelernt o_.
auf jeden fall stehts da so: www.php.net/print (weh mir kommt einer mit php3.de)

Mist ;-)

mhhh
Buch - viel zu teuer.
Ich hab mir das php-manual gesaugt, und ausgedruckt. Da kann ich dann auch wenigstens sicher sein, dass ich alles weis, was es zu wissen giebt ^^

--

Nihil timeo, nulla re opprimor, nulli periculo cedo.
www.TheDoenerKing.de

zum Seitenanfang zum Seitenende Profil || Suche
020
11.12.2002, 17:38
Prefect



Zitat:

Prozeduren dürfen eigentlich keine direkte Änderung an Variablen durchführen,

Wer verzapft denn sowas? Letztendlich sind doch Prozeduren nur Funktionen ohne Rückgabewert. Und wenn ein Programmteil weder einen Rückgabewert haben darf noch irgendwelche Variablen ändern darf dann könnte man den Aufruf dieses Programmteils eigentlich gleich bleibenlassen.
Oder darf nach dieser Definition eine Prozedur nur ihre Parameter verändern aber sonst keine Nebeneffekte haben?

Hmm - eine (absolut hypothetische) Konvention, die Unterprogramme ohne Nebeneffekte "Funktion" nennt und ein Unterprogramm mit Nebeneffekt "Prozedur" wäre im mathematischen Sinne vielleicht noch akzeptabel, aber doch sehr suspekt. Eine solche Trennung auf dem Syntaxlevel macht zumindest für herkömmliche Sprachen wenig Sinn. Andere Sprachen, die mehr auf der impliziten Beschreibung von Algorithmen basieren könnten davon evtl. profitieren.

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
021
11.12.2002, 17:40
Tron



aeh... kriz, dein post erscheint mir ziemlich wirr

afaik ist print keine funktion, das mit den klammern verhaelt sich genauso wie in c++ folgendes beispiel:
std::cout << "test";
std::cout << ("test");

zudem ist cout kein makro, und erstrecht keine funktion: es ist ein ganz normales globales objekt. (eher kann man << als eine funktion sehen, die als parameter einen ostream& und irgendwas anderes nimmt und ostream& zurueckgibt)

die trennung von prozedur und funktion bezieht sich nach meiner informationstechnischen bildung nur auf den rueckgabewert, im gegenteil, funktionen duerfen im mathematischen sinne nichts veraendern, sondern nur einen funktionswert liefern! (da haetten wir die wunderschoenen /: funktionalen programmiersprachen wie haskell)
wenn wer etwas veraendern darf, dann prozeduren, und zwar nicht nur globale variablen/objekte sondern natuerlich auch parameter, die per zeiger/referenz uebergeben wurden.

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche