Goals: permit all client to server and metaserver communication via UDP port 2592, while still permitting the conventional communication. Non-goals: data efficiency, reduced lag, backward compatibility, client verification, IP address revelation. Design: multiplexor process bound to UDP port 2592, with which clients will communicate. Multiplexor will exchange packets with ntserv and other server side processes. +--------+ +-------------+ M +--------------+ | client |------------| multiplexor |------------| metaserver | +--------+ udp 2592 +-------------+ udp 3521 +--------------+ | | | | | | S +--------------+ | | ----------------| players list | | | udp 3521 +--------------+ | | | | P +--------------+ | |-------------------| ntserv player| | tcp 2592 +--------------+ | | O +--------------+ ------------------------| ntserv observ| tcp 2593 +--------------+ struct xpacket { char type; /* {M,S,P,O} */ char data[n]; } Examples: C->X: M? X->M: ? M->X: r,6\ncontinuum.us.netrek.org,2592,3,303,0,0,B\n ... X->C: Mr,6\ncontinuum.us.netrek.org,2592,3,303,0,0,B\n ... C->X: S? X->S: ? S->X: s,B,Unnamed Vanilla Server,1,2592,0,0\n ... X->C: Ss,B,Unnamed Vanilla Server,1,2592,0,0\n ... C->X: P{CP_SOCKET}{CP_FEATURE} ... X->P: {CP_SOCKET}{CP_FEATURE} ... P->X: {SP_MOTD}{SP_FEATURE} ... X->C: P{SP_MOTD}{SP_FEATURE} ... FIXME: how to handle packet loss on the previously TCP connection? - STCP? Question: multiple clients behind a gateway? Answer: gateway will assign different source ports, so the clients can be identified by their source port (getpeername). Question: how will client IP addresses appear? Answer: they will not. (Or this could be passed in a special packet that is trusted if the source IP is local).