0

クライアントからサーバーにファイルをストリーミングしようとしていますが、FILEからcharに互換性のないデータ型があるため、クライアントを実行するたびにセグメンテーションエラーが発生します。これを回避する方法がわかりません。添付されているのは、サーバーとクライアントのコードであり、クライアントの問題の下にあります。クライアントからバッファにファイルを読み取ろうとしています。サーバーに送信すると、サーバーはバッファからファイルを読み取り、ファイルに書き込みます。クライアント側 http://pastebin.com/QtLbMgP3

サーバーサイド http://pastebin.com/8PNchBUZ

// n = write(sock,"send me your message",18);
    printf("Please enter the message: ");
    bzero(buffer,256);
    fgets(buffer,255,stdin);
        ptr_myfile=fopen("test2.txt","w");

         for(counter=1;counter <=10;counter++){
             fwrite(&ptr_myfile,sizeof(*buffer),1,buffer);
             n = read(sockfd,buffer,255);
             n = write(sockfd,buffer,18);

             n = write(sockfd,buffer,strlen(buffer));
             if (n < 0) error("ERROR writing to socket");
             bzero(buffer,256);
             n = read(sockfd,buffer,255);
             if (n < 0) error("ERROR reading from socket");
             // printf("%s\n",buffer);
         };//close for loop
    close(sockfd);

    }// close event loop
    return 0;
}// close main function
4

3 に答える 3

1

すべてのコードを調べなくてもread、一連の API (NOT write、など) には、ではなく整数記述子があります。closefopenfreadFILE*

FILE*と混在することはできませんint

于 2012-09-20T04:34:05.993 に答える
1

ここでこの行を見る:

fwrite(&ptr_myfile,sizeof(*buffer),1,buffer);

それはどのようにコンパイルされますか?

これはおそらく正しいです:

fwrite(buffer, 1, sizeof(buffer), ptr_myfile );

上記の行は、ファイルから最大 256 バイト (バッファー配列のサイズ) を読み取りデータをbufferにコピーします。&ptr_myfile ではなく、ptr_myfile を渡していることに注意してください。

于 2012-09-20T04:40:57.077 に答える
1

fwrite ステートメントを確認してください。ファイルに書き込もうとしていますか、それともファイルからバッファに読み込もうとしていますか?

前のケースの場合は、fwrite(buffer, sizeof(buffer),1, ptr_myfile) を使用します。つまり、書き込み先のストリームが最後の変数になります。

後者の場合は、実際にバッファに入れる前に、最初に fgets や getchar などの関数を使用してストリームから読み取る必要があります。

それが役に立てば幸い!


さて、クライアントでファイルを読み取り、それをサーバーに送信するには、

fp=fopen("<filename>", "r");
//This opens the file and initializes the pointer fp to the start of the file Start of
//the file, not its text necessarily

これで、fgetc() 関数 [1 文字ずつ] または fgets() 関数 [テキストがフォーマットされている場合は、行全体をバッファーに読み込むことができます] を使用して、ファイルからバッファーに読み込むことができます。

fgets(buffer,sizeof(buffer),fp);
//This could be ambiguous as the second argument should correspond to
//pre-known limit of bytes to read here some Macro maybe.

次に、単純に send() を使用して、このバッファをサーバーにディスパッチします。

サーバー側では、recv() を使用してネットワークから何らかの「バッファ」に入力データを受け取り、fputs または fprintf または任意の便利な関数を使用して、そこで書き込みモードで開かれたファイルに書き込みます。

于 2012-09-20T04:47:24.390 に答える