2017-12-02 20 views
0

私は、クライアントからサーバに、bashから読み込まれた行全体を送信しようとしています。空白文字列をソケットtcp経由で送信

クライアント:

char buf[200]; 
int line_len; 
getline(&buf, &line_len, stdin); 
printf("Sending: %s", buf); 
sendl(tcp_sock, buf); 

はサーバー:

char app[200]; 
recvl(client, app); 
printf("\n%s\n", app); 

SENDLとrecvlは、問題がgetline上で100%の作業

、実際に送信し、recvのことを私によって定義された関数であり、これは正しく動作しません。私が入力した後にSending: %sを印刷するとき は「ハローバナナ」私は常に

は、あなたが私を助けることができます..私も表示されないことができ、ここで ��のような奇妙な文字を取得しますか?

EDIT:今働いて感謝

+2

どのように 'getline'が正しく動作していないのですか?質問を[mcve]で更新してください。 – dbush

+0

'getline'は読み込まれた文字数を返します。いいえを確認することができます。文字が返され、サーバーに送信する行の長さが相互検証されます。 –

+0

が完了しました申し訳ありませんが、今はかなり良いと思います。 – ducajack

答えて

1

を@dbushするgetline関数はその最初の引数のchar **を期待しています。代わりにchar [200]に入り、それは崩壊してchar *になります。これらの型は互換性がなく、コンパイラが警告していたはずです。

最初の引数にポインタ変数のアドレスを渡す必要があります。このポインタはNULLに初期化し、linelenは0に初期化する必要があります。getlineは、読み込まれた行にメモリを割り当てます。このバッファで作業が完了したら、それは

char *buf = NULL; 
int line_len = 0; 
getline(&buf, &line_len, stdin); 
buf[line_len] = '\0'; 
printf("Sending: %s", buf); 
sendl(tcp_sock, buf); 
free(buf); 
+0

'getline(&buf、&line_len、stdin);'に変更すると完璧に動作します。ありがとうございます:) – ducajack

+0

@ducajack "Perfect"の場合、コードは 'getline()'の戻り値をチェックする必要があります。 – chux

+0

dbush:なぜ 'buf [line_len] = '\ 0';'?不要です。 – chux

関連する問題