3

基本的なファイルサーバーを実装しようとしています。私はここにあるsendfileコマンドを使おうとしています:http://linux.die.net/man/2/sendfileTCPを使用しています。

正常に送信することはできますが、バイナリで送信するため、ハングアップするかどうかはわかりません。

recvでファイルを受信しようとしていますが、正しく送信されません。バイナリファイルを受け取り、それを文字列に入れる特別な方法はありますか?

編集:いくつかのコードを提供するように求められました、ここにあります:

SENDFILE呼び出し(サーバープロセスから)

FILE * file = fopen(filename,"rb");
    if ( file != NULL)   
    {            
        /*FILE EXISITS*/ 
        //Get file size (which is why we opened in binary)
        fseek(file, 0L, SEEK_END);
        int sz = ftell(file);
        fseek(file,0L,SEEK_SET);

        //Send the file
        sendfile(fd,(int)file,0,sz);
        //Cleanup 
        fclose(file);
    }

RECIEVE呼び出し(クライアントプロセスから、ループよりもさらに基本的で、1文字だけが必要です)

//recieve file
    char fileBuffer[1000];
    recv(sockfd,fileBuffer,1,0);
    fprintf(stderr,"\nContents:\n");
    fprintf(stderr,"%c",fileBuffer[0]);

編集:戻り値をチェックするためのコードを書きました。sendfileはerrno9を与えています-不正なファイル番号。これは、呼び出しの2番目のファイル記述子(送信するファイルの記述子)にあると想定しています。sendfileがintではないと文句を言っていたので、intとしてキャストしました。

上記のsendfile呼び出しで使用したファイルポインタコードを指定して、send fileをどのように使用する必要がありますか?

4

2 に答える 2

3

、、およびfriendsによって指定されたファイル記述子sendfile()FILE*必要です。FILE *をintにキャストして、それが機能すると考えることはできません。open()close()

詳細については、マンページを読む必要がありますsendfile()

于 2011-10-01T19:50:29.150 に答える
1

特別な方法はありません。read()またはで受け取るだけrecv()です。

おそらく、受信コードが間違っています。

于 2011-10-01T17:55:06.273 に答える