Category

C++26でネットワークプログラミング

C++26のstd::span、std::expectedなどのエルゴノミクスを使い、L2から上位のネットワークスタックを軽微に実装します。

5件の記事

ARP requestを実際に送ってIPアドレスをMACアドレスに解決する

指定したIPアドレスに対してARP requestを送信し、返ってきたreplyからMACアドレスを解決する`arp_resolve`を実装しました。Ethernetヘッダを手で組み立てる方法、ioctlでローカルのMAC/IPを取得する方法、そして「本当に待っていたreplyか」を見極める必要がある理由を扱います。

続きを読む

IP→MAC対応をキャッシュするArpCacheとTTL設計

ARPで解決したIP→MAC対応をキャッシュする`ArpCache`を実装しました。std::unordered_mapに独自のハッシュ関数を渡す方法、TTLの期限切れをsleepなしでテストする方法、そして実機のARPトラフィックでTTL失効を確認するところまでをまとめます。

続きを読む

AF_PACKET raw socketによるL2フレームキャプチャの実装

AF_PACKET raw socketでNICからEthernetフレームを直接送受信する`RawSocket`を実装しました。OSリソースの所有権をクラスとして表現する設計判断と、実機で実際のARPトラフィックを観測した結果までをまとめます。

続きを読む

ARPパケットの解析とバイト列の組み立て

ARPパケットのヘッダ構造をパースし、Request/Replyそれぞれのバイト列を組み立てる実装を行いました。エラー型をどう分割するか、パースと組み立てをラウンドトリップでテストする設計判断を整理します。

続きを読む

std::span/std::expectedで設計するEthernet IIフレーム解析

C++26対応のGCC 15と、std::span・std::expectedを使ってEthernet IIフレームのヘッダ解析を実装しました。生バイト列をコピーせずに扱う設計や、コンパイル時にサイズを保証するstd::spanの使い方、失敗をどこでどう表現するかという判断を整理します。

続きを読む