send() strings werden vermengt??
-
pixartist schrieb:
wie komm ich denn auf const *char? mit LPBYTE krieg ich ja unsigned *char
(LPBYTE) wird von recv() und send() akzeptiert und mit Erfolg verarbeitet!
Du solltest BYTES und keine chars senden. Bei manchen Compilers ist char als signed char definiert. Dann hast du evtl. Probleme. Du musst entweder unsigned char oder gleich BYTE benutzen.BYTE ist folgenderweise definiert:
#define BYTE unsigned charAuf das 'unsigned' kommts an.
Deswegen solltest du nciht nach (const char*) sondern nach (LPBYTE) oder nach (const unsigned char*) casten.
-
D:\Programme\C++ files\MSDev98\MyProjects\WinSockets\WinSockClient\main.cpp(150) : error C2664: 'send' : Konvertierung des Parameters 2 von 'unsigned char *' in 'const char *' nicht moeglichmist ich kann als destination nicht die adresse von der struktur angeben! rcv gibt immer nen char zurück!
ich kann aber auch keinen char in ne struct casten
-
Dem Borland 5.5 machts nix aus.
Dann caste einfach nach (const char*)..
Aber ich wüsste gern welchen Compiler du hast..
-
Microsoft Visual C++
wie kriege ich denn aus dem rcv n netpack?char *x = new char[sizeof(pack)]; rc=recv(s,x,sizeof(pack),0); pack = (netPack)x;so schonmal nicht?
rc=recv(s,&pack,sizeof(pack),0);so aber auchnicht!
beim zweiten gibsD:\Programme\C++ files\MSDev98\MyProjects\WinSockets\WinSockClient\main.cpp(212) : error C2664: 'recv' : Konvertierung des Parameters 2 von 'struct netPack *' in 'char *' nicht moeglich
-
Die anderen haben es schon sehr treffend gesagt:
Du kannst nciht mal die einfachsten Grundlagen der Sprache C++!ZU deinem geposteten Code:
char *x = new char[sizeof(pack)]; rc=recv(s,x,sizeof(pack),0); pack = (netPack)x; so schonmal nicht? C/C++ Code: rc=recv(s,&pack,sizeof(pack),0); C/C++ Code: rc=recv(s,&pack,sizeof(pack),0);...ist Murks: (WAS genau falsch ist werd eich cniht erklären da das einfach zu den Grundlagen gehört und nciht ins WINAPI-Forum passt)
So muss es sein:
/*Ich gehe mal davon aus, die struct - netPack haste schon deklariert!*/ netPack foo; //Eine Instanz wird erzeugt! (heißt "foo" !!!) rc=recv(s,(LPCSTR)&foo,sizeof(netPack),0); //Die Instanz wird mit den vom Remote gesendeten Inhalt gefüllt.PS: Darf ich wissen wie alt du bist?
-
DAS waren 2! verschiedene ansätze man!
das zweite war ein ausschnitt hierraus:char *recieve(netPack pack) { rc=recv(s,&pack,sizeof(pack),0); //pack = (netPack)x; //if(rc==0 || rc==SOCKET_ERROR) //return ""; return pack; }pack ist eine instanz von netPack (struct) und ich wusste nicht das ich das pack einfach in dem recieve in nen char casten kann ! ich hatte es genauso wie du es geschrieben hast, nur hab ich das casten nicht dringehabt...
so kriege ich da schonmal keinen error mehr:netPack *recieve(netPack pack) { rc=recv(s,(LPSTR)&pack,sizeof(pack),0); //pack = (netPack)x; //if(rc==0 || rc==SOCKET_ERROR) //return ""; return pack; }ich bin übrigens 18
-
pixartist schrieb:
DAS waren 2! verschiedene ansätze man!
das zweite war ein ausschnitt hierraus:char *recieve(netPack pack) { rc=recv(s,&pack,sizeof(pack),0); //pack = (netPack)x; //if(rc==0 || rc==SOCKET_ERROR) //return ""; return pack; }...da schauen wir mal alle weg!!

pixartist schrieb:
ich hatte es genauso wie du es geschrieben hast, nur hab ich das casten nicht dringehabt...
'Nur'?? Ein Fehler genügt um zu sagen das es falsch ist!
pixartist schrieb:
netPack *recieve(netPack pack) { rc=recv(s,(LPSTR)&pack,sizeof(pack),0); //pack = (netPack)x; //if(rc==0 || rc==SOCKET_ERROR) //return ""; return pack; }...ist Murks.
Gleich kannste wieder sagen :"Ich hatte dasselbe wie du sagst NUR...."
Der obige Code ist unsinnig, syntaktisch sowie logisch falsch und sollte sich cniht kompilieren lassen. Und selbst wenn du eine Kompilation erzwingst sollte es cniht klappen. DENN:
1.Der Returnwert deiner Funktion soll ein
netPack-Pointer sein aber du returnst KEINEN POINTER!2.Du hast bei recv() ein "sizeof(pack)" stehn. Bei sizeof gibt man als parameter aber keine instanznamen sondern den datentyp -in diesem falle: netPack- an.
3. Als Parameter nimmt deine Funktion eine KOPIE(!!!) einer übergebenen netPack-Instanz. Und diese LOKALE KOPIE, die ausschließlich im scope der Funktion gültig ist füllst du mit daten und glaubst ihn returnen zu können. Kannst du aber nicht, da diese Kopie wie gesgat nur im Gültigkeitsbereich der Funktion gilt und nach dem Zurückkehren der Funktion kann keiner mehr auf die Daten in dem 'return'ten' struct zugreifen.
Heute bin ich besonders nett und erspare dir 6 weitere Fragen sowie 4 Stunden suchzeit:
void recieve(netPack* pack) { rc=recv(s,(LPSTR)pack,sizeof(netPack),0); }4.Du führst uns bombenfeste beweise für deine mangelnden GRUND-Kentnisse vor. Da kann dich keiner mehr widerlegen. Nun hast du uns überzeugt. Du kannst die Grnudlagen wirklich nicht.
(Geh in dei Stadtbib. und hol dir ein buch)MfG Tolga.
-
Warum wird eigentlich in den meisten Protokollen mit Strings gearbeitet, wenn es eigentlich mit Strukturen viel einfacher geht?
Shlo: Brauch man die crc32 checksum wirklich bei TCP/IP? Wird das nicht automatisch durch TCP/IP überprüft und ggf. neugesendet?
-
Unwissende schrieb:
Warum wird eigentlich in den meisten Protokollen mit Strings gearbeitet, wenn es eigentlich mit Strukturen viel einfacher geht?
Weil die Protokolle die du meinst sehr oft eingesetzt werden und deswegen so wenig wie möglich traffic entstehen soll. Bei Strukturen sendet man oft mehr als nötig. Außerdem kann man z.b. via Telnet kaum eine Struktur senden.
Aber Strings kann man eintippen und sehr leicht mit nem SMTP oder HTTP Server kommunizieren.
-
Unwissende schrieb:
Shlo: Brauch man die crc32 checksum wirklich bei TCP/IP? Wird das nicht automatisch durch TCP/IP überprüft und ggf. neugesendet?
Ein gute Frage...
Leider kenne ich mich mit dem TCP/IP Protokoll nicht aus.
Eventuell steht etwas in den entsprechenden RFCs.