2016-04-18 6 views
3

Ich habe tun Socket-Netzwerk in C, für eine Anwendung, die ein Passwort von der Client-Seite für die Verifikation auf dem Server nehmen wird. Ich habe alles eingerichtet und die Sockets kommunizieren, aber wenn ich eine Zeichenfolge über und benutze strcmp() die Zeichenfolgen, obwohl sie beim Ausdruck identisch ist, wird nicht 0 (was ich glaube, dass die Strings sind gleich) wie so:C - Socket-Netzwerk - String's wird keine Gleichheit erzeugen

Beachten Sie, dass die Client- und Server-Seite separate Programme sind, die über localhost auf meinem Computer laufen.

/*Client Side */ 

char password[64] = {0}; 

fgets(password, 64, stdin); 

write(sockfd, password, 64); 



/*Server Side */ 

char password[64] = "password"; 

char password_buffer[64]; 

read(newsockfd, password_buffer, 64); 

if(strcmp(password, password_buffer) != 0) 
    { 
    printf("Password Incorrect\n"); 
    { 
else 
    { 
    printf("Password correct\n"); 
    } 

Jede Hilfe würde sehr geschätzt werden. Es ist mir aufgefallen, dass die Verwendung von bzero oder memset involviert sein könnte, obwohl ich nicht sicher bin, wie diese beteiligt sind.

+4

Sie ignorieren den Rückgabewert von 'lesen', so dass Sie keine Ahnung haben, wie viele Bytes Sie lesen. Wie erwarten Sie, dass "strcmp" weiß, wie das geht? –

+0

'lesen' kann weniger als 64 Bytes lesen. Es gibt die Anzahl der gelesenen Bytes zurück. Wenn es nicht 64 ist, müssen Sie mit dem Rest – fukanchik

+0

wahrscheinlich ein Problem String-Kündigung wiederholen. Untersuche den 'password_buffer'-Speicher nach dem' read'. Und ich würde es auch auf alle 0s initialisieren und nur 63 Bytes lesen, um sicherzustellen, dass der letzte '\ 0' ist. – yano

Antwort

4

fgets(password, 64, stdin); fügt am Ende der Zeichenfolge wahrscheinlich ein abschließendes Zeilenvorschubzeichen (\n) hinzu. Entfernen Sie es aus der Clientzeichenfolge nach fgets oder fügen Sie am Ende der Vergleichzeichenfolge auf der Serverseite eine Zeichenfolge hinzu.

Um die nachfolgende neue Zeile aus der Clientzeichenfolge zu entfernen, verwenden Sie z. dies:
password[strcspn(password, "\r\n")] = 0;