1

さまざまな理由から、C の粗雑なツールを使用して CRL ファイルをダウンロードしようとしています。古き良き を使用して tcp 接続を開き、socket()ハードコードされたプレーンテキストの http 要求を 経由で送信しsend()、結果を 経由でバッファに読み取り、recv()そのバッファに書き込みます。ファイルに(後でさまざまな証明書を確認するために使用します)。

およびファイルへのrecv()書き込み部分は while ループ内にあるため、すべてを取得できます。

私の問題は、ファイルの受信がいつ完了したかを判断する信頼できる手段を思いつくのにかなりの時間を費やしていることです(したがって、whileループから抜け出すことができます)。私がこれまでに思いついたものはすべて、偽陽性または偽陰性のいずれかでした (0 バイトを返すことが頻繁に発生し、EOF マーカーが存在しないか、間違ったバイトを探していました)。できれば、多くの追加の複雑さを導入しない手法である必要があります。

本当に、ホスト、ポート、パス (すべてchar*) があります。遠端には、友好的な http サーバーがあります (ただし、私が制御するものではありません)。大量のコードの複雑さを追加せずにファイルを取得できるものであれば何でも喜んでいます。コマンド ラインにアクセスできる場合は、wget のようなものを使用しますが、C API 側で直接同等のものを見つけることができずsystem()、状況に適した選択ではありません。

4

1 に答える 1

1

「ゼロバイトを返す」とは、recv()ゼロを返すことを意味していると思いますが、ピアがデータの送信を終了し、接続を閉じたときにのみ発生します。ピアが接続ごとに複数のファイルを送信していない限り、これはこのファイルの終わりの絶対確実な兆候です。「頻繁に」というのはナンセンスです。接続ごとに 1 回しか発生しません。

ただし、ピアが HTTP サーバーの場合は、Content-length ヘッダーを送信する必要があります。RFc 2616 を参照してください。

于 2015-07-30T21:38:29.423 に答える