0

2 台のコンピューター間でファイルを転送するコードを実行しています。接続にはtcpソケットを使用しています。問題は、送信しているファイル バイトに一種のヘッダーを添付して、送信しているものがファイルの一部であることを受信者が認識できるようにする必要があることです。私のヘッダーがdata. 送信する文字列は次のとおりdata <file bytes>です。

私はそれらを送信でき、受信者はそれらを受信できますが、ファイルが破損しているようです。フォーマットされていないテキストファイルの場合はうまく機能しますが、他のファイルの場合はファイルを効率的に解析していないようです.

while(1){
    fp = (char*) malloc (56);
    rc = recv(connfd,fp,55,0);

    if(strcmp(fp,"stop") == 0){
        break;
    }

    fp = fp + 5; //I do this to skip the 'data<space>" header
    wr = write(fd,pf2,rc-5);
    tot = tot + wr;
    printf("Received a total of %d bytes rc = %d \n",tot, rc);
}

しかし、ヘッダーなしでファイルを送信しようとしましたが、ファイルは破損していませんが、この特定のコードにはこれらの「データ」ヘッダーを使用する必要があります。私は何を間違っていますか?

4

1 に答える 1

2
fp = fp + 5; //I do this to skip the 'data<space>" header

ただし、すべての呼び出しでdata<space>ヘッダーを受け取るわけではありません。receive()受け取ったすべてのデータを追加するバッファを、別の"data<space>".

ただし、セパレータは一般的に悪い考えであることに注意してください。文字列を含むファイルを送信するとどうなります"data<space>"か? クライアントはその後、新しいファイルが送信されると想定しますが、実際には元のファイルをまだ受信しています。

送信する各ファイルの前に 4 バイトを占める uint32 など、ある種のメッセージ長ヘッダーを送信してみてください。次に、最初の 4 バイトを読み取ることができ、そのファイルに対してあと何バイト期待できるかがわかります。

于 2012-10-16T12:03:51.847 に答える