2017-08-30 1 views
1

Ich schreibe einen einfachen Server/Client-Socket in C. Der Client fordert den Benutzer auf, eine Nachricht einzugeben und der Server antwortet mit der Wiederholung derselben. Das Problem ist, wenn ich eine Nachricht vom Client sende der Server antwortet durch Hinzufügen von zusätzlichen Zeichen. Wie behebe ich das?C-Sockets: Warum hängt mein Server am Ende zusätzliche Zeichen an?

Dies ist mein Client-Code

while(1) { 
    bzero(buffer, BUFSIZE); 
    printf("Enter Message: "); 
    scanf("%s", buffer); 
    //send some data 
    if(send(socket_fd, buffer, strlen(buffer), 0) <0) { 
     fprintf(stderr,"sending failed\n"); 
     return 1; 
    } 
//receive a reply from the server 
if(recv(socket_fd, server_reply, BUFSIZE,0)<0) 
{ 
    fprintf(stderr,"failed to reply. \n"); 
    break; 
} 
fprintf(stdout, "Reply: %s\n ", servreply); 

} 

Dieser Code

meinem Server ist
int read_size; 
    while((read_size = recv(client_socket_fd, buffer, BUFSIZE,0))>0) 
    { 

     // Reply back to the client 
     if (0 > write(client_socket_fd, buffer, strlen(buffer))) { 
      fprintf(stderr, "could not write back to socket\n"); 
     } else { 
      fprintf(stdout, "message back to client\n"); 
     } 
    } 
    if(read_size==0) 
    { 
     fprintf(stderr,"disconnected.\n"); 
     fflush(stdout); 
    } 
    else if(read_size==-1){ 
     fprintf(stderr, "error.\n"); 
    } 

Dies ist die Ausgabe

Enter Message: welcome 
Reply: welcome 
Enter Message: hello 
Reply: hellome 
Enter Message: hi 
Reply: hillome 

Antwort

1

Sie benötigen einen String um strlen() zu verwenden . Ihre Arrays sind keine Zeichenketten, sondern verwenden stattdessen read_size für die Länge des Puffers.

Strings in ist nur eine Folge von druckbaren Zeichen von einem '\0' gefolgt, und keines Ihrer Arrays hat jeden '\0' so strlen() undefiniertes Verhalten verursacht. Die strlen() Funktion scannt tatsächlich die Zeichenfolge, bis sie die '\0' findet und dabei zählt, wie viele Zeichen vorhanden waren.

+0

Danke sein sollte. Außerdem kannst du bitte erklären, wenn du eine Nachricht wie "Wie geht es dir" eingibst, antwortet der Server in verschiedenen Zeilen. "Wie sind" und "du" sind auf drei verschiedenen Zeilen –

+0

Denn so funktioniert es. Sie müssen 1. Wählen und lesen, bis nichts mehr zu lesen ist, aber das ist schwierig. 2. Verwenden Sie ein Messaging-Protokoll, um eine Nachricht zusammenzustellen und zu rekonstruieren, wenn sie die andere Partei erreicht. –

0

@ Iharobs Antwort ist korrekt. Grundsätzlich ändern Sie die Zeile:

write(client_socket_fd, buffer, strlen(buffer)) 

zu:

write(client_socket_fd, buffer, read_size) 
-1

Es ist nicht. Sie drucken Junk am Ende des Puffers. Sie ignorieren auch das Ende des Streams.

if(recv(socket_fd, server_reply, BUFSIZE,0)<0) { 
    fprintf(stderr,"failed to reply. \n"); 
    break; 
} 
fprintf(stdout, "Reply: %s\n ", servreply); 

sollte

sein
int count; 
if((count = recv(socket_fd, server_reply, BUFSIZE,0))<0) { 
    fprintf(stderr,"failed to reply. \n"); 
    break; 
} 
else if (count == 0) { 
    // EOS 
    fprintf(stderr, "peer has disconnected.\n"); 
    break; 
} else { 
    fprintf(stdout, "Reply: %.*s\n ", count, servreply); 
} 

Ihre 'schreiben zurück an den Client' ist auch falsch:

if (0 > write(client_socket_fd, buffer, strlen(buffer))) { 

if (0 > write(client_socket_fd, buffer, read_size)) { 
+0

Danke. Ich bin neu und das half. Wenn ich jedoch eine Zeichenfolge wie "Wie geht es dir" eingibt, wird sie in verschiedenen Zeilen angezeigt. –

+0

Möglicherweise 'scanf()' Tokenizing an den Leerzeichen. Es hat nichts mit der Frage zu tun, die du gestellt hast. – EJP

Verwandte Themen