C言語 自作物 プログラミング

C言語で超簡単なhttpサーバーを実装してみる

最近、ネットワークプログラミングに興味が出てきたので、その一端に触れるためにHTTPサーバーを実装してみることにしました。

もちろん、有名なサーバーレベルのものは自分では作れるはずもないので、あくまでも自己学習の1つとして簡易的なものを作っていきます。

今回の目標

最初から難しい目標を立てても挫折しそうなので、まずはリクエストに対して「HTTP 200 OK」を返すことだけを目標にします。階段を1段ずつ登っていく感じで「楽しくプログラミング」がモットーです(・∀・)

実装してみた

Google先生をはじめとするいろんな情報に頼って実装してみたのがこちら。今後の開発も考えて、コードはGitHubで管理することにしました。

ソースコード:https://github.com/corgi0901/simple-server

解説

プログラムの簡単な解説です。

1. ソケットを作る

最初に通信のためのソケットを作ります。ソケットというのは通信の口みたいなもので、このソケットを読み書きすることで通信を実現できます。

ちなみに、第1引数の「AF_INET」はIPv4による接続を表し、第2引数の「SOCK_STREAM」はバイトストリーム形式の通信を表しています。

2.ソケットにアドレスを割り当てる

作成したソケットにアドレスを割り当てます。「ソケットに名前を付ける」とイメージすればわかりやすいかも。

割り当てる具体的な情報は、sockaddr_in構造体に定義しておきます。今回はIPv4で8080番ポートを指定しています。アドレスは特に指定しないのでINADDR_ANYです。

3.接続を待ち受ける

bindしたソケットに対してlistenで接続を待ちます。第2引数は接続待ちキューの最大長ですが、今回は適当に5を指定します。

4.接続を受け付ける

接続要求に対してacceptで受け付けます。acceptの戻り値として接続済みのソケットが返ってきます。

このとき、第2引数のclientには接続元のアドレス情報が格納されます。

5.データを書き込む

acceptで受け取ったソケットに対してデータを書き込みます。今回はどんな接続に対しても「HTTP1.1 200 OK」を返しています。

これで、リクエストに対して返事を返すことができます。

実際に通信してみた

作成したサーバープログラムに対してブラウザからリクエストを送り、そのレスポンスを見てみます。

Chromeの開発者ツールで確認したところ、確かに「200 OK」の結果が返せています(・∀・) 何の実用性もないですが、思った通りに動くと嬉しいですね!

わずか50行ほどのソースでサーバープログラムの一端に触れることができました。もう少し実用的なものになるように、今後少しずつ手を入れていきたいと思います。

ではではノシ

関連記事

Linux

2020/3/28

SSHで公開鍵認証を設定する方法

これまでに何度かLinuxでサーバーを立てて遊んだりしていますが、毎回忘れてしまうのがSSHの公開鍵認証の設定方法です。一度設定してしまえば頻繁に触るものでもないので、ついつい忘却の彼方へ消えてしまいます(´・ω・`) この先、毎回調べなおすのも面倒なので、これを機に手順をまとめておくことにしました。ちなみに、サーバー(接続される側)がLinuxの想定です。 目次手順1:クライアント側で鍵ペアを作る手順2:サーバーに公開鍵を設定する手順3:SSHサーバーの設定 手順1:クライアント側で鍵ペアを作る まずは ...

この記事を読む

Flutter

2020/3/10

【Flutter】FutureBuilderで非同期にWidgetを生成する

ここ最近、Flutterでアプリを作ってきてある程度の知識がたまってきたので、徐々にこちらでもアウトプットしていこうと思います。 アプリの機能が複雑になってくると、外部との通信や重たい処理の終了を待ってからWidgetを生成したいときがあります。そんなときはFutureBuilderという仕組みを使うと簡単に非同期でWidgetが生成できます。 目次FutureBuilderの使い方builderについて非同期処理の状態を見る非同期処理の結果を取り出すまとめ参考 FutureBuilderの使い方 Fut ...

この記事を読む

日記 自作物

2020/3/7

FlutterでToDoアプリをつくってみた

最近、Flutterを使ったモバイルアプリの開発にハマっているのですが、前回このブログでも紹介した「SaltyStock」というアプリに続き、新しいアプリをリリースしました(・∀・) App Store‎CotoMemo‎CotoMemoはタブ型のToDoアプリです。仕事からプライベートまで、日々のやるべきこと(Coto)を気軽にメモ(Memo)する感覚で整理することができます。【主な機能】・タブによるタスク管理タブ毎にタスク整理ができるので、このアプリ1つで仕事もプライベートもあら... リリースしたの ...

この記事を読む

日記 自作物

2019/12/22

FlutterでiOS/Androidアプリを作ってみた

2019年の密かな目標の1つとして「スマホアプリを作ってリリースする」というのを掲げていたのですが、なんとか年内に達成することができました(・∀・) どうせ作るならiOS/Android両対応がいい!ということで、FlutterというGoogle製のフレームワークを使いました。開発したのは「SaltyStock」というアプリです。長期保有して塩漬け状態になっている株式銘柄を管理するというかなりニッチなアプリです笑。 「個人的にこういうのあったらいいな」というものを作ることができたので、概ね満足です。もし興 ...

この記事を読む

Linux

2020/3/10

Docker + Growiでイントラ向けWikiを立ち上げる

チーム開発をしていくうえで、課題の1つになるのが情報共有です。チームの歴史が長いと経験値は溜まっていきますが、それらが情報として整理されていないとメンバー交代時などに大きなコストが発生します。 そこで、イントラ向けのナレッジベース(Wiki)を探していたところ、Growiという良さげなOSSを見つけたので、お試し環境を立ち上げてみることにしました。手元の環境はUbuntu18.04ですが、Linuxであれば大体同じような手順になると思います。 目次DockerのインストールGrowiの準備接続ポートの変更 ...

この記事を読む

-C言語, 自作物, プログラミング

Copyright© Corgi Lab. ~備忘録のための技術ブログ~ , 2020 All Rights Reserved.