拙著「Linuxネットワークプログラミング」の紹介
拙著「Linuxネットワークプログラミング」に関する情報ページです。 サンプルプログラムダウンロード、はじめに/目次/Chapter 1〜3までのサンプルPDF、書籍中の間違いに関する情報を扱っています。
参考:拙著に関して発売時に書いたブログ記事。拙著中のコラムを書く過程で書いたブログ記事「いいから殺せ。後はこっちでなんとかするから」。
サンプルプログラム
(間違い箇所の修正対応済み)
- 2-2 IPv4+TCPによるソケット実装例
- 2-4 ファイルディスクリプタが0となる場合
- 2-5 単純なTCPサーバの実装
- 2-6 単純なTCPクライアントの実装
- 2-9 socket()システムコールを失敗させる
- 2-10 注意すべきエラー処理
- 2-11 printfをperrorの前に実行したケース
- 2-12 bind()を行わない場合
- 2-19 単純な名前解決プログラム
- 2-22 単純なTCPサーバ(getaddrinfo()版)
- 2-23 ファイル送信側
- 2-24 ファイル受信側
- 2-25 単純なHTTPクライアント
- 2-26 単純なHTTPサーバプログラム
- 3-3 単純なUDP受信プログラム
- 3-6 単純なUDP送信プログラム
- 3-7 getaddrinfo()を利用したUDP送信プログラム
- 3-8 getaddrinfo()を利用したUDP受信プログラム
- 3-9 IPv6が未設定の環境を想定する
- 3-10 ブロードキャスト送信プログラム
- 3-11 マルチキャスト送信プログラム
- 3-12 マルチキャスト受信プログラム
- 3-15 ソケットの名前を取得する
- 3-16 bind()を使った名前確認
- 3-17 UDPパケットのやりとりを行うサンプルプログラム
- 3-18 UDPパケットの送信&受信プログラム
- 4-3 インターフェース番号とインターフェース名を取得する
- 4-7 インターフェース一覧を取得する
- 4-8 if_nameindex()を利用してインターフェース一覧のみを取得する
- 4-10 ioctl()を利用してインターフェース一覧のみを取得する
- 4-11 インターフェース名を変更する
- 4-13 IPv4アドレスを設定する
- 4-15 IPv6アドレスを設定する
- 4-16 IPアドレスを削除する
- 4-17 ネットマスクを変更する
- 4-18 インターフェースをdown状態にする
- 4-19 インターフェースをup状態にする
- 4-20 ハードウェアアドレスを設定する
- 4-21 MTUを取得する
- 4-22 MTUを設定する
- 5-9 インターフェース情報の取得
- 5-11 インターフェースのdown
- 5-12 MTUの設定
- 5-14 IPアドレスの取得
- 5-15 IPアドレス変更通知の受け取り
- 5-18 IPアドレスの設定
- 6-1 ノンブロッキングでUDPを受信する
- 6-2 16ビットと32ビットの扱い
- 6-3 バイトオーダーを知る
- 6-13 SO_SNDTIMEOを利用したタイムアウト
- 6-16 slenの変化を知る
- 6-25 INET_ADDESTRLENの利用
- 6-26 INET6_ADDRSTRLENの利用
- 7-3 プロセスを生成するサンプルプログラム
- 7-4 値を共有しないプロセスの生成サンプルプログラム
- 7-5 スレッドの生成サンプルプログラム
- 7-8 SIGUSR1シグナルの補足
- 7-9 UNIXソケットサーバプログラム
- 7-10 UNIXソケットクライアントプログラム
- 7-11 UNIXソケットSOCK_DGRAM送信側
- 7-12 UNIXソケットSOCK_DGRAM受信側
- 7-14 socketpair()を利用する
- 7-16 pipe()システムコールを利用する
- 7-17 コマンド出力の取得サンプル
- 7-21 共有メモリを利用する
- 7-22 共有メモリへのアクセス
- 7-25 共有メモリの解放
- 7-30 セマフォセットの作成と初期化
- 7-31 セマフォの操作
- 7-32 セマフォの初期化
- 7-36 メッセージキューの作成
- 7-37 メッセージキューへのメッセージ送信
- 7-38 メッセージキューからのメッセージ取得
- 7-41 pthread mutexをプロセス間で利用する
- 8-5 epollを使ったデータ受信プログラム
- 8-6 epollサンプルへのデータ送信プログラム
- 8-7 送信バッファが溢れる例:受信側プログラム
- 8-8 送信バッファが溢れる例:送信側プログラム
- 8-9 送信可能かどうかのチェック
- 8-10 タイムアウトのチェック
- 8-11 connect()処理の終了にepoll_wait()を使う
- 8-12 シグナルを利用したepoll_wait()の解除
- 8-13 socketpairを利用したepoll_wait()の解除
- 8-15 select()を使ったデータ受信プログラム
- 8-16 select()を使ったデータ送信プログラム
- 8-18 poll()を利用したデータ受信プログラム
- 8-19 送信可能かチェックする
- 8-20 タイムアウトのチェック
- 10-1 fork()を利用した並列処理
- 10-2 スレッドを利用した並列処理
- 10-3 epoll による並列処理
- 10-4 SO_REUSEADDR を有効にしたTCP サーバ
- 10-6 shutdown()を利用する
- 10-7 クライアント側サンプルプログラム
- 10-9 chroot jailを抜ける
- 10-14 syslog()関数を利用したサンプルプログラム
- 11-12 IPv4射影アドレスを利用したサーバプログラム
- 12-1 RAWソケットを利用したpingコマンド
- 12-5 AF_PACKETを利用したICMP ECHO
- 12-7 AF_PACKETソケットをプロミスキャスモードにする
- 12-8 bind()によるインターフェースの指定
- 12-11 単純なpcapキャプチャ
- 12-12 フィルタを利用する
- 12-13 ファイルへの書き出し
- 12-14 ファイルからの読み込み
- 13-1 マルチキャストTTLの設定(IPv4)
- 13-2 マルチキャストTTLの設定(IPv6)
- 13-5 SSMへの送信
- 13-6 SSMからの受信
- 13-7 出力インターフェースを指定する(IPv4)
- 13-8 出力インターフェースを指定する(IPv6)
- 13-9 ASMにおけるマルチキャストソースフィルタ設定例
- 13-16 旧APIでのマルチキャスト受信プログラム
- A-2 gethostbyname()の利用例
- A-4 gethostbyaddr()の利用例
- A-9 inet_ntoa()とinet_addr()を利用する
- A-10 inet_ntoa()/inet_addr()の落とし穴
Errata
拙著の内容
はじめに、目次、Chapter 1〜Chapter 3のPDFダウンロード
chapter 1 インターネットの仕組み
- 1-1 インターネットとは
- ネットワークとインターネット
- 初期のインターネット設計思想
- パケットという考え方
- 1-2 OSI 7層モデル
- 物理層とリンク層
- ネットワーク層
- トランスポート層
- セッション層とプレゼンテーション層、アプリケーション層
- 1-3 TCPとUDPの概要
- コネクション型プロトコル〜TCP
- コネクションレス型プロトコル〜UDP
- 1-4 IPアドレス
- ネットワーク部とホスト部
- IPアドレスの種類
- IPアドレスの一意性
- プライベートアドレス
- 1-5 ドメイン名とホスト名
- ドメインネームシステム
- 1-6 Webとメールの仕組み
- Hyper Text Transfer Protocol
- Web ブラウザが行うURLの解釈処理
- メールの仕組み
- 1-7 IPv4とIPv6・
- IPv6への移行
- 1-8 Chapter 1 のまとめ
chapter 2 TCP通信の基礎
- 2-1 TCPによるプログラミングの流れ
- ソケットとプログラミング
- Linuxにおけるソケットの作成
- 2-2 TCP サーバ/クライアントの実装
- 単純なTCPサーバの実装
- 単純なTCPクライアントの実装
- 2-3 ソケットプログラミングのエラー処理
- errnoとperror
- ソケット作成の失敗とperror利用例
- perrorとスレッド処理
- printf()とperror()の実行順
- bind()の意味
- listen()の意味
- 無効になったソケットに対するデータ送信
- 文字列でのエラー内容取得
- 2-4 名前解決の実装
- 名前解決のサンプルプログラム
- エラー解析関数
- IPv6とIPv4両方に対応する
- getaddrinfo()をbind()で使う
- 2-5 単純なファイル転送プログラム
- ファイル送信側サンプルプログラム
- ファイル受信側サンプルプログラム
- 2-6 単純なHTTPクライアント/サーバ
- HTTPクライアントの実装
- HTTPサーバの実装
- 2-7 Chapter2 のまとめ
chapter 3 UDP通信の基礎
- 3-1 UDPの特徴とプログラミング
- 3-2 UDP のプログラミング
- 単純なUDP受信プログラム
- 単純なUDP送信プログラム
- getaddrinfo()を利用したUDP プログラム
- IPv6が未設定の環境を想定する
- 3-3 ブロードキャストプログラミング
- ブロードキャスト送信プログラム
- 3-4 マルチキャストプログラミング
- マルチキャスト送信プログラム
- マルチキャスト受信プログラム
- 3-5 UDP ソケットの「名前」とbind()
- UDPでの「返信」
- 3-6 ソケットバッファ
- 3-7 Chapter3 のまとめ
chapter 4 ネットワーク情報の取得と設定
- 4-1 ネットワークインターフェース
- インターフェース名とインターフェース番号
- インターフェース情報一覧の取得
- インターフェース一覧のみの取得
- インターフェース名の変更
- ハードウェアアドレスの取得
- IPアドレスの設定
- ネットマスクの設定
- up/down状態
- ハードウェアアドレスの設定
- MTUの取得/設定
- 4-2 /procインターフェース
- 経路テーブル
- ネットワークデバイス統計情報
- IPv6アドレス
- ARP
- 開いているソケット情報
- 4-3 Chapter 4 のまとめ
chapter 5 Netlinkによる情報取得と設定
- 5-1 Netlinkの概要
- Netlinkを使ったプログラムの流れ
- Netlinkソケットの作成
- 5-2 Netlinkメッセージの送受信
- NetlinkユニキャストとNetlink マルチキャスト
- sockaddr_nl構造体
- Netlinkメッセージフォーマット
- NETLINK_ROUTEプロトコル
- 5-3 インターフェース情報の取得
- インターフェースをdown状態にする
- MTUの設定
- 5-4 IPアドレスの取得
- 5-5 IPアドレス変更通知の受け取り
- マルチキャストに必要な特権
- 5-6 IPアドレスの設定
- IPアドレスの削除
- 5-7 Chapter 5 のまとめ
chapter 6 基本的な通信関連関数
- 6-1 ノンブロッキングモード
- ノンブロッキングでのUDP受信
- 6-2 エンディアンとネットワークバイトオーダー
- バイトオーダー
- エンディアン同士の相互変換
- 数値や構造体を送信するときの注意点
- 相互接続の注意点
- 6-3 ソケットの設定を取得する
- ソケットの名前を取得する
- 接続相手の情報を取得する
- 6-4 シグナルハンドリング
- 6-5 知っておくと便利なマクロ
- IPv4アドレス用マクロ
- IPv6アドレス用マクロ
- IPアドレス用文字列のサイズ
- 6-6 Chapter 6 のまとめ
chapter 7 プロセス間通信
- 7-1 プロセス
- プロセスを生成する
- 7-2 スレッド
- 7-3 プロセス間通信とは
- 7-4 シグナル
- kill()システムコール
- シグナルハンドラ
- 7-5 UNIX ソケット
- SOCK_DGRAMでUNIXソケットを使う
- 7-6 ソケットペア
- 7-7 パイプ
- コマンドラインのパイプ
- 7-8 System V IPC
- IPC資源とIPCキー
- 共有メモリ
- セマフォ
- メッセージキュー
- POSIX IPC関数
- pthread mutexをプロセス間で利用する
- 7-9 Chapter 7 のまとめ
chapter 8 複数のソケットを扱う
- 8-1 epoll とは
- epoll_create()システムコール
- epoll_ctl()システムコール
- epoll_wait システムコール
- 8-2 単純なepoll
- データの受信プログラム
- データの送信プログラム
- 8-3 epoll_wait()の活用
- 送信可能かどうかのチェック
- タイムアウトのチェック connect()処理の終了v
- 8-4 epoll_wait()の解除
- シグナルを送信する
- ソケットペアを使う
- 8-5 select()とpoll()
- select()システムコール
- poll()システムコール
- 送信可能かどうかのチェック
- タイムアウトのチェック
- 8-6 Chapter 8 のまとめ
chapter 9 通信プログラムのデバッグ
- 9-1 パケットキャプチャによるデバッグ
- 機器内で直接パケットを見る方法
- 通信路でパケットを見る方法
- パケットキャプチャと暗号化
- 9-2 インターネットとカプセル化
- プロミスキャスモード
- 9-3 Wireshark
- Wiresharkの基本動作
- キャプチャフィルタ
- Follow TCP Stream
- フィルタ機能
- 9-4 各種ヘッダ
- IPv4ヘッダ
- IPv6ヘッダ
- TCPヘッダ
- UDPヘッダ
- ICMPヘッダ
- 9-5 tcpdump
- 主なオプション
- キャプチャパケットをファイルに保存
- 条件式を指定してフィルタリング
- 9-6 デバッグTIPS
- なぜ接続できないのか?
- TCP接続を切断したのはどちら?
- TCPでデータがこない?
- パケットが出てる?来てる?
- 9-7 Chapter 8 のまとめ
chapter 10 TCPサーバプログラミング
- 10-1 複数セッションの並列処理
- fork()を利用する
- スレッドを利用する
- epollを利用する
- 10-2 TCP とTIME_WAIT
- TIME_WAIT状態
- ポート番号をすぐに再利用する
- 10-3 shutdown()の活用
- 10-4 ルートディレクトリを仮想的に変更
- chroot jailを抜ける
- 10-5 デーモン化
- 10-6 syslogへの対応
- syslog()の利用プログラム
- 10-7 Chapter 10 のまとめ
chapter 11 デュアルスタックプログラミング
- 11-1 sockaddr_in6構造体
- 11-2 sockaddr_storage構造体
- 11-3 IPv4射影アドレス
- 11-4 IPv4アドレス枯渇とIPv6
- インターネットアーキテクチャの変化
- Large Scale NAT
- 日本国内における影響
- 11-5 Chapter11 のまとめ
chapter 12 生パケットプログラミング
- 12-1 RAWソケット
- 12-2 AF_PACKET
- SOCK_DGRAMとSOCK_RAWの違い
- sockaddr_ll
- AF_PACKETを利用したICMP ECHOの送受信
- プロミスキャスモード
- bind()
- 12-3 pcapを使ったキャプチャ
- インストールとコンパイル
- パケットキャプチャの流れ
- pcapを使ったキャプチャ
- フィルタを利用する
- ファイルへの書き出し
- ファイルからの読み込み
- 12-4 Chapter 12 のまとめ
chapter 13 マルチキャストプログラミング
- 13-1 マルチキャストアドレス
- 動的なマルチキャストアドレス割り当て
- TTLとスコープ
- IPv6でのマルチキャストアドレス
- マルチキャストTTL の設定(IPv4)
- 13-2 Source Specific Multicast
- SSMを利用する
- SSMへの送信
- 13-3 出力インターフェースの指定
- 出力インターフェースを指定する(IPv4)
- 出力インターフェースを指定する(IPv6)
- 13-4 ASMにおけるマルチキャストソースフィルタ
- 13-5 マルチキャストフィルタ情報の取得
- 13-6 IP_MULTICAST_LOOP
- JOINできる最大数
- 13-7 マルチキャスト関連の旧API
- IP_ADD_MEMBERSHIPの利用(IPv4)
- 13-8 Chapter 13 のまとめ
Appendix
- IPv4しか扱えない関数
- gethostbyname()
- gethostbyaddr()
- herror()、hstrerror()
- inet_ntoa()、inet_addr()
- IPv4専用関数の落とし穴
コラム一覧
- システムコールとは
- サンプルプログラムの実行について
- man と章番号
- 非同期シグナルセーフな関数
- サブネットブロードキャストを利用したDoS
- 困ったときのnet-tools ソースコード
- ビッグエンディアンとリトルエンディアンの語源
- SIGHUP
- IPC_PRIVATE?
- select()とMSG_OOB
- ぁゃτぃUNIX用語
- Wiresharkとethereal
- Bugzilla
- プリプロセッサで処理される組み込みマクロ