現在、コンピュータサイエンスの学位を取得しており、自分のWebサーバーライブラリを構築したいと考えています。問題?私がWebサイトとのやり取りで行ったすべての検索は、情報の送受信の基本を説明する代わりに、「他の人が作成したこのライブラリを使用する」ことを示しています。
私は多くを求めているわけではありません-Webページに1つの英数字を入力し、ボタンを押して、その標準の1バイトの情報を非標準の助けなしにC ++プログラムに送信したいのです。図書館。
現在、コンピュータサイエンスの学位を取得しており、自分のWebサーバーライブラリを構築したいと考えています。問題?私がWebサイトとのやり取りで行ったすべての検索は、情報の送受信の基本を説明する代わりに、「他の人が作成したこのライブラリを使用する」ことを示しています。
私は多くを求めているわけではありません-Webページに1つの英数字を入力し、ボタンを押して、その標準の1バイトの情報を非標準の助けなしにC ++プログラムに送信したいのです。図書館。
回答:
Boost.Asioは現在、ネットワーキングを行う将来のC ++標準の方法(の1つ)に変換されています。(これは論文の1つです:http : //www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3388.pdf)
これは、他のソケットライブラリやプラットフォーム提供のソケットライブラリを抽象化しているため、最新の C ++ を使用して見つける最も基本的なポータブル非同期通信システムです。
すべての最新のC ++ httpネットワーキングライブラリ(CppNetlibおよびCPPCMS)はそれに依存しています。ソケットと非同期(および同期)通信の基本を提供するライブラリを構築することをお勧めしますが、完全なシステムをセットアップしないでください。おそらく数年後には、Boost.ASIOを同等のC ++標準に置き換えることもできます。
また、Boost.Asioのドキュメントは、この種のコンテキストで通信がどのように機能するかについての洞察を提供します。したがって、それを読むことで多くの質問に答えることができます。
下位レベルを理解したい場合は、Asioコードを読んでください。C ++メタプログラミングやその他のC ++イディオムに慣れていない場合は少し読みにくいですが、それを読むことで多くを学ぶことができます。
あなたが欲しいいくつかの情報がここにあります-http ://en.wikipedia.org/wiki/Common_Gateway_Interface。あなたがやろうとしていることが非常に複雑であるように聞こえないかもしれませんが、それはあなたが思っているよりも少し複雑です。ドミニクが言ったように、トリッキーな部分はポートを開いてソケットから読み取ることです-C ++ランドではかなり難しいです。
まず、既存のWebサーバーを使用して、独自のCGIモジュールを作成することをお勧めします。Webサーバーはソケット側の処理を行い、基本的には、環境変数またはコマンドライン引数(GETリクエストの場合)から、またはPOSTの場合はstdin(これはデータだと思います)からデータを読み取るだけです。約15歳の私の記憶から)。あなたが望むのはこのようなものです:
#include <stdio.h>
#include <string.h>
int main(){
char *s=getenv("CONTENT_LENGTH");
int i=atoi(getenv("CONTENT_LENGTH"));
printf("Content-type: text/html\n\n");
printf("%s\n<br />",s); //Shows you CONTENT_LENGTH works
printf("%d\n<br />",i); //Shows you it was converted to int
char *tmp = new char[100];
fread(tmp,i,1,stdin); //read from stdin something of i bytes to tmp
printf("%s\n<br />",tmp);
return 0;
}
ところで、読者への教訓として、このアプリケーションにはバッファオーバーフローのバグがあります。おそらくそれを修正したいと思います:)
私が間違っている場合は修正してください。ただし、標準のC ++コンポーネントのみを使用して、独自のWebサーバーを最初からプログラミングしたいようです。
まず、標準のtcp / ipソケットライブラリがないため、少しバインドされています。プラットフォームに応じて、WindowsソケットまたはPosixソケットを使用する必要があります。
次に、リクエスト/レスポンスの形式を調査する必要があります。少し検索すると、httpプロトコルのリソースが見つかるはずです。
その後、接続をリッスンし、要求に応答して応答を送信するサーバーを作成する必要があります。
それがあなたが求めているものではない場合、MichaelTの提案は妥当に聞こえます。