Home | History | Annotate | Line # | Download | only in hunt
      1  1.1  dholland 
      2  1.1  dholland THE HUNT PROTOCOL
      3  1.1  dholland =================
      4  1.1  dholland 
      5  1.1  dholland These are some notes on the traditional INET protocol between hunt(6) and 
      6  1.1  dholland huntd(6) as divined from the source code.
      7  1.1  dholland 
      8  1.1  dholland (In the original hunt, AF_UNIX sockets were used, but they are not 
      9  1.1  dholland considered here.)
     10  1.1  dholland 
     11  1.1  dholland The game of hunt is played with one server and several clients. The clients
     12  1.1  dholland act as dumb 'graphics' clients in that they mostly only ever relay the
     13  1.1  dholland user's keystrokes to the server, and the server usually only ever sends
     14  1.1  dholland screen-drawing commands to the client. ie, the server does all the work.
     15  1.1  dholland 
     16  1.1  dholland The game server (huntd) listens on three different network ports which 
     17  1.1  dholland I'll refer to as W, S and P, described as follows:
     18  1.1  dholland 
     19  1.1  dholland 	W	well known UDP port (26740, or 'udp/hunt' in netdb)
     20  1.1  dholland 	S	statistics TCP port
     21  1.1  dholland 	P	game play TCP port
     22  1.1  dholland 
     23  1.1  dholland The protocol on each port is different and are described separately in
     24  1.1  dholland the following sections.
     25  1.1  dholland 
     26  1.1  dholland Lines starting with "C:" and "S:" will indicate messages sent from the 
     27  1.1  dholland client (hunt) or server (huntd) respectively.
     28  1.1  dholland 
     29  1.1  dholland W - well known port
     30  1.1  dholland -------------------
     31  1.1  dholland 	This server port is used only to query simple information about the 
     32  1.1  dholland 	game such as the port numbers of the other two ports (S and P),
     33  1.1  dholland 	and to find out how many players are still in the game.
     34  1.1  dholland 
     35  1.1  dholland 	All datagrams sent to (and possibly from) this UDP port consist of 
     36  1.1  dholland 	a single unsigned 16-bit integer, encoded in network byte order.
     37  1.1  dholland 
     38  1.1  dholland 	Server response datagrams should be sent to the source address
     39  1.1  dholland 	of the client request datagrams.
     40  1.1  dholland 
     41  1.1  dholland 	It is not useful to run multiple hunt servers on the one host
     42  1.1  dholland 	interface, each of which perhaps listen to the well known port and
     43  1.1  dholland 	respond appropriately. This is because clients will not be able to
     44  1.1  dholland 	disambiguate which game is which.
     45  1.1  dholland 
     46  1.1  dholland 	It is reasonable (and expected) to have servers listen to a 
     47  1.1  dholland 	broadcast or multicast network address and respond, since the
     48  1.1  dholland 	clients can extract a particular server's network address from
     49  1.1  dholland 	the reply packet's source field.
     50  1.1  dholland 
     51  1.1  dholland     Player port request
     52  1.1  dholland 
     53  1.1  dholland 	A client requests the game play port P with the C_PLAYER message.
     54  1.1  dholland 	This is useful for clients broadcasting for any available games. eg:
     55  1.1  dholland 		
     56  1.1  dholland 		C: {uint16: 0 (C_PLAYER)}
     57  1.1  dholland 		S: {uint16: P (TCP port number for the game play port)}
     58  1.1  dholland 
     59  1.1  dholland 	The TCP address of the game play port should be formed from the
     60  1.1  dholland 	transmitted port number and the source address as received by
     61  1.1  dholland 	the client.
     62  1.1  dholland 
     63  1.1  dholland     Monitor port request
     64  1.1  dholland 
     65  1.1  dholland 	A client can request the game play port P with the C_MONITOR message.
     66  1.1  dholland 	However, the server will NOT reply if there are no players in
     67  1.1  dholland 	the game. This is useful for broadcasting for 'active' games. eg:
     68  1.1  dholland 
     69  1.1  dholland 		C: {uint16: 1 (C_MONITOR)}
     70  1.1  dholland 		S: {uint16: P (TCP port number for the game play port)}
     71  1.1  dholland 
     72  1.1  dholland     Message port request
     73  1.1  dholland 
     74  1.1  dholland 	If the server receives the C_MESSAGE message it will
     75  1.1  dholland 	respond with the number of players currently in its game, unless
     76  1.1  dholland 	there are 0 players, in which case it remains silent. This
     77  1.1  dholland 	is used when a player wishes to send a text message to all other
     78  1.1  dholland 	players, but doesn't want to connect if the game is over. eg:
     79  1.1  dholland 
     80  1.1  dholland 		C: {uint16: 2 (C_MESSAGE)}
     81  1.1  dholland 		S: {uint16: n (positive number of players)}
     82  1.1  dholland 
     83  1.1  dholland     Statistics port request
     84  1.1  dholland 
     85  1.1  dholland 	The server's statistics port is queried with the C_SCORES message.
     86  1.1  dholland 	eg:
     87  1.1  dholland 
     88  1.1  dholland 		C: {uint16: 3 (C_SCORES)}
     89  1.1  dholland 		S: {uint16: S (TCP port number for the statistics port)}
     90  1.1  dholland 
     91  1.1  dholland 
     92  1.1  dholland S - statistics port
     93  1.1  dholland -------------------
     94  1.1  dholland 	The statistics port accepts a TCP connection, and keeps
     95  1.1  dholland 	it alive for long enough to send a text stream to the client.
     96  1.1  dholland 	This text consists of the game statistics. Lines in the
     97  1.1  dholland 	text message are terminated with the \n (LF) character. 
     98  1.1  dholland 
     99  1.1  dholland 		C: <connect>
    100  1.1  dholland 		S: <accept>
    101  1.1  dholland 		S: {char[]: lines of text, each terminated with <LF>}
    102  1.1  dholland 		S: <close>
    103  1.1  dholland 
    104  1.1  dholland 	The client is not to send any data to the server with this
    105  1.1  dholland 	connection.
    106  1.1  dholland 
    107  1.1  dholland P - game play port
    108  1.1  dholland ------------------
    109  1.1  dholland 	This port provides the TCP channel for the main game play between
    110  1.1  dholland 	the client and the server.
    111  1.1  dholland 
    112  1.1  dholland 	All integers are unsigned, 32-bit and in network byte order.
    113  1.1  dholland 	All fixed sized octet strings are ASCII encoded, NUL terminated.
    114  1.1  dholland 
    115  1.1  dholland     Initial connection
    116  1.1  dholland 
    117  1.1  dholland 	The initial setup protocol between the client and server is as follows.
    118  1.1  dholland 	The client sends some of its own details, and then the server replies
    119  1.1  dholland 	with the version number of the server (currently (uint32)-1).
    120  1.1  dholland 
    121  1.1  dholland 		C: <connect>
    122  1.1  dholland 		S: <accept>
    123  1.1  dholland 		C: {uint32:   uid}
    124  1.1  dholland 		C: {char[20]: name}
    125  1.1  dholland 		C: {char[1]:  team}
    126  1.1  dholland 		C: {uint32:   'enter status'}
    127  1.1  dholland 		C: {char[20]: ttyname}
    128  1.1  dholland 		C: {uint32:   'connect mode'}
    129  1.1  dholland 		S: {uint32:   server version (-1)}
    130  1.1  dholland 
    131  1.1  dholland 	If the 'connect mode' is C_MESSAGE (2) then the server will wait
    132  1.1  dholland 	for a single packet (no longer than 1024 bytes) containing
    133  1.1  dholland 	a text message to be displayed to all players. (The message is not
    134  1.1  dholland 	nul-terminated.)
    135  1.1  dholland 
    136  1.1  dholland 		C: {char[]:	client's witty message of abuse}
    137  1.1  dholland 		S: <close>
    138  1.1  dholland 
    139  1.1  dholland 	The only other valid 'connect mode's are C_MONITOR and C_PLAYER.
    140  1.1  dholland 	The server will attempt to allocate a slot for the client. 
    141  1.1  dholland 	If allocation fails, the server will reply immediately with 
    142  1.1  dholland 	"Too many monitors\n" or "Too many players\n', e.g.:
    143  1.1  dholland 
    144  1.1  dholland 		S: Too many players<LF>
    145  1.1  dholland 		S: <close>
    146  1.1  dholland 
    147  1.1  dholland 	The 'enter status' integer is one of the following:
    148  1.1  dholland 
    149  1.1  dholland 		1 (Q_CLOAK)	the player wishes to enter cloaked
    150  1.1  dholland 		2 (Q_FLY)	the player wishes to enter flying
    151  1.1  dholland 		3 (Q_SCAN)	the player wishes to enter scanning
    152  1.1  dholland 
    153  1.1  dholland 	Any other value indicates that the player wishes to enter in
    154  1.1  dholland 	'normal' mode.
    155  1.1  dholland 
    156  1.1  dholland 	A team value of 32 (space character) means no team, otherwise
    157  1.1  dholland 	it is the ASCII value of a team's symbol.
    158  1.1  dholland 
    159  1.1  dholland 	On successful allocation, the server will immediately enter the 
    160  1.1  dholland 	following phase of the protocol.
    161  1.1  dholland 
    162  1.1  dholland     Game play protocol
    163  1.1  dholland 
    164  1.1  dholland 	The client provides a thin 'graphical' client to the server, and
    165  1.1  dholland 	only ever relays keystrokes typed by the user:
    166  1.1  dholland 
    167  1.1  dholland 		C: {char[]:	user keystrokes}
    168  1.1  dholland 
    169  1.1  dholland 	Each character must be sent by the client as soon as it is typed.
    170  1.1  dholland 
    171  1.1  dholland 
    172  1.1  dholland 	The server only ever sends screen drawing commands to the client.
    173  1.1  dholland 	The server assumes the initial state of the client is a clear
    174  1.1  dholland 	80x24 screen with the cursor at the top left (position y=0, x=0)
    175  1.1  dholland 
    176  1.1  dholland 	    Literal character	225 (ADDCH)
    177  1.1  dholland 
    178  1.1  dholland 		S: {uint8: 225} {uint8: c}
    179  1.1  dholland 
    180  1.1  dholland 		The client must draw the character with ASCII value c
    181  1.1  dholland 		at the cursor position, then advance the cursor to the right.
    182  1.1  dholland 		If the cursor goes past the rightmost column of the screen,
    183  1.1  dholland 		it wraps, moving to the first column of the next line down.
    184  1.1  dholland 		The cursor should never be advanced past the bottom row.
    185  1.1  dholland 
    186  1.1  dholland 		(ADDCH is provided as an escape prefix.)
    187  1.1  dholland 
    188  1.1  dholland 	    Cursor motion	237 (MOVE)
    189  1.1  dholland 
    190  1.1  dholland 		S: {uint8: 237} {uint8: y} {uint8: x}
    191  1.1  dholland 
    192  1.1  dholland 		The client must move its cursor to the absolute screen
    193  1.1  dholland 		location y, x, where y=0 is the top of the screen and
    194  1.1  dholland 		x=0 is the left of the screen.
    195  1.1  dholland 
    196  1.1  dholland 	    Refresh screen	242 (REFRESH)
    197  1.1  dholland 
    198  1.1  dholland 		S: {uint8: 242}
    199  1.1  dholland 
    200  1.1  dholland 		This indicates to the client that a burst of screen
    201  1.1  dholland 		drawing has ended. Typically the client will flush its
    202  1.1  dholland 		own drawing output so that the user can see the results.
    203  1.1  dholland 
    204  1.1  dholland 		Refreshing is the only time that the client must
    205  1.1  dholland 		ensure that the user can see the current screen. (This
    206  1.1  dholland 		is intended for use with curses' refresh() function.)
    207  1.1  dholland 
    208  1.1  dholland 	    Clear to end of line 227 (CLRTOEOL)
    209  1.1  dholland 
    210  1.1  dholland 		S: {uint8: 227}
    211  1.1  dholland 
    212  1.1  dholland 		The client must replace all columns underneath and
    213  1.1  dholland 		to the right of the cursor (on the one row) with 
    214  1.1  dholland 		space characters. The cursor must not move.
    215  1.1  dholland 
    216  1.1  dholland 	    End game		229 (ENDWIN)
    217  1.1  dholland 
    218  1.1  dholland 		S: {uint8: 229} {uint8: 32}
    219  1.1  dholland 		S,C: <close>
    220  1.1  dholland 
    221  1.1  dholland 		S: {uint8: 229} {uint8: 236}
    222  1.1  dholland 		S,C: <close>
    223  1.1  dholland 
    224  1.1  dholland 		The client and server must immediately close the connection.
    225  1.1  dholland 		The client should also refresh the screen.
    226  1.1  dholland 		If the second octet is 236 (LAST_PLAYER), then 
    227  1.1  dholland 		the client should give the user an opportunity to quickly 
    228  1.1  dholland 		re-enter the game. Otherwise the client should quit.
    229  1.1  dholland 
    230  1.1  dholland 	    Clear screen	195 (CLEAR)
    231  1.1  dholland 
    232  1.1  dholland 		S: {uint8: 195}
    233  1.1  dholland 
    234  1.1  dholland 		The client must erase all characters from the screen
    235  1.1  dholland 		and move the cursor to the top left (x=0, y=0).
    236  1.1  dholland 
    237  1.1  dholland 	    Redraw screen	210 (REDRAW)
    238  1.1  dholland 
    239  1.1  dholland 		S: {uint8: 210}
    240  1.1  dholland 
    241  1.1  dholland 		The client should attempt to re-draw its screen.
    242  1.1  dholland 
    243  1.1  dholland 	    Audible bell	226 (BELL)
    244  1.1  dholland 
    245  1.1  dholland 		S: {uint8: 226}
    246  1.1  dholland 
    247  1.1  dholland 		The client should generate a short audible tone for
    248  1.1  dholland 		the user.
    249  1.1  dholland 
    250  1.1  dholland 	    Server ready	231 (READY)
    251  1.1  dholland 
    252  1.1  dholland 		S: {uint8: 231} {uint8: n}
    253  1.1  dholland 
    254  1.1  dholland 		The client must refresh its screen.
    255  1.1  dholland 
    256  1.1  dholland 		The server indicates to the client that it has
    257  1.1  dholland 		processed n of its characters in order, and is ready
    258  1.1  dholland 		for more commands. This permits the client to 
    259  1.1  dholland 		synchronise user actions with server responses if need be.
    260  1.1  dholland 
    261  1.1  dholland 	    Characters other than the above.
    262  1.1  dholland 
    263  1.1  dholland 		S: {uint8: c}
    264  1.1  dholland 
    265  1.1  dholland 		The client must draw the character with ASCII value c
    266  1.1  dholland 		in the same way as if it were preceded with ADDCH
    267  1.1  dholland 		(see above).
    268  1.1  dholland 
    269  1.1  dholland 
    270  1.1  dholland David Leonard, 1999.
    271  1.1  dholland 
    272  1.1  dholland $OpenBSD: README.protocol,v 1.1 1999/12/12 14:51:03 d Exp $
    273