Fehler beim Empfangen von Daten
-
Hi,
Da liegt ja mein Problem das ich -1 zurück bekomme.
Weil als erstes verbinde ich mich auf den server mit connect(); dort bekomme ich eine 0 zurück geliefert dies bedeutet ja das es keinen Fehler gab. Dannach sende ich mit send einen Befehl an den server und auch da bekomme ich die anzahl der gesendeten Zeichen zurück, d.h. das es auch da keinen Fehler gab aber warum gibt es dann bei recv einen Fehler? Der Socket ist der gleiche wie bei den anderen Funktionen.MFG ReduX
-
Du musst Postings schon mal bis zum Ende lesen, CStoll hat 2 (zwei) Punkte angekreidet.
Edit: mal abgesehen davon macht
send(sock,messange,sizeof(messange),0);sicherlich nicht das, was du willst. sizeof(messange) sollte auf 32 Bit Systemen 32Bit sein (da simpler Zeiger), es werden also die ersten 4 Byte des char-arrays gesendet.
-
Hi,
Hab das mit send jetzt auf string umgebaut und auch recv wenn ichs richtig versanden habe:char* network::send2server(std::string messange) { int res = send(sock,messange.c_str(),messange.size(),0); std::cout << res << std::endl; int strange; char buffer2[256]; strange = recv(sock,buffer2,strlen(buffer2),0); buffer2[strange]='\0'; printf("Empfangene Daten: %s\n",buffer2); std::cout << strange << std::endl; }So bei send bekomme ich eine 1 zurück egal wie lange der string ist, ist das richtig so? habe gedacht das send die anzahl der gesendeten Zeichen zurückgibt(laut Buch).
Beim Empfangen bleibt er allerdings stehen und die minuten gehn so ins Land und nichts passiert!MFG ReduX
-
strange = recv(sock,buffer2,strlen(buffer2),0);strlen sucht nach der ersten Null in deinem nicht initialisierten buffer2 und gibt an wie viele andere Zeichen es davor gibt. Das kann 1 oder was anderes sein, kann aber auch in einem SegFault enden. Übergeben sollte man die Kapazität des Buffers.
-
Hi,
Habe das nun mit strlen geändert tut sich aber immer nochnichts, was meinste mit intalisieren? buffer2 wurde ja deklariert das reicht doch.MFG ReduX
-
ReduX schrieb:
Hi,
buffer2 wurde ja deklariert das reicht doch.MFG ReduX
NEIN! Das reicht garantiert nicht.
Wo soll recv denn die Daten hinpacken, wenn der Funktion kein Speicher bereitgestellt wurde?Das musst du schon selber mit buffer2 = new char[<beliebige_länge>]; tun.
-
buffer2 hat schon seinen Speicher. Es ist ja auf dem Stack erzeugt.
Initialisieren wäre ganz praktisch, ist aber hier nicht unbedingt erforderlich. Man sollte vielleicht noch kontrollieren ob strange <256 ist befor man auf dieses Element zugreift.char buffer2[256] = {}; //jetzt ist es initialisiert strange = recv(sock,buffer2,strlen(buffer2),0); if( strange > 0) // bei Fehler sollte man den schon abfangen { if( strange > 255 ) strange = 255; buffer2[strange]='\0';// und weiter[cpp]
-
Braunstein, du hast trotzdem ja noch strlen() drin, d.h. er versucht immer 0 Bytes zu empfangen...
Also so ist's richtig:char buffer2[256] = {}; //jetzt ist es initialisiert strange = recv(sock,buffer2,sizeof(buffer2),0); // bzw. 256
-
Hi,
kann man es dann wieder so machen wie ich es am Anfagn hatte, also das er immer ein Zeichen einliesßt und an einen string hängt bis nichts mehr kommt?
Weil mein Programm wird in einem Bereich eingesetzt wo es schonmal sehr viele Zeichen werden können.
Also so?:char buffer2 = {}; //Braucht ja nur ein Zeichen int strange; do { strange = recv(sock,buffer2,1,0); // Hier dann an string dranhängen } while(strange != 0);Bin gerade an einem anderen PC und kann hier nichts testen, würde dies dann aber so funktionieren?(Sry wenn ich frag aber hab mich mit Sockets nochnicht so beschäftigt)
Schöner Abend noch!
MFG ReduX
-
Es gibt kein "es kommen keine Daten mehr", d.h. entweder würde der recv() dann endlos warten, oder aber neue Daten kommen (und du würdest die dann an die alten ranhängen).
Wenn du eine feste Puffergröße sendest, dann empfange auch gleich soviele Daten.
Wenn du dagegen unterschiedlich lange Daten sendest, dann übertrage zuerst deren Länge (als unsigned int - und am besten mit ntohl()/htonl()netzwerktauglich machen) und lies erst die Größe aus, und danach dann die restlichen Daten am Stück.In einem anderen Thread hier im Forum hatte ich das schon mal erklärt
(such mal nach recv()...)
-
Hi,
Ja das Problem ist ich kann nicht einfach so die größe vorher senden da der Server nicht verändert werden kann(leider).
Aber ich hab doch da mal was gelesen das wenn keine daten mehr kommen das recv dann null zurückgibt!?!?!MFG ReduX
-
nein, wenn recv 0 zurückgibt, heisst das, dass die verbindung (auf eine gute art) terminiert ist.
-
Hi,
Edit:
Ich bekomme nun bei Empfangen: Anzahl der Zeichen 9.
Dannach stürzt das Programm ab und es werden keine daten angezeigt
MFG ReduX