2

http ヘッダーの解析に問題があります。

これが私の問題です:

char resp[] = "HTTP/1.1 200 OK\r\n"
             "Content-Type: text/html\r\n"
             "Content-Length: 4\r\n"
             "\r\n"
             "text";

// some stuff
sscanf(resp, "HTTP/%f %d\r\n",&version,&code);
sscanf(resp, "%*[^]Content-Length: %d",&size);
//            ^ tried several things here

いくつかの値を取得したいだけなので(存在する場合)、sscanfを使用するのは良い考えだと思いました。
私の考えは、私が望まないすべてのヘッダーをスキップすることでした。

私の質問は次のとおりです
。1-sscanf は良い考えですか?
2-そうでない場合、どのアプローチがより効果的か

ありがとうございました。

4

3 に答える 3

3

最初に注文するには、関数を使用しない*scanfでください。

HTTP ヘッダーの解析は、見た目よりもかなり困難です。libcurl使用できるものを既に実装しているかどうかを最初に確認し、それが失敗した場合は、 と に直接flex進みbisonます。

于 2012-07-18T01:44:07.787 に答える
1

ライブラリを使用する利点は、ライブラリがどのように機能するかを理解する必要がないことです。

ライブラリを使用する際の問題は、ライブラリがどのように機能するかを理解する必要がないことです。

アプリケーションが特定の制約に対応する必要があるかどうか (サーバーではセキュリティと速度が頭に浮かびます) は、実装の詳細により多くの時間を費やす必要があります。つまり、適切な解決策を見つけることができるように問題を理解することを意味します。

それがプログラミングのすべてです。

ヒント:ライブラリを使用しないことが、HTTP ヘッダーの解析にアプローチする最良の方法である可能性があります

于 2012-07-18T08:25:08.133 に答える
0

最初の答え: やらないでください。奇妙な HTTP コーディングやケース マッピング、その他の奇妙なことが十分にあるので、おそらく自分でやってみると間違いを犯すことになるでしょう。しかし、この素晴らしいアドバイスを無視すると...

2 番目の回答: sscanf を使用しないでください。いつも涙で終わる。文字列を正規表現ライブラリに通して必要なものを取得するか、文字列を 1 行ずつ解析することを検討してください。"\r\nContent-Length: " に対して strstr を実行することもできますが、ヘッダーの最後で停止することはなく、本文で予期しないものと一致する可能性があります。最初に \r\n\r\n を検索し、それがどこで終わるかを見つけてから、それまで strstr を実行できますが、その時点で二重検索になります。

于 2012-07-18T01:44:20.313 に答える