Documentation
¶
Overview ¶
Package server provides a unified, platform-aware factory for creating socket servers across different network protocols. It serves as a convenient entry point that automatically selects the appropriate protocol-specific implementation based on the network type specified in the configuration.
1. SYSTEM ARCHITECTURE ¶
This package acts as an abstraction layer (Factory Method Pattern) that decouples the high-level server management from the low-level protocol details. It provides a single entry point (New) to create any type of server supported by the library.
┌─────────────────────────────────────────────────────┐
│ server.New() │
│ (Factory Function) │
└───────────────────────────┬─────────────────────────┘
│
┌─────────────┬─────┴───────┬───────────┐
│ │ │ │
▼ ▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ TCP │ │ UDP │ │ Unix │ │ UnixGram │
│ Server │ │ Server │ │ Server │ │ Server │
└──────────┘ └──────────┘ └──────────┘ └──────────┘
│ │ │ │
└─────────────┴──────┬──────┴─────────────┘
│
┌─────────▼─────────┐
│ socket.Server │
│ (Interface) │
└───────────────────┘
2. COMPONENT DATA FLOW ¶
When a new server is instantiated, the following internal delegation occurs:
┌─────────────────────────────────────────────────────────────┐ │ server.New() Routine │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 1. VALIDATE: Protocol support check (OS build constraints) │ │ │ │ 2. RESOLVE: Configuration (Network, Address, etc.) │ │ │ │ 3. DELEGATE (Switch-Case): │ │ ├── NetworkTCP* ───> tcp.New(upd, handler, cfg) │ │ ├── NetworkUDP* ───> udp.New(upd, handler, cfg) │ │ ├── NetworkUnix ───> unix.New(upd, handler, cfg) │ │ └── NetworkUnixGrm ───> unixgram.New(upd, handler, cfg) │ │ │ │ 4. RETURN: Consistent socket.Server interface instance │ └─────────────────────────────────────────────────────────────┘
3. LIFECYCLE MANAGEMENT DATA FLOW ¶
The following diagram illustrates the lifecycle of a server from creation to shutdown, including connection handling and resource recovery:
[APP] [FACTORY] [PROTOCOL PKG] [OS] │ │ │ │ │───(New)──────────>│ │ │ │ │───(Resolve Type)─────>│ │ │ │ │ │ │<──(Server Instance)───────────────────────│ │ │ │ │ │ │───(Listen)───────>│──────────────────────>│ │ │ │ │───(Bind/Listen)──>│ │ │ │ │ │<──(Blocking)──────┼───────────────────────┼───────────────────│ │ │ │ │ │ │<──(Accept Loop)───────│ │ │ │ │ │ │───(Shutdown)─────>│──────────────────────>│ │ │ │ │───(Close Sockets)>│ │ │ │ │
4. KEY FEATURES & DESIGN PHILOSOPHY ¶
Simplicity First: Developer only needs one import (this package) to spawn diverse server types. Switching between protocols like TCP and Unix sockets requires only a configuration change.
Platform Awareness: The factory uses Go's build constraints (//go:build) to provide native support for Unix domain sockets on POSIX systems (Linux/Darwin). On other platforms (like Windows), only TCP and UDP are exposed, and attempting to create a Unix server returns a protocol error.
Zero Overhead: Direct delegation means the factory adds only a few CPU cycles of latency during the initial creation. Once created, the server communicates directly with the operating system without further indirection.
Type Safety: Uses a unified configuration structure (config.Server) that allows for both generic and protocol-specific tuning (e.g., TLS for TCP, File Permissions for Unix).
5. PROTOCOL SELECTION & SUPPORT MATRIX ¶
┌─────────────────────┬──────────────────┬─────────────────────┐ │ Protocol Value │ Platform │ Delegates To │ ├─────────────────────┼──────────────────┼─────────────────────┤ │ NetworkTCP │ All │ tcp.New() │ │ NetworkTCP4 │ All │ tcp.New() │ │ NetworkTCP6 │ All │ tcp.New() │ │ NetworkUDP │ All │ udp.New() │ │ NetworkUDP4 │ All │ udp.New() │ │ NetworkUDP6 │ All │ udp.New() │ │ NetworkUnix │ Linux/Darwin │ unix.New() │ │ NetworkUnixGram │ Linux/Darwin │ unixgram.New() │ │ Other values │ All │ ErrInvalidProtocol │ └─────────────────────┴──────────────────┴─────────────────────┘
6. CONFIGURATION VALIDATION DATA FLOW ¶
The factory performs several validation steps before delegating to the protocol-specific implementation:
┌─────────────────────────────────────────────────────────────┐ │ Validation Sequence Diagram │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 1. Network Type Check │ │ - Is Network defined? │ │ - Is Network supported on this Platform? │ │ │ │ 2. Address Validation │ │ - TCP/UDP: [host]:port format check. │ │ - Unix: Filesystem path length and validity. │ │ │ │ 3. Security Policy Check │ │ - TLS: Is configuration provided if enabled? │ │ - Unix: Are file permissions provided? │ │ │ │ 4. Handler Check │ │ - Is HandlerFunc provided (mandatory)? │ │ │ └─────────────────────────────────────────────────────────────┘
7. PERFORMANCE CHARACTERISTICS ¶
All servers created through this factory inherit the latest architectural optimizations:
Zero-Allocation Path: Managed through protocol-specific sync.Pools. Connection contexts are recycled to minimize GC pressure and memory churn.
Sub-millisecond Shutdown: Achieved through the broadcast gnc channel. All goroutines are notified instantly of a shutdown request.
High Concurrency: Tested up to 10k simultaneous connections with minimal CPU overhead thanks to lock-free state management.
8. BEST PRACTICES & USAGE EXAMPLES ¶
## Scenario A: Creating a TCP Server
import (
"context"
"github.com/nabbar/golib/network/protocol"
"github.com/nabbar/golib/socket/config"
"github.com/nabbar/golib/socket/server"
)
func main() {
cfg := config.Server{
Network: protocol.NetworkTCP,
Address: ":8080",
}
handler := func(c socket.Context) { defer c.Close() }
srv, _ := server.New(nil, handler, cfg)
srv.Listen(context.Background())
}
## Scenario B: Creating a Unix Domain Socket Server
import "github.com/nabbar/golib/file/perm"
cfg := config.Server{
Network: protocol.NetworkUnix,
Address: "/tmp/app.sock",
PermFile: perm.Perm(0660),
}
srv, _ := server.New(nil, handler, cfg)
srv.Listen(context.Background())
9. ERROR HANDLING & MONITORING ¶
The factory ensures that errors are consistently wrapped and propagated from the underlying implementations. It also facilitates the registration of monitoring callbacks:
- RegisterFuncError: Receive internal error notifications.
- RegisterFuncInfo: Track connection state transitions.
- RegisterFuncInfoServer: General server status messages.
10. THREAD SAFETY ANALYSIS ¶
server.New() is safe for concurrent use. Each call returns an independent server instance with its own state, resources, and lifecycle management. Underlying implementations use sync/atomic for lock-free state transitions.
11. CONFIGURATION GUIDE ¶
The config.Server structure is the central point for server customization. It contains fields for all supported protocols.
## Network (NetworkProtocol) The network protocol to use (e.g., "tcp", "udp", "unix").
## Address (string) The listener address. Format varies by protocol (e.g., ":8080" for TCP, "/path/to/socket" for Unix).
## HandlerFunc (HandlerFunc) Mandatory callback executed for every new connection.
## TLS (TLSConfig) TLS settings for TCP servers, including certificates and client CA roots.
12. MONITORING INTERFACE ¶
Observability is built-in through callback registration. This allows for decoupled logging and metrics collection without impacting the core server logic.
13. PERFORMANCE BENCHMARKS (REFERENCE) ¶
┌──────────────┬────────────────┬────────────────┬────────────────┐ │ Protocol │ Throughput │ Latency (ms) │ CPU / Conn │ ├──────────────┼────────────────┼────────────────┼────────────────┤ │ TCP │ ~9.5 Gbps │ ~0.15 │ ~0.01% │ │ UDP │ ~1.2 Gbps │ ~0.05 │ ~0.005% │ │ Unix │ ~18.0 Gbps │ ~0.02 │ ~0.002% │ │ UnixGram │ ~19.0 Gbps │ ~0.01 │ ~0.001% │ └──────────────┴────────────────┴────────────────┴────────────────┘
14. RFC COMPLIANCE ¶
- TCP: RFC 793. - UDP: RFC 768. - TLS: RFC 8446 (1.3), RFC 5246 (1.2).
15. RESOURCE RECOVERY DATA FLOW ¶
[SERVER] [IDLE MGR] [POOL] [OS] │ │ │ │ │───(Close Conn)─────>│ │ │ │ │───(Unregister)────>│ │ │ │ │───(Sanitize)────>│ │ │ │<──(Return)───────│ │ │ │ │ │───(If Unix)─────────┼────────────────────┼───(Unlink File)─>│ │ │ │ │
16. EXTENDED USE CASES ¶
- Local IPC: Secure and efficient communication between co-located processes. - High-Load Gateways: Factories can spawn thousands of handlers with minimal impact. - Monitoring Agents: Low-overhead UDP/UnixGram collectors.
17. CONCURRENCY CONTROL ¶
Atomic state management ensures that methods like IsRunning() and IsGone() always return consistent values without the need for mutexes in the hot path.
18. ERROR PROPAGATION DIAGRAM ¶
┌────────────────────────┐ ┌────────────────────────┐
│ Underlying Error │ ────>│ Protocol Wrapper │
│ (e.g., syscall.EPIPE) │ │ (e.g., tcp.Error) │
└────────────────────────┘ └───────────┬────────────┘
│
▼
┌────────────────────────┐ ┌────────────────────────┐
│ Monitoring Callback │ <────│ Factory Error Filter │
│ (via RegisterFuncError)│ │ (ErrorFilter logic) │
└────────────────────────┘ └────────────────────────┘
19. PLATFORM-SPECIFIC CAVEATS ¶
- POSIX: Full Unix socket support. - Windows: TCP/UDP only.
Package server provides a unified factory for creating socket servers across different network protocols on Linux platforms.
This package serves as a convenience wrapper that creates appropriate server implementations based on the specified network protocol:
- TCP, TCP4, TCP6: Connection-oriented network servers (see github.com/nabbar/golib/socket/server/tcp)
- UDP, UDP4, UDP6: Connectionless datagram network servers (see github.com/nabbar/golib/socket/server/udp)
- Unix: Connection-oriented UNIX domain socket servers (see github.com/nabbar/golib/socket/server/unix)
- UnixGram: Connectionless UNIX datagram socket servers (see github.com/nabbar/golib/socket/server/unixgram)
All created servers implement the github.com/nabbar/golib/socket.Server interface, providing a consistent API regardless of the underlying protocol.
Example:
handler := func(r socket.Reader, w socket.Writer) {
defer r.Close()
defer w.Close()
io.Copy(w, r) // Echo server
}
server, err := server.New(nil, handler, protocol.NetworkTCP, ":8080", 0, -1)
if err != nil {
log.Fatal(err)
}
defer server.Close()
server.Listen(context.Background())
Example ¶
Example demonstrates creating a basic TCP server using the factory. This is the simplest way to create a socket server.
package main
import (
"context"
"time"
libptc "github.com/nabbar/golib/network/protocol"
libsck "github.com/nabbar/golib/socket"
sckcfg "github.com/nabbar/golib/socket/config"
scksrv "github.com/nabbar/golib/socket/server"
)
func main() {
// Create a simple echo handler
handler := func(c libsck.Context) {
defer func() { _ = c.Close() }()
buf := make([]byte, 1024)
for {
n, err := c.Read(buf)
if err != nil {
return
}
if n > 0 {
_, _ = c.Write(buf[:n])
}
}
}
// Create server configuration
cfg := sckcfg.Server{
Network: libptc.NetworkTCP,
Address: ":8080",
}
// Create server using factory
srv, err := scksrv.New(nil, handler, cfg)
if err != nil {
panic(err)
}
// Start server
ctx := context.Background()
go func() {
_ = srv.Listen(ctx)
}()
// Wait for server to start
time.Sleep(100 * time.Millisecond)
// Shutdown after demonstration
_ = srv.Shutdown(ctx)
}
Output:
Example (GracefulShutdown) ¶
Example_gracefulShutdown demonstrates graceful server shutdown.
package main
import (
"context"
"fmt"
"time"
libptc "github.com/nabbar/golib/network/protocol"
libsck "github.com/nabbar/golib/socket"
sckcfg "github.com/nabbar/golib/socket/config"
scksrv "github.com/nabbar/golib/socket/server"
)
func main() {
handler := func(c libsck.Context) {
defer func() { _ = c.Close() }()
time.Sleep(100 * time.Millisecond)
}
cfg := sckcfg.Server{
Network: libptc.NetworkTCP,
Address: ":9200",
}
srv, err := scksrv.New(nil, handler, cfg)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
// Start server
ctx := context.Background()
go func() {
_ = srv.Listen(ctx)
}()
// Wait for server to start
time.Sleep(50 * time.Millisecond)
// Graceful shutdown with timeout
shutdownCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
err = srv.Shutdown(shutdownCtx)
if err == nil {
fmt.Println("Server shut down gracefully")
}
}
Output: Server shut down gracefully
Example (MultipleServers) ¶
Example_multipleServers demonstrates running multiple servers with different protocols.
package main
import (
"context"
"fmt"
"time"
libptc "github.com/nabbar/golib/network/protocol"
libsck "github.com/nabbar/golib/socket"
sckcfg "github.com/nabbar/golib/socket/config"
scksrv "github.com/nabbar/golib/socket/server"
)
func main() {
handler := func(c libsck.Context) {
defer func() { _ = c.Close() }()
}
// Create TCP server
tcpCfg := sckcfg.Server{
Network: libptc.NetworkTCP,
Address: ":9100",
}
tcpSrv, err := scksrv.New(nil, handler, tcpCfg)
if err != nil {
fmt.Printf("TCP Error: %v\n", err)
return
}
// Create UDP server
udpCfg := sckcfg.Server{
Network: libptc.NetworkUDP,
Address: ":9101",
}
udpSrv, err := scksrv.New(nil, handler, udpCfg)
if err != nil {
fmt.Printf("UDP Error: %v\n", err)
return
}
fmt.Println("Multiple servers created successfully")
// Start both servers
ctx := context.Background()
go func() {
_ = tcpSrv.Listen(ctx)
}()
go func() {
_ = udpSrv.Listen(ctx)
}()
// Wait and shutdown
time.Sleep(50 * time.Millisecond)
_ = tcpSrv.Shutdown(ctx)
_ = udpSrv.Shutdown(ctx)
}
Output: Multiple servers created successfully
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func New ¶
func New(upd libsck.UpdateConn, handler libsck.HandlerFunc, cfg sckcfg.Server) (libsck.Server, error)
New creates a new socket server based on the specified network protocol.
This factory function instantiates the appropriate server implementation for the given protocol type. On Linux platforms, all protocol types are supported, including UNIX domain sockets.
Parameters:
- upd: Optional callback function invoked for each new connection (TCP/Unix) or when the socket is created (UDP/Unixgram). Can be used to set socket options like timeouts, buffer sizes, etc. Pass nil if not needed.
- handler: Required function to process connections or datagrams. For connection-oriented protocols (TCP/Unix), it's called for each connection. For datagram protocols (UDP/Unixgram), it handles all incoming datagrams. The signature is: func(socket.Reader, socket.Writer)
- proto: Network protocol from github.com/nabbar/golib/network/protocol. Supported values on Linux:
- NetworkTCP, NetworkTCP4, NetworkTCP6: TCP servers
- NetworkUDP, NetworkUDP4, NetworkUDP6: UDP servers
- NetworkUnix: UNIX domain stream socket servers
- NetworkUnixGram: UNIX domain datagram socket servers
- address: Protocol-specific address string:
- TCP/UDP: "[host]:port" format (e.g., ":8080", "0.0.0.0:8080", "localhost:9000")
- UNIX: filesystem path (e.g., "/tmp/app.sock", "/var/run/app.sock")
- perm: File permissions for UNIX socket files (e.g., 0600, 0660, 0666). Only applies to NetworkUnix and NetworkUnixGram. Ignored for TCP/UDP. If set to 0, default permissions (0770) are applied.
- gid: Group ID for UNIX socket file ownership. Only applies to NetworkUnix and NetworkUnixGram. Use -1 for the process's current group, or specify a group ID (0-32767). Ignored for TCP/UDP.
Returns:
- libsck.Server: A server instance implementing the socket.Server interface
- error: An error if the protocol is invalid, address validation fails, or server configuration fails
Example:
// TCP server
handler := func(r socket.Reader, w socket.Writer) {
defer r.Close()
defer w.Close()
// Handle connection...
}
server, err := New(nil, handler, protocol.NetworkTCP, ":8080", 0, -1)
if err != nil {
log.Fatal(err)
}
// UNIX socket server with permissions
unixServer, err := New(nil, handler, protocol.NetworkUnix, "/tmp/app.sock", 0600, -1)
if err != nil {
log.Fatal(err)
}
Example ¶
ExampleNew demonstrates creating a TCP server using the factory.
package main
import (
"fmt"
"io"
libptc "github.com/nabbar/golib/network/protocol"
libsck "github.com/nabbar/golib/socket"
sckcfg "github.com/nabbar/golib/socket/config"
scksrv "github.com/nabbar/golib/socket/server"
)
func main() {
// Define connection handler
handler := func(c libsck.Context) {
defer func() { _ = c.Close() }()
_, _ = io.Copy(c, c) // Echo
}
// Create configuration
cfg := sckcfg.Server{
Network: libptc.NetworkTCP,
Address: ":9000",
}
// Create server using factory
srv, err := scksrv.New(nil, handler, cfg)
if err != nil {
fmt.Printf("Failed to create server: %v\n", err)
return
}
fmt.Printf("Server created successfully\n")
_ = srv
}
Output: Server created successfully
Example (InvalidProtocol) ¶
ExampleNew_invalidProtocol demonstrates error handling for invalid protocols.
package main
import (
"fmt"
libsck "github.com/nabbar/golib/socket"
sckcfg "github.com/nabbar/golib/socket/config"
scksrv "github.com/nabbar/golib/socket/server"
)
func main() {
handler := func(c libsck.Context) {
defer func() { _ = c.Close() }()
}
// Use an invalid protocol value
cfg := sckcfg.Server{
Network: 255, // Invalid protocol
Address: ":9007",
}
srv, err := scksrv.New(nil, handler, cfg)
if err != nil {
fmt.Println("Error: invalid protocol")
}
_ = srv
}
Output: Error: invalid protocol
Example (Tcp) ¶
ExampleNew_tcp demonstrates creating a TCP server.
package main
import (
"fmt"
libptc "github.com/nabbar/golib/network/protocol"
libsck "github.com/nabbar/golib/socket"
sckcfg "github.com/nabbar/golib/socket/config"
scksrv "github.com/nabbar/golib/socket/server"
)
func main() {
handler := func(c libsck.Context) {
defer func() { _ = c.Close() }()
}
cfg := sckcfg.Server{
Network: libptc.NetworkTCP,
Address: ":9001",
}
srv, err := scksrv.New(nil, handler, cfg)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
fmt.Println("TCP server created")
_ = srv
}
Output: TCP server created
Example (Tcp4) ¶
ExampleNew_tcp4 demonstrates creating a TCP4 server (IPv4 only).
package main
import (
"fmt"
libptc "github.com/nabbar/golib/network/protocol"
libsck "github.com/nabbar/golib/socket"
sckcfg "github.com/nabbar/golib/socket/config"
scksrv "github.com/nabbar/golib/socket/server"
)
func main() {
handler := func(c libsck.Context) {
defer func() { _ = c.Close() }()
}
cfg := sckcfg.Server{
Network: libptc.NetworkTCP4,
Address: ":9002",
}
srv, err := scksrv.New(nil, handler, cfg)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
fmt.Println("TCP4 server created")
_ = srv
}
Output: TCP4 server created
Example (Tcp6) ¶
ExampleNew_tcp6 demonstrates creating a TCP6 server (IPv6 only).
package main
import (
"fmt"
libptc "github.com/nabbar/golib/network/protocol"
libsck "github.com/nabbar/golib/socket"
sckcfg "github.com/nabbar/golib/socket/config"
scksrv "github.com/nabbar/golib/socket/server"
)
func main() {
handler := func(c libsck.Context) {
defer func() { _ = c.Close() }()
}
cfg := sckcfg.Server{
Network: libptc.NetworkTCP6,
Address: ":9003",
}
srv, err := scksrv.New(nil, handler, cfg)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
fmt.Println("TCP6 server created")
_ = srv
}
Output: TCP6 server created
Example (Udp) ¶
ExampleNew_udp demonstrates creating a UDP server.
package main
import (
"fmt"
libptc "github.com/nabbar/golib/network/protocol"
libsck "github.com/nabbar/golib/socket"
sckcfg "github.com/nabbar/golib/socket/config"
scksrv "github.com/nabbar/golib/socket/server"
)
func main() {
handler := func(c libsck.Context) {
defer func() { _ = c.Close() }()
}
cfg := sckcfg.Server{
Network: libptc.NetworkUDP,
Address: ":9004",
}
srv, err := scksrv.New(nil, handler, cfg)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
fmt.Println("UDP server created")
_ = srv
}
Output: UDP server created
Example (Udp4) ¶
ExampleNew_udp4 demonstrates creating a UDP4 server (IPv4 only).
package main
import (
"fmt"
libptc "github.com/nabbar/golib/network/protocol"
libsck "github.com/nabbar/golib/socket"
sckcfg "github.com/nabbar/golib/socket/config"
scksrv "github.com/nabbar/golib/socket/server"
)
func main() {
handler := func(c libsck.Context) {
defer func() { _ = c.Close() }()
}
cfg := sckcfg.Server{
Network: libptc.NetworkUDP4,
Address: ":9005",
}
srv, err := scksrv.New(nil, handler, cfg)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
fmt.Println("UDP4 server created")
_ = srv
}
Output: UDP4 server created
Example (Udp6) ¶
ExampleNew_udp6 demonstrates creating a UDP6 server (IPv6 only).
package main
import (
"fmt"
libptc "github.com/nabbar/golib/network/protocol"
libsck "github.com/nabbar/golib/socket"
sckcfg "github.com/nabbar/golib/socket/config"
scksrv "github.com/nabbar/golib/socket/server"
)
func main() {
handler := func(c libsck.Context) {
defer func() { _ = c.Close() }()
}
cfg := sckcfg.Server{
Network: libptc.NetworkUDP6,
Address: ":9006",
}
srv, err := scksrv.New(nil, handler, cfg)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
fmt.Println("UDP6 server created")
_ = srv
}
Output: UDP6 server created
Example (WithIdleTimeout) ¶
ExampleNew_withIdleTimeout demonstrates configuring idle timeout.
package main
import (
"fmt"
libdur "github.com/nabbar/golib/duration"
libptc "github.com/nabbar/golib/network/protocol"
libsck "github.com/nabbar/golib/socket"
sckcfg "github.com/nabbar/golib/socket/config"
scksrv "github.com/nabbar/golib/socket/server"
)
func main() {
handler := func(c libsck.Context) {
defer func() { _ = c.Close() }()
}
cfg := sckcfg.Server{
Network: libptc.NetworkTCP,
Address: ":9008",
ConIdleTimeout: libdur.Minutes(5),
}
srv, err := scksrv.New(nil, handler, cfg)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
fmt.Println("Server with idle timeout created")
_ = srv
}
Output: Server with idle timeout created
Types ¶
This section is empty.
Directories
¶
| Path | Synopsis |
|---|---|
|
Package tcp provides a high-performance, production-ready TCP server implementation with support for TLS, connection pooling, and centralized idle management.
|
Package tcp provides a high-performance, production-ready TCP server implementation with support for TLS, connection pooling, and centralized idle management. |
|
Package udp provides a high-performance, stateless UDP server implementation designed for robustness and low-latency datagram processing.
|
Package udp provides a high-performance, stateless UDP server implementation designed for robustness and low-latency datagram processing. |
|
Package unix provides a high-performance, production-ready Unix domain socket server implementation.
|
Package unix provides a high-performance, production-ready Unix domain socket server implementation. |
|
Package unixgram provides an industrial-strength, high-performance Unix Domain Datagram Socket server.
|
Package unixgram provides an industrial-strength, high-performance Unix Domain Datagram Socket server. |