df9a56af536acd52033411d2eeb0b6dbc1426fbf
OmniSocketC
Linux-only C11 implementation of the UDP/KCP transport stack from OmniSocketGo.
This subtree is intentionally standalone. The Go code stays in place as the behavior reference, while the C implementation builds its own binaries under c/bin/.
Build
make -j$(nproc)
Build outputs:
./bin/udpserver./bin/udppeer./bin/udpping./bin/udprelay./bin/kcpserver./bin/kcppeer./bin/kcpping
Python extension build:
make python-ext
make python-install
Run On Different Machines
Server D runs the KCP hub on 0.0.0.0:10909:
./bin/kcpserver -listen 0.0.0.0:10909 \
-telemetry-peer peer-a-telemetry \
-telemetry-interval 1000ms \
-kcp-session-stats-log logs/d-kcp-stats.jsonl \
-kcp-session-stats-interval 1000ms
For multi-hour runs, keep -latency-log and -kcp-ts-debug-log off unless you are collecting a short repro trace.
Relay C runs a raw UDP forwarder to D:
./bin/kcpserver -mode=relay -listen 0.0.0.0:10909 -relay-remote 172.21.32.15:10909
Peer A dials D through relay C:
./bin/kcppeer -id peer-a -server 172.21.32.15:10909 -relay-via 106.55.173.235:10909 \
-inbox-dir inbox/a \
-latency-log logs/a-latency.jsonl \
-kcp-ts-debug-log logs/a-kcp-ts.jsonl \
-kcp-session-stats-log logs/a-kcp-stats.jsonl
Peer B dials D directly:
./bin/kcppeer -id peer-b -server 81.70.156.140:10909 \
-inbox-dir inbox/b \
-latency-log logs/b-latency.jsonl \
-kcp-ts-debug-log logs/b-kcp-ts.jsonl \
-kcp-session-stats-log logs/b-kcp-stats.jsonl
Optional ping / echo tools:
./bin/kcpping -id peer-a -server 106.55.173.235:10909 -echo
./bin/kcpping -id peer-b -server 81.70.156.140:10909 -to peer-a -count 20 -interval 100ms
./bin/udpserver -listen 0.0.0.0:9001
./bin/udppeer -id peer-a -server 127.0.0.1:9001
./bin/udpping -id pinger -server 127.0.0.1:9001 -to peer-a -count 20
Python control/video demos use two KCP sessions:
peer-a-ctrl <-> peer-b-ctrlfor small binary control packetspeer-b-video -> peer-a-videofor larger binary video frames
Example demo entry points:
udp_keyboard_sender.pyudp_xbox_sender.pyudp_fsm_controller.pyomnisocket_video_sender.pyomnisocket_video_receiver.pyscripts/kcp_control_benchmark.py
Python recv_into() note:
- The writable buffer must be large enough for the full incoming payload.
- If the buffer is too small,
recv_into()reports the required size but the current frame has already been consumed and is lost. - For the video demo, keep
video_receiver.buffer_bytes >= video_sender.frame_bytes.
Interactive Commands
udppeer and kcppeer support the same interactive shell:
help
text peer-b hello
text peer-a hi
file peer-a /tmp/test125.bin
quit
Notes
- The C project targets Linux only.
- It preserves the Go wire format for UDP datagrams and KCP stream frames.
- It now supports
binarypayload messages in addition totext,file,register, anderror. - Python
Session.recv_into()is a zero-copy receive helper for already-sized buffers; it does not retain oversized frames for a retry. - It keeps runtime JSONL logging, UDP TX timestamp debug, KCP packet debug, and KCP session stats.
- Offline
latencysummaryand HTML chart generation are intentionally not migrated. - No automated C tests are included in this subtree; validation is expected to happen on Linux via
makeand manual smoke tests.
Description
Languages
Go
56.7%
C
37.6%
Shell
5.5%
Makefile
0.2%