アドベントカレンダー企画

みんな大好きアドベントカレンダーの季節になりましたね(12月21日公開)。

この記事はOthloTechのアドベントカレンダー企画とも紐づけて書いています!

他の記事も結構面白いものが多かったので、見てみてください。

 

C言語でもサーバサイドしたい

と思っている方多いのではないでしょうか?

いや、多いですよね。

PHPに限らず、RubyやPython他、様々な言語で盛り上がっているサーバサイド界隈ですが、個人的に一番好きなC言語でWebのサーバサイドを行いたいなと思いました。

 

で、やってみる

今回はひとまずできるのかなー?って確認なので、実用面とかはあまり考えないでWebアプリケーションフレームワークライクな振舞いをC言語で実装してみたいと思います。

今回実装する機能はざっくりとこんな感じです。

  • HTTPサーバ
  • HTMLの出力
  • ルーティング

ひとまず、時間の関係上こんな感じの機能もどきを形だけ再現してみます。

 

環境

以下の環境でひとまずテストは行います。

  • OS:Windows 10
  • IDE:Visual Studio 2015

尚、今後はLinuxのCentOS当たりで開発をしようかなと思っています。

 

HTTPサーバをC言語で建ててみる

ってのに関しては過去にソケット通信をしていたのでそのコードを流用します。

ソケット通信の記事はこちら

⇒【Socket通信】WindowsPC同士でサーバとクライアントで通信!

ところどころ改変はしているのですが、ひとまず重要なのはHTTPヘッダを返すってところです。クライアント側の接続に対して「HTTPで通信するよ!」ってのを送って教えてあげよう!ってノリです。多分だいたいそう。

場所としてはここです。

気を付けて欲しいのは送る文字列はunsigned char型で送ってください。

charってご存知の通りデフォルトではsigned charなので文字化けしてしまいます。最初気にせずchar型で送信したら文字化けしました。

この1文で「今からHTTP通信でHTMLを送るぜ!」ってのを言ってます。多分だいたいそう。

 

HTMLを表示してみる

みんな大好き、HelloWorldしてみましょう。

HTMLファイルを作って1行ずつ送っても良いのですが、今回は面倒なので簡単に直接文章を送りたいと思います。

予め作っておいたhtml配列にhtmlを格納して、そのまま送信したらブラウザにHTMLが出力されます。

ルーティングしてみる。

さて、これではサーバのどこにアクセスしても同じHTMLが出力されてしまいます。そこで、ルーティングします。

ルーティングとは、特定のアドレスにアクセスした際にその目的のアドレスの結果を出力するって感じのやつです。知らない人はちゃんと調べた方がいいです。僕は知らないので後でちゃんと調べます…

実際に書いたコードはこんな感じ

このコードでGET/POSTからの値をpath変数に格納します。path変数って言うとなんだか紛らわしいので命名はまた改めて変えておきます。

こっちでルーティング。よくあるフレームワークみたいに綺麗じゃなく、単なるif文で申し訳ないですが、こんな感じ。もはやswitchでいいような気もするけど、ひとまずいいや。

これを実行すると、http://localhost:8000/page1に接続するとページが表示され、アンカーからhttp://localhost:8000/page2と行き来できます。

また、他のページを開こうとすると「Not Found」と言われます。

ひとまずはこんな感じ。

一応他にもところどころできた機能もあるものの、今回の記事はここまでにしておきます。元々、C言語でサーバサイドフレームワークを作ろうと思って始めましたが、本当にできそうなので、本格的に開発を行っていきたいと思います(勿論上の適当なコードは書き直します…)

尚、今回のコードの全貌はこちら

何か、気になる箇所等あれば、是非ご連絡いただければと思います1

今後はLinuxでしっかりとC言語のWebアプリケーションフレームワーク開発を進めていくつもりなので、また進展があればブログやTwitterで公開したいと思います。

 

今回のブログ曲

今回投稿中に聴いていた曲はこちら


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です