Skip to content

Address

tofu supports two transport types: TCP and Unix Domain Sockets (UDS).

Address helpers do two things:

  1. Set the message opCode (HelloRequest or WelcomeRequest)
  2. Add the address header (~connect_to or ~listen_on)

One call prepares a complete connection or listener message.


Address Types

Type Use Case Format
TCP Client Connect to a server IP address + port
TCP Server Listen for connections IP address + port
UDS Client Connect via Unix socket File path
UDS Server Listen via Unix socket File path

TCP Addresses

TCPClientAddress

For connecting to a TCP server.

Connect to localhost:7099
var addr: Address = .{
    .tcp_client_addr = address.TCPClientAddress.init("127.0.0.1", 7099)
};
try addr.format(msg.?);  // Sets opCode=HelloRequest, adds ~connect_to header

TCPServerAddress

For listening on a TCP port.

Listen on all interfaces, port 7099
var addr: Address = .{
    .tcp_server_addr = address.TCPServerAddress.init("0.0.0.0", 7099)
};
try addr.format(msg.?);  // Sets opCode=WelcomeRequest, adds ~listen_on header

Common IP values:

Address Meaning
0.0.0.0 All IPv4 interfaces (listen on all)
127.0.0.1 Localhost only (loopback)
192.168.x.x Specific network interface

UDS Addresses

Unix Domain Sockets use file paths instead of IP:port.

NAQ: When should I use UDS vs TCP?

Use UDS when both sides run on the same machine. No network overhead. Use TCP when sides run on different machines, or when you need standard ports.

UDSClientAddress

Connect via Unix socket
var addr: Address = .{
    .uds_client_addr = address.UDSClientAddress.init("/tmp/my-app.sock")
};
try addr.format(msg.?);  // Sets opCode=HelloRequest, adds ~connect_to header

UDSServerAddress

Listen via Unix socket
var addr: Address = .{
    .uds_server_addr = address.UDSServerAddress.init("/tmp/my-app.sock")
};
try addr.format(msg.?);  // Sets opCode=WelcomeRequest, adds ~listen_on header

UDS paths

The socket file is created when the server starts listening. If the file already exists, listen may fail. tofu cleans socket file before start of the listen.


Wire Format

Address headers use pipe-separated format:

~connect_to: "tcp|127.0.0.1|7099"
~connect_to: "uds|/tmp/socket.sock"
~listen_on: "tcp|0.0.0.0|7099"
~listen_on: "uds|/tmp/socket.sock"

Use helpers, not strings

Always use the address helpers (TCPClientAddress, etc.) instead of building header strings manually. The helpers handle formatting correctly.


Complete Examples

TCP Client connecting to server

var msg = try ampe.get(.always);
defer ampe.put(&msg);

var addr: Address = .{
    .tcp_client_addr = address.TCPClientAddress.init("192.168.1.100", 8080)
};
try addr.format(msg.?);

const bhdr = try chnls.post(&msg);
const server_channel = bhdr.channel_number;

TCP Server starting listener

var msg = try ampe.get(.always);
defer ampe.put(&msg);

var addr: Address = .{
    .tcp_server_addr = address.TCPServerAddress.init("0.0.0.0", 8080)
};
try addr.format(msg.?);

const bhdr = try chnls.post(&msg);
const listener_channel = bhdr.channel_number;

// Wait for confirmation
var resp = try chnls.waitReceive(timeout);
defer ampe.put(&resp);
// resp.bhdr.proto.opCode == .WelcomeResponse

UDS for same-machine communication

// Server
var srvAddr: Address = .{
    .uds_server_addr = address.UDSServerAddress.init("/var/run/myapp.sock")
};

// Client (same machine)
var cltAddr: Address = .{
    .uds_client_addr = address.UDSClientAddress.init("/var/run/myapp.sock")
};

Quick Reference

Address type OpCode set Header added
TCPClientAddress HelloRequest ~connect_to: tcp\|...\|...
TCPServerAddress WelcomeRequest ~listen_on: tcp\|...\|...
UDSClientAddress HelloRequest ~connect_to: uds\|...
UDSServerAddress WelcomeRequest ~listen_on: uds\|...