C言語で CodeCrafters Redis を実装した時のメモ
CodeCrafters は HTTP サーバーやシェルなどを車輪の再発明するウェブサイトです。C言語で Redis を実装した際に調べた関数や構造体を備忘録としてまとめました。 ソケット通信の全体の流れ サーバー側のソケット通信は以下の順で関数を呼び出します。 flowchart TD A["socket()\nソケットを作成してファイルディスクリプタを取得"] B["setsockopt()\nソケットのオプションを設定(SO_REUSEADDR など)"] C["bind()\nソケットに IP アドレスとポート番号を紐づける"] D["listen()\n接続待ち状態にする"] E["accept()\nクライアントからの接続を受け付ける(ブロッキング)"] F["read / write\nクライアントとデータをやりとりする"] A --> B --> C --> D --> E --> F 各関数のメモ void setbuf(FILE *stream, char *buf) ストリーム(FILE *)に対するバッファリング動作を制御する関数です。例えば stdout ストリームに対して設定すると、そこへ書き込む printf などが影響を受けます。 ストリームの代表的なものは以下の3つで、プログラム起動時に自動で用意されます。 ストリーム 説明 stdout 標準出力。printf はここに書き込む stderr 標準エラー出力。エラーメッセージの出力に使う stdin 標準入力。scanf や fgets はここから読み込む 引数 説明 stream 対象のストリーム(stdout・stderr など) buf 使用するバッファへのポインタ。NULL を渡すとバッファリングが無効になる NULL を渡すと書き込みが即座に反映されます。デバッグ時や、ログをリアルタイムで確認したい場合に使います。 setbuf(stdout, NULL); // バッファなし(即時出力) setbuf(stdout, buf); // buf に指定したバッファを使う int socket(int domain, int type, int protocol) ソケットを作成してファイルディスクリプタを返します。失敗時は -1 を返します。 ...