2011-01-31 14 views
5

私は、ビデオファイルをTCPソケット経由で送信する最良の方法を考えようとしています。私は標準のソケットプログラムを作ったが、readコマンドの後に私はそれをどのように保存することができるのか分からない。CでTCPソケット経由でビデオを送信する最も良い方法

コードサンプル

//bind server socketfd 
if (bind(sfdServer, (struct sockaddr*)&adrServer, ServerAddrLen) < 0) 
    error("ERROR binding"); 
listen(sfdServer, 5); 
while(1){ 
    printf("Waiting for connections...\n"); 
    sfdClient = accept(sfdServer, (struct sockaddr*)&adrClient, &ClientAddrLen); 
    if(sfdClient < 0) 
     error("ERROR accepting"); 

    printf("Connection Established.\n"); 
    //set buffer to zero   
    bzero(buff, 2048); 
    printf("Reading from client.\n"); 
    numChar = read(sfdClient, buff, 2048); 

    //What should go here? 

    close(sfdClient); 
    close(sfdServer); 

} 

私はちょうどそのようなファイルmovie.mp4か何かのようにバッファを保存しますか?私は私のバッファサイズを変更するか、場合によってはチャンクで送る必要があるかもしれないことに気付きました。しかし、私はこれを行うための最善の方法についての良い情報を見つけることができません。どのような助けや正しい方向への指摘に感謝します!

答えて

3

ファイルにバッファチャンクを書きます。

まず、書き込み用の出力ファイルを開く:書き込み、read()後、

#include <sys/types.h> 
    #include <sys/stat.h> 
    #include <fcntl.h> 


    int outfd; 
    outfd = open("movie.mp4", O_WRONLY|); 

次に、あなたのバイト:あなたはチャンクの数に対処する必要があります

numWrite = write(outfd, buff, numChar); 

注意/

  • read()またはのいずれかです。がゼロまたは-1を返す(エラー)
  • 使用可能なバイトがなくなるまで読み取ります。今、あなたのコードは2048バイトだけを読み込み、ソケットを閉じます。
+0

この情報を使用して、私はすべてを整理することができました。現時点では、JavaクライアントからこのCサーバにテキストを転送できます。しかし、クライアントからデータを受け取ったときにバッファを正しくダンプする限り、ビデオファイルを同じ方法で転送する必要があります。 –

+1

あなたの質問を正しく理解していれば、受け取った各バッファ(たとえば2048バイト以下)に対して、それ以上バイトを受け取らないようにファイルに書き出すと、それはすべて動作するはずです。ネットワーク接続とソケットは、テキストかバイナリかどうかは気にしません。 – payne

2

まず、あなたがsendfile()またはお使いのシステムのための同等のものを使用することを検討すべきである(これは、ネットワークファイルシステム上で発生する可能性があります)要求されたよりも少ないバイトを書い

  • write()。つまり、ファイルの一部をメモリに読み込んで、どこかに書き戻すのではなく、ファイル記述子をメモリマップして、すべてを一度に送信する必要があります。

    チャンクについては、TCPがストリームをパケットに分割して処理します。理想的には、遠隔ノードは、事前成熟終了を処理できるように、どのくらい前もって期待するべきかを正確に知る必要があります(そのため、HTTPヘッダーにはコンテンツの長さが含まれています)。

    データを送信する前に、何らかの種類のハンドシェイクを使用してください。送信者は、送信されたデータの量に注意して、返されたoffetに注意して、ループ内でsendfile()を呼び出す必要があります。受信者はループにrecv()を呼び出して、すべてが到着していることを確認する必要があります(標準は "recvfile()"です)。

  • +0

    +1、sendfile()はこの頭痛を単純化するために作られたもので、select()よりもpoll()を選択するのと同じように、使用可能な場合は使用する必要があります。残念ながら、すべてのプラットフォームにそれらがあります。 –

    +0

    残念なことに、入力がうれしいです。クライアントアプリケーションは、Android搭載端末からJavaに移行します。だから、sendfileはできません。 –

    関連する問題