2017-02-16 1 views
1

C-SERVER ist so konzipiert, drucken "ok", wenn es empfängt ""
nichts anderes.C-Server Verhält sich vernunftwidrig

(I könnte nicht einen Weg \ n zu entfernen, so dass ihr "111 \ n" genau zu sein.)

echo '111' | nc <ip> <port> 
echo 'TEST-OOO' | nc <ip> <port> 
echo '111' | nc <ip> <port> 

C-SERVER: (über 3 sind mit den Reaktionen verbunden sind unten)

111 
ok 

TEST-OOO 

111 
-OOO 

STRANGE: Warum es -OOO gedruckt wurde?

es ist entworfen, um "ok" zu drucken, wenn es "" erhält. nicht -OOO

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <netdb.h> 
#include <arpa/inet.h> 
#include <err.h> 
#include <string.h> 

char outt[15]; 
char inn[100]; 

int main() 
{ 
    int one = 1, client_fd; 
    struct sockaddr_in svr_addr, cli_addr; 
    socklen_t sin_len = sizeof(cli_addr); 

    int sock = socket(AF_INET, SOCK_STREAM, 0); 
    if (sock < 0) 
    err(1, "can't open socket"); 

    setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(int)); 

    int port = 85; 
    svr_addr.sin_family = AF_INET; 
    svr_addr.sin_addr.s_addr = INADDR_ANY; 
    svr_addr.sin_port = htons(port); 

    if (bind(sock, (struct sockaddr *) &svr_addr, sizeof(svr_addr)) == -1) { 
    close(sock); 
    err(1, "Can't bind"); 
    } 

    listen(sock, 5); 
    while (1) { 
    client_fd = accept(sock, (struct sockaddr *) &cli_addr, &sin_len); 

    read(client_fd,inn,100); 
    printf(inn); 

    if (strcmp(inn, "111\n") == 0){ 
    printf("ok\n"); 
    } 

    snprintf(outt, sizeof outt, "%s\n", inet_ntoa(cli_addr.sin_addr)); 


    if (client_fd == -1) { 
     perror("Can't accept"); 
     continue; 
    } 

    write(client_fd, outt, sizeof(outt) - 1); /*-1:'\0'*/ 
    close(client_fd); 
    } 
} 

Antwort

3

Dieser Code:

read(client_fd,inn,100); 
printf(inn); 

ist nicht definiertes Verhalten. read() beendet die empfangenen Daten nicht mit einem NUL-Zeichen. In diesem Fall wird der Inhalt von inn aus einer vorherigen Iteration Ihrer Schleife in der Ausgabe angezeigt, da sie immer noch dort sind.

Dies wäre besser:

ssize_t bytesRead = read(client_fd,inn,sizeof(inn) - 1); 
if (bytesRead > 0) 
{ 
    inn[ bytesRead ] = '\0'; 
    printf(inn); 
} 

als NUL-terminierten String, der die Daten gedruckt werden, ohne NUL-Beendigung gesendet vorausgesetzt der Kunde tatsächlich einen C-String gesendet.

0

Sie sind nicht die Ergebnisse aus dem Aufruf von read() Einchecken lesen, um zu sehen, wie viel wurde.

Dann bist du nicht beendet inn so ist es nicht endet, wo Sie denken, es sein sollte und stattdessen Teil enthält der vorherigen gesendeten Zeile.