2011-12-30 7 views
3

にソケット経由で大きなファイルを送信します。プロジェクトはほぼ完了していますが、唯一問題となるのはソケットを介してクライアントにファイルを送信することだけです。私は200kb以上のデータをソケットに書き込むことはできません。小さなファイルが順番にダウンロードされます。 Linuxソケットを介して大容量のファイルを送信する正しい方法は何ですか?私は学校のプロジェクトのための簡単なFTPサーバを書いていますC

ありがとうございます。

PS Iがのsendto、送信、書き込み、オープンローレベルを使用して、サーバは、ポートモードで動作し、Cと32ビットLinuxを使用して、読み取りなどのsendfileのような他の機能しています。

+0

あなたは私たちにいくつかのコードを表示することができますか?なぜあなたは200kb以上を書くことができないのですか? –

+0

プロジェクトは、あなたが直接ソケットを使用することを必要としない限り、簡単な方法は、libcurlの(それをグーグル)を使ってサーバーを実装することです。 –

+0

あなたはどのクライアントを使用していますか?サーバーがファイルを受信または送信するのはいつですか? –

答えて

4

ひとつのアイデアは、チャンクでファイルチャンクを読み込むことがあり、何かのように:

あなたは、いくつかのエラーチェックを追加する必要がありますが、考え方はかなりの量を読むことです

#define CHUNK_SIZE 1000 

void send(){ 
    uint8_t buff[CHUNK_SIZE]; 
    int actually_read; 
    while((actually_read = read(fd, buff, sizeof(buff)) > 0) 
    sendto(sock_fd, buff, actually_read, 0); 
} 

擬似コードその量を送信して送信するファイルからのバイト数。サーバー側では、到着するチャンクをソケットから読み込んでファイルに書き込むことで、同様のことを行う必要があります。複数のファイル転送を処理する場合は、送信するファイルをサーバーに伝えるために、一部のメタデータの先頭にbuffを付けることができます。 FTPはTCPを使用しているので、データを失う心配はありません。

繰り返しますが、これは単なるアイデアです。これを行うには複数の方法があります。

+1

は4096バイトより大きなチャンクサイズを試してみてください。したがって、4096バイトを超えるバッファを使用すると、余分な4つのシステムコールのパフォーマンスが低下することはありません。 – DipSwitch

+0

私はそれを試してみるつもりですが、とにかく他のLinuxディストリビューション – user1122920

3

あなたはこのように、あなたもFSTATを使用して、そのサイズを取得することができ、ファイルをmmapされ、そこからソケットにそれを書くことができます。

fd = open(filename, O_RDONLY); 
struct stat s; 
fstat(fd, &s); // i get the size 
adr = mmap(NULL, s.st_size, PROT_READ, MAP_SHARED, fd, 0); // i get the adress 
write(socket, adr, s.st_size); // i send the file from this adress directly 

あなたがあなたの前に、ファイルのサイズだけを送信することもできます完全に送ってください。あなたのクライアントは、彼が良いサイズを持っていること、そして彼がそれをダウンロードすることができることをあなたに送ってほしいかもしれません。

関連する問題