Winsock
-
das problem ist meines erachtens, dass du ja den text auf einmal verschickst. wenn du jetzt nur einen teil abholst, verfällt der rest
nö
schwierig dabei wird allerdings folgendes: da send nur strings versendet, diese struktur (User) aber mindestens 2 binäre nullen enthält, wird das nicht funktionieren
nö, send verschickt soviele Bytes aus dem angegebenen Buffer, wie angegeben wird
Zum Problem:
nickname = new char [100]; keyword = new char [100]; name = new char [200]; prename = new char [200]; street = new char [200]; birthcity = new char [100]; motherlanguage = new char [50];
Die größe ist doch konstant/bekannt? Du kannst also mit send( , &Struktur, sizeof(struct UI)); die ganze Struktur auf einmal senden und auch empfangen?
Warum bei dir allerdings nach dem ersten recv() nichts mehr ankommt ist eine gute Frage, wird es auch wirklich gesendet?
Tipp: Selbst wenn du weißt, dass z.B. 442B gesendet wurden heißt das noch lange nicht, dass du sie mit einem recv() alle abholen kannst, deshalb musst du recv solange aufrufen, bis du alle Bytes empfangen hast.
Außerdem muss das was du sendest nicht unbedingt ankommen, das soltest du ebenfalls im Protokoll berücksichtigen!
-
deine struktur hätteste auch leichter schreiben können, da du ja trotzdem fixe werte bei new hast.
struct UI { char nickname[100]; char keyword[100]; bool registry; char name[200]; char prename[200}; char street[200]; int streetnumber; int birthday; int birthmonth; int birthyear; char birthcity[100]; char motherlanguage[50]; };
und schon hat die struktur nen festen aufbau
nochmal: wenn du wissen willst, wieviele byte auf einem sockel bereit zur abholung liegen brauchst du (unter windows) die funktion ioctlsocket, die FrankII vorhingenannt hat. die liefert dir einen u_int, wieviele byte zur abholung bereit stehen.protokoll ist nichts anderes als ein festgelegter "handlungstrang" in der "konversation" client-server. dabei empfielhlt es sich, festgelegte befehle oder sequenzen durch kürzel kennzeichnet. z.B. "01" = alles OK, "XX" = fehler oder so ähnlich.
in deinem Fall würd ich etwa folgendes machen: ( C= client, S= server)
c -> s verbinden
s -> c: "00 Server bereit" // das praktische ist, du musst nur die ersten 2 chars auslesen, um herauszubekommen, was sinn des paketes ist. der text wird dann nur nach bedarf ausgewertet
c -> s: "10 Login"
s -> c: "01 OK"
c -> s: "05 Peter" // 05 steht z.b. für USERNAME
s -> c: "01 Received Peter"
c -> s: "06 geheim" // 06 steht z.b. für PASSWORT
s -> c: "01 Received password"
...
wenn du dann diese nachrichten mitprotokollierst, kann man auch schön bugtracking machen
-
was ist denn diese funktion, was macht sie und wie setzt man sie ein? ich habe in der msdn nachgeschaut, komme mit ihr aber nicht zurecht.
-
laut msdn kannst du dir damit die anzahl bytes die am sockel warten abholen. der parameter den du als cmd übergeben musst is F_ irgenwas (lies halt in der msdn)
so wie ich das verstandne hab, hast dann nach dem aufruf in dem u_int die anzahl wartender bytes stehen
-
ja ich kapier ja net was da steht also die funktion gibt doch 0 zurück wenn sie erflogreich ist und einen Fehlercode wenn was schiefgeht. und man kann mit der Funktion das Verhalten des Sockets beeinflussen soweit habe ich es verstanden mehr nicht. kann mir vielleicht einer die Funktion mal erklären?
-
Hi,
na ganz so schwer ist das doch nicht zu verstehen
(oder ist's die Sprache?)
int ioctlsocket( SOCKET s, long cmd, u_long* argp );
SOCEKT s ist der Handle auf deinen SOCKET, müsste also in deinem Fall daMember[counter].Socket sein.
long cmd => FIONREAD (in Winsock2.h definiert)
u_long* argp => Ein Zeiger auf eine Variable von type unsigned long in die das Ergebniss gespeichert wird, also die zu lesenden Bytes.
Fehler/Erfolg werden über den Returncode der Funktion signalisiert, wie Du ja schon richtig erkannt hast.
Der Aufruf sollte also ungefähr so aussehen. (nicht getestet)
ioctlsocket( daMember[counter].Socket, FIONREAD, &bytes_to_recv );
Hoffe es hat geholfen!
Ansonsten in der MSDN noch mal genau nachlesen.
http://msdn.microsoft.com/library/en-us/winsock/winsock/ioctlsocket_2.asp?frame=true
-
ja hat es, eine Frage hab ich aber noch. Wozu ist diese Funktion überhaupt gut? Also was bringt mir das?
-
Also was macht die funktion denn damit? die Syntax war mir ja schon klar, wird die funktion dazu benutzt die am socket wartenden Daten (die anzahl der bytes) zu bestimmen? In der msdn habe ich das so verstanden, dass ein Socket damit manipuliert werden kann. Oder sprecht ihr hier über einen Spezialfall dieser Funktion? Macht euch mal keine Sorgen, die Syntax kriege ich schon irgendwie hin :)) mir ist nur der Gedankengang nicht ganz klar
-
Also ich habe jetzt das mal ausprobiert, allerdings habe ich nicht die winsock2.h sondern nur die winsock.h includiert, die konstante gibt es dort aber auch. Allerdings werden immer 4 Zeichen empfangen und die Anzahl der Daten die am Socket warten soll 0 sein, hier der code:
int bytecounter = 0; char* recbyte = NULL; unsigned long* bytes = new unsigned long []; //Anzahl der wartendem Bytes bestimmen und Speicher reservieren rc = ioctlsocket (daMember[counter].Socket, FIONREAD, bytes); bytecounter = *bytes; recbyte = new char [bytecounter]; //Struktur auslesen recv (daMember[counter].Socket, recbyte, bytecounter, 0); cout << recbyte << endl;
-
hallo? wieso schreibt keiner mehr?