std::net - TCP/UDP通信

低レベルのソケット通信モジュール。TCP/UDP/DNS/イベント多重化(poll)を提供します。

対応バックエンド: Native (LLVM) のみ

最終更新: 2026-02-08


TCP通信

エコーサーバ

import std::net::tcp_listen;
import std::net::tcp_accept;
import std::net::tcp_read;
import std::net::tcp_write;
import std::net::tcp_close;
import std::net::buf_create;
import std::net::buf_get;
import std::net::buf_destroy;
import std::io::println;

int main() {
    long server_fd = tcp_listen(8080);
    println("Listening on port 8080");

    long client = tcp_accept(server_fd);
    long buf = buf_create(256);
    int n = tcp_read(client, buf, 255);
    if (n > 0) {
        tcp_write(client, buf, n);  // エコーバック
    }
    buf_destroy(buf);
    tcp_close(client);
    tcp_close(server_fd);
    return 0;
}

TCPクライアント

import std::net::tcp_connect;
import std::net::tcp_read;
import std::net::tcp_write;
import std::net::tcp_close;
import std::net::buf_create;
import std::net::buf_set;
import std::net::buf_get;
import std::net::buf_destroy;
import std::io::println;

int main() {
    long fd = tcp_connect("127.0.0.1" as long, 8080);
    long msg = buf_create(4);
    buf_set(msg, 0, 72);   // H
    buf_set(msg, 1, 105);  // i
    buf_set(msg, 2, 33);   // !
    tcp_write(fd, msg, 3);
    buf_destroy(msg);

    long rbuf = buf_create(256);
    int n = tcp_read(fd, rbuf, 255);
    println("Received {n} bytes");
    buf_destroy(rbuf);
    tcp_close(fd);
    return 0;
}

TCP API

関数 説明
tcp_listen(port) サーバソケット作成(bind+listen)
tcp_accept(server_fd) クライアント接続受付(ブロッキング)
tcp_connect(host, port) サーバに接続
tcp_read(fd, buf, size) データ読み取り → 読み取ったバイト数
tcp_write(fd, buf, size) データ書き込み → 書き込んだバイト数
tcp_close(fd) ソケットクローズ
tcp_set_nonblocking(fd) ノンブロッキングモード設定

バッファ操作

TCPではバイト列を直接操作するため、ヒープバッファAPIを使用します。

関数 説明
buf_create(size) ヒープバッファ作成
buf_set(buf, index, value) バイト書き込み
buf_get(buf, index) バイト読み取り
buf_destroy(buf) バッファ解放

UDP通信

import std::net::udp_create;
import std::net::udp_bind;
import std::net::udp_sendto;
import std::net::udp_recvfrom;
import std::net::udp_close;
import std::net::buf_create;
import std::net::buf_set;
import std::net::buf_destroy;

int main() {
    long fd = udp_create();
    udp_bind(fd, 9000);

    long buf = buf_create(256);
    int n = udp_recvfrom(fd, buf, 255);
    // ... process data ...
    buf_destroy(buf);
    udp_close(fd);
    return 0;
}

UDP API

関数 説明
udp_create() UDPソケット作成
udp_bind(fd, port) ポートにバインド
udp_sendto(fd, host, port, buf, size) データグラム送信
udp_recvfrom(fd, buf, size) データグラム受信
udp_close(fd) ソケットクローズ
udp_set_broadcast(fd) ブロードキャスト有効化

DNS解決

import std::net::dns_resolve;
string ip = dns_resolve("example.com");
// ip = "93.184.216.34"

ソケットオプション

TCP/UDP共通のオプション設定。

関数 説明
socket_set_timeout(fd, ms) 送受信タイムアウト(ミリ秒)
socket_set_reuse_addr(fd) アドレス再利用 (TIME_WAIT回避)
socket_set_nodelay(fd) Nagle無効化 (低レイテンシ)
socket_set_keepalive(fd) KeepAlive有効化
socket_set_recv_buffer(fd, size) 受信バッファサイズ
socket_set_send_buffer(fd, size) 送信バッファサイズ

イベント多重化 (poll)

複数ソケットを効率的に監視するためのAPI (kqueue/poll ベース)。

import std::net::poll_create;
import std::net::poll_add;
import std::net::poll_wait;
import std::net::poll_get_fd;
import std::net::poll_get_events;
import std::net::poll_destroy;
import std::net::poll_read_flag;

long poller = poll_create();
poll_add(poller, server_fd, poll_read_flag());

int ready = poll_wait(poller, 1000);  // 1秒タイムアウト
for (int i = 0; i < ready; i++) {
    long fd = poll_get_fd(poller, i);
    int events = poll_get_events(poller, i);
    // ... handle events ...
}

poll_destroy(poller);

イベントフラグ

関数 説明
poll_read_flag() 1 読み取り可能
poll_write_flag() 2 書き込み可能
poll_error_flag() 4 エラー発生
poll_hup_flag() 8 接続切断

関連: HTTP通信(高レベルAPI)