mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-10 15:22:04 +00:00
Finish the docs for netchan.
Also clean out some unnecessary declarations.
This commit is contained in:
parent
c7c646a53f
commit
64881d2eca
2 changed files with 88 additions and 38 deletions
|
@ -41,8 +41,8 @@
|
|||
\ingroup network
|
||||
*/
|
||||
//{
|
||||
#define MAX_MSGLEN 1450 // max length of a reliable message
|
||||
#define MAX_DATAGRAM 1450 // max length of unreliable message
|
||||
#define MAX_MSGLEN 1450 ///< max length of a reliable message
|
||||
#define MAX_DATAGRAM 1450 ///< max length of unreliable message
|
||||
|
||||
#define PORT_ANY -1
|
||||
|
||||
|
@ -54,19 +54,17 @@ typedef struct
|
|||
byte ip[4];
|
||||
#endif
|
||||
unsigned short port;
|
||||
unsigned short family; // used to be pad, before IPV6
|
||||
unsigned short family;
|
||||
} netadr_t;
|
||||
|
||||
extern int net_socket;
|
||||
extern netadr_t net_local_adr;
|
||||
extern netadr_t net_loopback_adr;
|
||||
extern netadr_t net_from; // address of who sent the packet
|
||||
extern struct msg_s *net_message;
|
||||
|
||||
extern struct cvar_s *hostname;
|
||||
extern struct cvar_s *qport;
|
||||
|
||||
extern int net_socket;
|
||||
|
||||
int Net_Log_Init (const char **sound_precache);
|
||||
void Net_LogPrintf (const char *fmt, ...) __attribute__ ((format (printf, 1, 2)));
|
||||
void Log_Incoming_Packet (const byte *p, int len, int has_sequence);
|
||||
|
@ -78,7 +76,6 @@ void Analyze_Server_Packet (const byte * data, int len, int has_sequence);
|
|||
extern struct cvar_s *net_packetlog;
|
||||
|
||||
extern qboolean is_server;
|
||||
qboolean ServerPaused (void);
|
||||
//@}
|
||||
|
||||
/** \defgroup qw-udp QuakeWorld udp support.
|
||||
|
@ -194,7 +191,8 @@ qboolean NET_StringToAdr (const char *s, netadr_t *a);
|
|||
after the retransmit has been acknowledged and the reliable still failed
|
||||
to get there.
|
||||
|
||||
If the sequence number is -1, the packet should be handled without a
|
||||
If the sequence number and reliable payload bits are all 1 (32bit -1),
|
||||
the packet is an out-of-band packet and should be handled without a
|
||||
netcon.
|
||||
|
||||
The reliable message can be added to at any time by doing
|
||||
|
@ -292,30 +290,96 @@ typedef struct netchan_s {
|
|||
|
||||
/** Disable packet choking.
|
||||
*/
|
||||
extern int net_nochoke; // don't choke packets
|
||||
extern int net_nochoke;
|
||||
|
||||
/** Disable packet sending.
|
||||
|
||||
Used by clients in demo playback mode.
|
||||
*/
|
||||
extern int net_blocksend; // don't send packets (used by client for demos)
|
||||
extern int net_blocksend;
|
||||
|
||||
/** Pointer to variable holding the current time in seconds.
|
||||
*/
|
||||
extern double *net_realtime;
|
||||
|
||||
/** Initialize the netchan system.
|
||||
|
||||
Currently only sets the qport cvar default to a random value.
|
||||
*/
|
||||
void Netchan_Init (void);
|
||||
|
||||
/** Initialize the netchan cvars.
|
||||
*/
|
||||
void Netchan_Init_Cvars (void);
|
||||
|
||||
/** Try to send an unreliable packet to a connection.
|
||||
|
||||
Handles transmission or retransmission of the reliable packet.
|
||||
|
||||
0 length will still generate a packet and deal with the reliable messages.
|
||||
|
||||
\param chan The netchan representing the connection.
|
||||
\param length The size of the unreliable packet.
|
||||
\param data The data of the unreliable packet.
|
||||
*/
|
||||
void Netchan_Transmit (netchan_t *chan, int length, byte *data);
|
||||
|
||||
/** Send an out-of-band packet.
|
||||
|
||||
\param adr The address to which the data will be sent.
|
||||
\param length The length of the data to be sent.
|
||||
\param data The data to be sent.
|
||||
*/
|
||||
void Netchan_OutOfBand (netadr_t adr, int length, byte *data);
|
||||
/** Send a formatted string as an out-of-band packet.
|
||||
|
||||
\param adr The address to which the data will be sent.
|
||||
\param format The printf style format string.
|
||||
*/
|
||||
void Netchan_OutOfBandPrint (netadr_t adr, const char *format, ...)
|
||||
__attribute__ ((format (printf,2,3)));
|
||||
|
||||
/** Process a packet for the specifiied connection.
|
||||
|
||||
Called when the current net_message is from remote_address.
|
||||
Modifies net_message so that it points to the packet payload.
|
||||
|
||||
\param chan The netchan representing the connection.
|
||||
*/
|
||||
qboolean Netchan_Process (netchan_t *chan);
|
||||
|
||||
/** Initialize a new connection.
|
||||
|
||||
\param chan The netchan representing the connection.
|
||||
\param adr The address of the remote end of the connection.
|
||||
\param qport The qport associated with the connection.
|
||||
\param flags Control of the sending/reading of the qport on this
|
||||
connection.
|
||||
*/
|
||||
void Netchan_Setup (netchan_t *chan, netadr_t adr, int qport, ncqport_e flags);
|
||||
|
||||
/** Check if a packet can be sent to the connection.
|
||||
|
||||
\param chan The netchan representing the connection.
|
||||
\return True if the connection isn't chocked.
|
||||
*/
|
||||
qboolean Netchan_CanPacket (netchan_t *chan);
|
||||
|
||||
/** Check if a reliable packet can be sent to the connection.
|
||||
|
||||
\param chan The netchan representing the connection.
|
||||
\return True if there is no outstanding reliable packet and the
|
||||
connection isn't chocked.
|
||||
*/
|
||||
qboolean Netchan_CanReliable (netchan_t *chan);
|
||||
|
||||
/** Send a packet.
|
||||
|
||||
Very raw. Just calls NET_SendPacket().
|
||||
\param length The length of the data to be sent.
|
||||
\param data The data to be sent.
|
||||
\param to The address to which the data will be sent.
|
||||
*/
|
||||
void Netchan_SendPacket (int length, const void *data, netadr_t to);
|
||||
|
||||
//@}
|
||||
|
|
|
@ -187,14 +187,6 @@ Netchan_CanReliable (netchan_t *chan)
|
|||
return Netchan_CanPacket (chan);
|
||||
}
|
||||
|
||||
/*
|
||||
Netchan_Transmit
|
||||
|
||||
tries to send an unreliable message to a connection, and handles the
|
||||
transmition / retransmition of the reliable messages.
|
||||
|
||||
0 length will still generate a packet and deal with the reliable messages.
|
||||
*/
|
||||
void
|
||||
Netchan_Transmit (netchan_t *chan, int length, byte *data)
|
||||
{
|
||||
|
@ -239,20 +231,20 @@ Netchan_Transmit (netchan_t *chan, int length, byte *data)
|
|||
MSG_WriteLong (&send, w1);
|
||||
MSG_WriteLong (&send, w2);
|
||||
|
||||
// send the qport if we are a client
|
||||
/// Send the qport if appropriate (we are a client).
|
||||
if (chan->flags & NC_QPORT_SEND)
|
||||
MSG_WriteShort (&send, chan->qport);
|
||||
|
||||
// copy the reliable message to the packet first
|
||||
/// First copy the reliable message to the packet.
|
||||
if (send_reliable) {
|
||||
SZ_Write (&send, chan->reliable_buf, chan->reliable_length);
|
||||
chan->last_reliable_sequence = chan->outgoing_sequence;
|
||||
}
|
||||
// add the unreliable part if space is available
|
||||
/// Then add the unreliable part if space is available.
|
||||
if (send.maxsize - send.cursize >= length)
|
||||
SZ_Write (&send, data, length);
|
||||
|
||||
// send the datagram
|
||||
/// Send the datagram if not blocked (in demo playback mode)
|
||||
i = chan->outgoing_sequence & (MAX_LATENT - 1);
|
||||
chan->outgoing_size[i] = send.cursize;
|
||||
chan->outgoing_time[i] = *net_realtime;
|
||||
|
@ -276,12 +268,6 @@ Netchan_Transmit (netchan_t *chan, int length, byte *data)
|
|||
chan->outgoing_sequence - chan->incoming_sequence);
|
||||
}
|
||||
|
||||
/*
|
||||
Netchan_Process
|
||||
|
||||
called when the current net_message is from remote_address
|
||||
modifies net_message so that it points to the packet payload
|
||||
*/
|
||||
qboolean
|
||||
Netchan_Process (netchan_t *chan)
|
||||
{
|
||||
|
@ -291,12 +277,12 @@ Netchan_Process (netchan_t *chan)
|
|||
if (!NET_CompareAdr (net_from, chan->remote_address))
|
||||
return false;
|
||||
|
||||
// get sequence numbers
|
||||
/// Get the sequence numbers.
|
||||
MSG_BeginReading (net_message);
|
||||
sequence = MSG_ReadLong (net_message);
|
||||
sequence_ack = MSG_ReadLong (net_message);
|
||||
|
||||
// read the qport if we are a server, but drop it
|
||||
/// Read the qport if appropriate (we are a server), but ignore it.
|
||||
if (chan->flags & NC_QPORT_READ)
|
||||
MSG_ReadShort (net_message);
|
||||
|
||||
|
@ -337,7 +323,7 @@ Netchan_Process (netchan_t *chan)
|
|||
}
|
||||
#endif
|
||||
|
||||
// discard stale or duplicated packets
|
||||
/// Discard stale or duplicated packets.
|
||||
if (sequence < (unsigned int) chan->incoming_sequence + 1) {
|
||||
if (showdrop->int_val)
|
||||
Sys_Printf ("%s:Out of order packet %i at %i\n",
|
||||
|
@ -346,7 +332,7 @@ Netchan_Process (netchan_t *chan)
|
|||
return false;
|
||||
}
|
||||
|
||||
// dropped packets don't keep the message from being used
|
||||
/// Dropped packets don't keep the message from being used.
|
||||
chan->net_drop = sequence - (chan->incoming_sequence + 1);
|
||||
if (chan->net_drop > 0) {
|
||||
chan->drop_count += 1;
|
||||
|
@ -357,21 +343,21 @@ Netchan_Process (netchan_t *chan)
|
|||
sequence - (chan->incoming_sequence + 1), sequence);
|
||||
}
|
||||
|
||||
// if the current outgoing reliable message has been acknowledged
|
||||
// clear the buffer to make way for the next
|
||||
/// If the current outgoing reliable message has been acknowledged,
|
||||
/// clear the buffer to make way for the next.
|
||||
if (reliable_ack == (unsigned int) chan->reliable_sequence)
|
||||
chan->reliable_length = 0; // it has been received
|
||||
|
||||
// if this message contains a reliable message, bump
|
||||
// incoming_reliable_sequence
|
||||
/// If this message contains a reliable message, bump
|
||||
/// incoming_reliable_sequence
|
||||
chan->incoming_sequence = sequence;
|
||||
chan->incoming_acknowledged = sequence_ack;
|
||||
chan->incoming_reliable_acknowledged = reliable_ack;
|
||||
if (reliable_message)
|
||||
chan->incoming_reliable_sequence ^= 1;
|
||||
|
||||
// the message can now be read from the current message pointer
|
||||
// update statistics counters
|
||||
// The message can now be read from the current message pointer.
|
||||
/// Update statistics counters.
|
||||
chan->frame_latency = chan->frame_latency * OLD_AVG
|
||||
+ (chan->outgoing_sequence - sequence_ack) * (1.0 - OLD_AVG);
|
||||
chan->frame_rate = chan->frame_rate * OLD_AVG
|
||||
|
|
Loading…
Reference in a new issue