15#include <cx/net/net_shared.h>
23typedef struct NetFlow_WeakRef NetFlow_WeakRef;
25typedef struct NetSocket_WeakRef NetSocket_WeakRef;
28#define _sti_NetSocket _sti_object
29#define SType_NetSocket NetSocket*
30#define STStorageType_NetSocket NetSocket*
31#define STypeArg_NetSocket(type, val) stgeneric(object, (ObjInst*)objInstCheckClass(NetSocket, val))
32#define STypeArgPtr_NetSocket(type, val) (stgeneric*)objInstCheckClassPtr(NetSocket, val)
33#define STypeCheckedArg_NetSocket(type, val) stType(type), stArg(type, val)
34#define STypeCheckedPtrArg_NetSocket(type, val) stType(type), stArgPtr(type, val)
48typedef struct NetSocket_ClassIf {
53 size_t (*recv)(_In_
void* self, _Out_ uint8* buf,
size_t bufsz, _Out_opt_
NetAddr* src, flags_t flags);
54 bool (*recvMsgs)(_In_
void* self,
socketRecvCB cb, _In_opt_
void* ctx);
55 bool (*send)(_In_
void* self, _In_
const uint8* data,
size_t len, _In_opt_
const NetAddr* dest, flags_t flags);
56 bool (*connect)(_In_
void* self, _In_ strref host, uint16 port);
57 bool (*bind)(_In_
void* self,
const NetAddr* addr);
59 bool (*listen)(_In_
void* self,
int backlog);
60 bool (*close)(_In_
void* self);
62extern NetSocket_ClassIf NetSocket_ClassIf_tmpl;
99 atomic(uint32) awaitingAccept;
180 NetDatagramRouteFn route;
219#define NetSocket(inst) objInstCheckClass(NetSocket, inst)
220#define NetSocketNone ((NetSocket*)NULL)
222typedef struct NetSocket_WeakRef {
225 void* _is_NetSocket_WeakRef;
226 void* _is_ObjInst_WeakRef;
228 atomic(uintptr) _ref;
231#define NetSocket_WeakRef(inst) objWeakRefCheckClass(NetSocket, inst)
233bool NetSocket_sendEx(_In_
NetSocket* self, _In_
const uint8* data,
size_t len, _In_
const NetAddr* dest, _In_opt_
const NetPktInfo* info, flags_t flags);
252#define netsocketSendEx(self, data, len, dest, info, flags) NetSocket_sendEx(NetSocket(self), data, len, dest, info, flags)
254bool NetSocket_setRecvInfo(_In_
NetSocket* self,
bool enable);
266#define netsocketSetRecvInfo(self, enable) NetSocket_setRecvInfo(NetSocket(self), enable)
268bool NetSocket_setDontFragment(_In_
NetSocket* self,
bool enable);
279#define netsocketSetDontFragment(self, enable) NetSocket_setDontFragment(NetSocket(self), enable)
281void NetSocket_setHandlers(_In_
NetSocket* self, _In_opt_
const NetHandlers* handlers, _In_opt_
void* ctx);
291#define netsocketSetHandlers(self, handlers, ctx) NetSocket_setHandlers(NetSocket(self), handlers, ctx)
302#define netsocketSetHandlersObj(self, handlers, ctx) NetSocket_setHandlersObj(NetSocket(self), handlers, ObjInst(ctx))
330#define netsocketAddFilter(self, filter) NetSocket_addFilter(NetSocket(self), NetFilter(filter))
332void NetSocket_removeFilters(_In_
NetSocket* self);
340#define netsocketRemoveFilters(self) NetSocket_removeFilters(NetSocket(self))
342bool NetSocket__wantWrite(_In_
NetSocket* self);
358#define netsocket_wantWrite(self) NetSocket__wantWrite(NetSocket(self))
367#define netsocket_flushSend(self, q) NetSocket__flushSend(NetSocket(self), NetQueue(q))
381#define netsocket_sendError(self, q, err, peer) NetSocket__sendError(NetSocket(self), NetQueue(q), err, peer)
393#define netsocket_connectResult(self, err) NetSocket__connectResult(NetSocket(self), err)
403#define netsocket_readinessConnect(self, q, addr) NetSocket__readinessConnect(NetSocket(self), NetQueue(q), addr)
405void NetSocket__connectCancel(_In_
NetSocket* self);
414#define netsocket_connectCancel(self) NetSocket__connectCancel(NetSocket(self))
427#define netsocket_accepted(self, newSock, peer) NetSocket__accepted(NetSocket(self), NetSocket(newSock), peer)
429void NetSocket__listenArm(_In_
NetSocket* self);
437#define netsocket_listenArm(self) NetSocket__listenArm(NetSocket(self))
439void NetSocket__setRoute(_In_
NetSocket* self, _In_ NetDatagramRouteFn fn, _In_
ObjInst* ctx);
445#define netsocket_setRoute(self, fn, ctx) NetSocket__setRoute(NetSocket(self), fn, ObjInst(ctx))
452#define netsocket_clearRoute(self, owner) NetSocket__clearRoute(NetSocket(self), ObjInst(owner))
460#define netsocket_dropFlow(self, flow) NetSocket__dropFlow(NetSocket(self), NetFlow(flow))
466#define netsocket_closeFlows(self, reason) NetSocket__closeFlows(NetSocket(self), reason)
488#define netsocketRecv(self, buf, bufsz, src, flags) (self)->_->recv(NetSocket(self), buf, bufsz, src, flags)
510#define netsocketRecvMsgs(self, cb, ctx) (self)->_->recvMsgs(NetSocket(self), cb, ctx)
543#define netsocketSend(self, data, len, dest, flags) (self)->_->send(NetSocket(self), data, len, dest, flags)
562#define netsocketConnect(self, host, port) (self)->_->connect(NetSocket(self), host, port)
564#define netsocketBind(self, addr) (self)->_->bind(NetSocket(self), addr)
568#define netsocketListen(self, backlog) (self)->_->listen(NetSocket(self), backlog)
581#define netsocketClose(self) (self)->_->close(NetSocket(self))
Buffer chain implementation for efficient streaming I/O.
Ring buffer implementation for efficient streaming I/O.
#define saDeclarePtr(name)
bool(* socketRecvCB)(NetSocket *sock, NetMessage *msg, void *ctx)
intptr NetSockHandle
Platform-neutral OS socket handle: a Windows SOCKET or a Unix file descriptor.
uint64 NetTimerId
Handle to an armed timer, unique for the lifetime of its queue.
NetErrorCode
Network error codes.
NetSocketType
Socket types.
CX Struct System - Introspectable, serializable POD structures in C.
Threading system aggregated header.
CX Object System - Object-oriented programming in C.
Socket-level factory for per-flow filters.
A single ordering domain: one connection, or one datagram peer.
Set of event handlers, registered per flow, per socket, or queue-wide.
A received packet, as delivered to a handler.
Per-datagram information the IP layer carries alongside the payload.
NetQueue manages one or more sockets and a thread pool of workers.
Mutex connectLock
Serializes the connect-advance transition; see connectTimer.
NetSockHandle handle
Platform-neutral OS handle, set by the platform factory.
atomic(bool) canSend
Send buffer empty; can send immediately.
bool sendPending
A completion backend has an overlapped send in flight for this socket.
NetHandlers * handlers
Per-socket handler overrides, optional.
size_t sendLow
NET_SendReady fires when the queue drains below this.
sa_NetAddr connQueue
List of fallback addresses to try to connect to if pending connect fails.
NetTimerId connectTimer
Timer arming the in-flight connect attempt's deadline, or 0 when none is armed.
hashtable flows
Flows keyed by peer address (datagram) or stream id (QUIC). Not used by stream sockets.
bool recvInfo
The OS is reporting per-datagram IP information; see setRecvInfo()
NetAddr local
Local end, filled in by bind()
NetSocketBufs bufs
Type-specific send/receive buffers; which arm is live depends on type
atomic(uint32) state
See NetSocketState enum.
Weak(ObjInst) *handlerWeak
Context passed to per-socket handlers, set by setHandlersObj() – NULL when handlerCtx is in use inste...
Mutex recvLock
Exclusive access to the socket's receive buffer.
bool sendBlocked
A send returned false at the high watermark and is waiting for NET_SendReady.
size_t sendQueued
Bytes waiting in the datagram send queue, guarded by sendLock.
atomic(uint32) connectGen
Attempt generation, bumped once per connect attempt.
RWLock handlerLock
Guards handlers/handlerCtx/handlerWeak against a concurrent setHandlers()/setHandlersObj()
size_t sendHigh
Send fails over this many bytes queued.
Weak(NetQueue) *queue
NetQueue this socket is registered to (may be NULL)
NetAddr remote
Remote address (for connected sockets only)
sa_NetFilter filters
Filters attached to this socket, ordered application -> wire, or empty for none.
NetFlow * flow
Stream: the single flow for this connection. QUIC: the connection control flow. Not used by datagram ...
NetConnectPref connectPref
Per-socket address-family preference override; NCP_Default inherits the queue's setting when the sock...