send() strings werden vermengt??
-
oO das hab ich jetzt nich ganz durchblickt..da muss ich mal mit beschäftigen. willst du sagen das man statt chars auch ganze objekte(instanzen) übergeben kann?
typedef struct tagNETWORKPACKET { unsigned short int Type; //Hierfür kannste deine eigenen Konstanten definieren unsigned short int DataSize; //hier ist die Anzahl der BYTES in [Data] die beachtet werden müssen. BYTE Data[4096-(2*sizeof(unsigned short int))]; } NETWORKPACKET;was mach ich jetzt genau hiermit? ich habs leider nicht ganz verstanden
muss ich bei rcv als grösse sizeof(NETWORKPACKET) angben...und sonst noch? ich muss doch dann auch bei versenden immer genau 4kb verschicken? und was heisst jetzt BYTE Data[4096-(2*sizeof(unsigned short int))]; genau?
fragen über fragen
ich glaub am besten würd ichs kapieren wenn du beispielshalber was einefaches versendest und wieder empfängst...mit einer spezifizierten grösse!PS: WAS genau muss ich IN einee struktur machen?
-
pixartist schrieb:
typedef struct tagNETWORKPACKET { unsigned short int Type; //Hierfür kannste deine eigenen Konstanten definieren unsigned short int DataSize; //hier ist die Anzahl der BYTES in [Data] die beachtet werden müssen. BYTE Data[4096-(2*sizeof(unsigned short int))]; } NETWORKPACKET;WAS genau muss ich IN einee struktur machen?
habe ich doch schon erklärt..
die struktur hat 3 elemente.
Type, DataSize und Data. data enthälr deine Daten. In datasize steht anzahl der bytes die der Remote -wenn er die struktur mit recv() einliest- verarbeitet. Somit hat sihc das Problem mitm trennzeichen erledigt. Denn in DataSize steht ja wo ende ist. Wenn DataSize 223 ist dass ist beim 223. Byte Ende!In Type stehn dann die konstanten:
z.b.
//Data-Type Constants... #define DT_DATA 0 #define DT_ABORT 1 #define DT_INFO 2 #define DT_SYSTEMCOMMAND 3 bla.. bla.. bla.... usw.Und Dein Server erhält dann die Struktur und sieht in nach was für daten sich in data befinden und jenachdem verarbeitet er diese daten. Mit DT_DATA kannste z.b. chat-text senden. Mit DT_SYSTEMCOMMAND sonderbefehle, die für technische Kommunikation zwischen Client und Server stattfindet...
Damit hast du den Mist mit den Trennzeichen nciht mehr zu bewältigen.
PS: Sicher kann man strukturen senden da diese nichts als Speicherberecihe sind die byteweise über einen Pointer engelesen werden.
Aus Erfahrung kann ich sagen, bei Netzwerkanwendungen sind Strukturen das aller Beste. (Meine persönliche Meinung)
-
Wäre es nicht besser, wenn man erst die Größe der Struktur sendet und dannach die Struktur? Dann verschwendet man nicht soviel Bandbreite.
-
Ich schlage folgendes vor:
struct Packet { unsigned crc32; //crc des ganzen Packets, beginned mit dem size Member unsigned size; //Größe von pData; //BYTE pData[size]; };
-
Warum ist pData auskommentiert? Hat das irgendwas zu bedeuten?

-
uff so ich pack nicht wie man structs verwendet!
folgende vorraussetzung:string buffer = "das willich versenden"; int i = 10; //und das auch //und zwar mit einem einzigen send! //beim rcv möchte ich dann jeweils die daten wieder in eigene variablen tun! //ich würde mich freuen wenn mir wer n kurzes beisp dazu amchen könnte DANKE! :) send(s,???,???,0); /* ... */ ??? = recv(s);danke
-
Das kommt davon wenn man sich ständig weigert, endlich mal C/C++-Grundlagen zu erlernen.
Spätestens jetzt siehst Du, was Du davon hast...

-
hihi schrieb:
Warum ist pData auskommentiert? Hat das irgendwas zu bedeuten?

Das liegt daran, dass pData eine variable Größe hat und der Speicher dafür außerhalb der Struktur reserviert wird. Der Vorteil vom Ganzen ist, dass man jedes Mal den Header einlesen kann, (die Packet struct) und danach folgen die eigentlichen Daten (pData)

-
Hepi schrieb:
Das kommt davon wenn man sich ständig weigert, endlich mal C/C++-Grundlagen zu erlernen.
Spätestens jetzt siehst Du, was Du davon hast...


-
jo geile antwort...ich weiss zwar nicht was das versenden von strukturen mit winsock mit grundlagen am hut hat, aber deine antwort hat mich richtig weitergebracht...
-
pixartist schrieb:
jo geile antwort...ich weiss zwar nicht was das versenden von strukturen mit winsock mit grundlagen am hut hat, aber deine antwort hat mich richtig weitergebracht...
Naja... send() hat von der Logik her viel mit fwrite() (eine Standard-C-Funktion) gemeinsam. Du kannst damit eben nicht nur Textstrings, sondern beliebige Bytes verschicken.
Evtl. musst du die struct erst in einen solchen Bytestrom umwandeln (Stichwort casten).
-
also per (long)variable
edit: hab mich mal beim msdn nach structs erkundigt..komme langsam dahinter
edit2: ahhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhtypedef struct tagNETWORKPACKET { unsigned short int Type; //Hierfür kannste deine eigenen Konstanten definieren unsigned short int DataSize; //hier ist die Anzahl der BYTES in [Data] die beachtet werden müssen. BYTE Data[4096-(2*sizeof(unsigned short int))]; } NETWORKPACKET;JETZT kapier ich was du da machst oO mensch das kann man aber auch einfacher erklähren ^^
-
wie komm ich denn auf const *char? mit LPBYTE krieg ich ja unsigned *char
-
Vielleicht LPCSTR

-
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