2016-09-02 2 views
0

Ich lief in ein Problem, das ich wirklich nicht lösen konnte, also habe ich neu gestartet. Ich hatte ein Problem mit Datenkapselung oder spezifischer ohne Kapselung. Nachdem ich herausgefunden hatte, dass diese Kapselung nützlich ist, begann ich den Code neu zu schreiben.Zwei mal send und recv arbeiten nicht C

Jetzt laufe ich in ein anderes Problem. Irgendwie funktionieren meine send und recv Anrufe nicht so, wie ich es möchte. Hier

ist der Teil, wo ich an:

char to_send[] = "hello. I am the Data."; 

    // get size of data 
    int len = strlen(to_send); 
    char slen[len]; 
    sprintf(slen,"%d",len); 
    printf("%s\n",slen); 
    // send size of data 
    if(send(comm_fd,slen,len,0)<0){perror("Error on send"); exit(1);} 

    // send data 
    if(send(comm_fd,to_send,len,0)<0){perror("Error on send"); exit(1);} 

Und hier Teil, wo ich empf:

// getting size of bytes to recv 
    char buf[1000]; 
    bzero(buf,1000); 

    int rec = recv(comm_fd, buf, 100,0); 
    printf("rec\n: %i",rec); 
    printf("buf\n: %s\n", buf); 

    int buffsize; 
    buffsize = atoi(buf); 
    bzero(buf,1000); 
    printf("buffsize: %i\n",buffsize); 

    // recv the bytes 
    bzero(buf,1000); 
    rec = recv(comm_fd, buf, buffsize,0); 
    printf("rec\n: %i",rec); 
    printf("%s",buf); 

So, jetzt ist mein Problem: Ich habe die Größe der nächsten Daten empf und drucken kann es. Aber die Daten selbst werden nicht angezeigt.

Kann mir jemand helfen? Ich glaube, ich falsch mache wichtige Dinge (ich bin neu zu C und Programmierung zum Netzwerk)

Vielen Dank im Voraus

+2

'slen' s Größe ist nicht' len' – Fozi

Antwort

3

Zwei Dinge mit diesem ersten send Aufruf:

if(send(comm_fd,slen,len,0)<0){perror("Error on send"); exit(1);} 

Hier können Sie senden len Anzahl der Bytes, aber len ist die Länge von to_send und nicht die Länge von slen. Sie werden höchstwahrscheinlich Daten von außerhalb der initialisierten Teile slen die

Das zweite Problem ist führt zu undefinierten Verhalten senden, dass Sie die Länge von to_send als Zeichenfolge variabler Länge zu senden, so das empfangene wissen nicht wirklich wie viel zu erhalten. In Ihrem Fall könnten Sie tatsächlich (und wahrscheinlich) die Zeichenfolge und die Zeichenfolge in einem einzigen recv-Aufruf erhalten. Zumindest, wenn Sie TCP (Streaming) Sockets verwenden.

Diese beiden Probleme können gelöst werden, indem slen ein Array fester Größe gemacht wird, groß genug, um die größten Zahlen zu halten, die Sie denken können (zehn Ziffern sind normalerweise genug), und senden Sie dann dieses Array fester Länge mit sizeof slen.

Vielleicht so etwas wie dieses:

// Ten digits, plus string terminator 
char slen[10 + 1]; 

// Prefix length with zeroes, and don't overflow the buffer 
snprintf(slen, sizeof(slen), "%010d", strlen(to_send)); 

// Send the whole array, including terminator 
send(comm_fd, slen, sizeof slen, 0); 

Dann auf der Empfangsseite, könnten Sie

// Ten digits, plus string terminator 
char slen[10 + 1]; 

// Receive the whole string, including terminator 
recv(comm_fd, slen, sizeof(slen), 0); 

// Convert to a number 
size_t len = strtoul(slen, NULL, 10); 

// Now receive `len` bytes 

Hinweis tun, dass ich keine Fehlerprüfung haben, die Sie haben sollten.

+0

es hat funktioniert! Danke vielmals! Ich sehe meine Fehler Anzeige wird über die Funktionen gelesen, die Sie verwendet haben. Danke, – Minory

+1

Auch in modernen Programmen verwenden 'memset' anstelle von' bzero' (was von POSIX veraltet ist) –

+1

'snprintf (slen, sizeof (slen),"% 010d ", strlen (to_send));' hat Probleme. Typisches "int" (welches der Typ ist, der mit "% d" erwartet wird) benötigt bis zu 11 + 1 'char', nicht 10, z.B. '-2147483648'. 'strlen()' gibt den Typ 'size_t' zurück, der nicht mit'% d' übereinstimmt. Vielleicht möchten Sie '% zu 'dann 10 könnte OK sein.Code, der 'snprintf()' verwendet, um Überläufe zu verhindern, und den Rückgabewert von 'snprintf()' nicht überprüft, handelt ein Problem für ein anderes. Besser, seinen Rückgabewert zu überprüfen. – chux