Address
tofu supports two transport types: TCP and Unix Domain Sockets (UDS).
Address helpers do two things:
- Set the message opCode (HelloRequest or WelcomeRequest)
- 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.
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.
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
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
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\|... |