2010-12-08 36 views
0

私は学校でC言語(Linux用)でFTPプログラムを書くという仕事を得ました。私はすべての基本的な機能(ls、cd)時間がないで働いているが、私はファイル転送部分に問題があります。私はこのようなソケット経由でファイルを送信するためのsendfile使用:C言語でソケットを介してファイルを送信

int fd = open(temp, O_RDONLY); 
int rc = sendfile (client_fd, fd, &offset, statbuf.st_size); 

私はクライアント側でこのファイルを受信する方法を見つけ出すように見えることはできません。私はデバッグのために、このようにそれを試してみました:

while((i = read(sock, message, MSG_LEN - 1)) > 0) { 

    message[i] = '\0'; 
    printf("%s", message); 
} 

これは、テキストファイルをプリントアウトで良い仕事をしていませんが、私は、バイナリファイルを送信しようとした場合、例えば、それだけで、バイナリファイルやハングの始まりを出力しますread()の部分(サーバーからは何も来ないので、私は思っています)。

ご意見ありがとうございます。受信機は、ファイルの終わりを知っているように、あなたは、ファイルを送信した後にシャットダウンするソケットの書き込み側が必要

+0

ソケット・ディスクリプタが入力で、出力として書き込み用にオープンされたファイルで、sendfileをもう一度試してみてください。 –

+2

BTW /バイナリファイルには、printfのようなCスタイルの関数がASCIIZ NULターミネータや、画面のクリア、カーソルの移動などのASCII制御コードに対応する他の値と間違える可能性がある0バイトを含めることができます。バイトごとに16進数で内容を読むか、または人間が読めるようにして端末に適合させるために他の方法を使用します。 –

+0

fwrite(message、1、i、stdout)を使って、プログラムの出力をシェルからファイルにリダイレクトします。 –

答えて

2

に到達しました:よう

shutdown(client_fd, SHUT_WR); 

shutdown()は、代わりにclose()の使用されています相手側がファイル全体を正常に受信したかどうかを調べることができます)。

あなたの読書側は、ファイルの終わり(read()に0を返します)が表示されます。その時点で、ソケットの末尾にはclose()があります。サーバーはファイルの終わりを確認し、ソケットも閉じて(転送が成功したことを記録する)ことができます。

+0

これは正確には役に立たず、最初の記事で説明したようにファイルを転送しますが、今度は 'get'の後に他のコマンドを実行しようとすると、 'broken pipe'というエラーが表示されます。 – ehehhh

+0

私は周りを検索し、recv()を使って示唆しているものがあることがわかりました。皆さんはread()やrecv()をお勧めしますか? – ehehhh

+0

あなたの答えをお寄せいただきありがとうございます。問題は、ファイルを送信する前に私のプログラムをfork()しようとしたことです。明らかに私はそれを正しく実行しなかったので、すべてがうまくいきませんでした。それは今働く。 – ehehhh

関連する問題