2016-04-18 13 views
3

私はCでソケットネットワーキングを行っています。サーバでの検証のためにクライアント側からパスワードを受け取るアプリケーションです。私はすべてを設定してソケットが通信しますが、文字列を送信してstrcmp()を使用すると、文字列が同じになるにもかかわらず、0が返されません(私は文字列が同じであると信じています)。 so:C - ソケットネットワーキング - 文字列の等価性が得られない

クライアントとサーバー側は別々のプログラムであり、マシン上ではlocalhostを経由していることに注意してください。

/*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"); 
    } 

ご協力いただければ幸いです。 bzeroやmemsetの使用が関与している可能性がありますが、これらがどのように関与しているかはわかりません。

+4

あなたは 'read'の戻り値を無視するので、読み込んだバイト数は分かりません。どのように 'strcmp'がそれを知ることを期待していますか? –

+0

'read'は64バイト未満を読み取ることがあります。それは読み込まれたバイト数を返します。それが64ではない場合は、残りの文字と一緒に繰り返す必要があります – fukanchik

+0

おそらく文字列終了の問題。 'password_buffer'のメモリを' read'の後で調べます。そして、私は0にもそれを初期化し、最後のものが '\ 0'であることを保証するために63バイトしか読みません。 – yano

答えて

4

fgets(password, 64, stdin);は、末尾に改行文字(\n)を追加する可能性があります。 fgetsの後にクライアント文字列から削除するか、サーバー側の比較文字列の最後に追加します。

クライアント文字列から末尾の改行を削除するには、たとえば、次のようにします。これは
password[strcspn(password, "\r\n")] = 0;

関連する問題