home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 113 / EnigmaAmiga113CD.iso / software / sviluppo / quake_src / net.h < prev    next >
C/C++ Source or Header  |  2000-06-17  |  10KB  |  338 lines

  1. /*
  2. Copyright (C) 1996-1997 Id Software, Inc.
  3.  
  4. This program is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU General Public License
  6. as published by the Free Software Foundation; either version 2
  7. of the License, or (at your option) any later version.
  8.  
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  12.  
  13. See the GNU General Public License for more details.
  14.  
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18.  
  19. */
  20. // net.h -- quake's interface to the networking layer
  21.  
  22. struct qsockaddr
  23. {
  24.   short sa_family;
  25.   unsigned char sa_data[14];
  26. };
  27.  
  28.  
  29. #define NET_NAMELEN     64
  30.  
  31. #define NET_MAXMESSAGE    8192
  32. #define NET_HEADERSIZE    (2 * sizeof(unsigned int))
  33. #define NET_DATAGRAMSIZE  (MAX_DATAGRAM + NET_HEADERSIZE)
  34.  
  35. // NetHeader flags
  36. #define NETFLAG_LENGTH_MASK 0x0000ffff
  37. #define NETFLAG_DATA    0x00010000
  38. #define NETFLAG_ACK     0x00020000
  39. #define NETFLAG_NAK     0x00040000
  40. #define NETFLAG_EOM     0x00080000
  41. #define NETFLAG_UNRELIABLE  0x00100000
  42. #define NETFLAG_CTL     0x80000000
  43.  
  44.  
  45. #define NET_PROTOCOL_VERSION  3
  46.  
  47. // This is the network info/connection protocol.  It is used to find Quake
  48. // servers, get info about them, and connect to them.  Once connected, the
  49. // Quake game protocol (documented elsewhere) is used.
  50. //
  51. //
  52. // General notes:
  53. //  game_name is currently always "QUAKE", but is there so this same protocol
  54. //    can be used for future games as well; can you say Quake2?
  55. //
  56. // CCREQ_CONNECT
  57. //    string  game_name       "QUAKE"
  58. //    byte  net_protocol_version  NET_PROTOCOL_VERSION
  59. //
  60. // CCREQ_SERVER_INFO
  61. //    string  game_name       "QUAKE"
  62. //    byte  net_protocol_version  NET_PROTOCOL_VERSION
  63. //
  64. // CCREQ_PLAYER_INFO
  65. //    byte  player_number
  66. //
  67. // CCREQ_RULE_INFO
  68. //    string  rule
  69. //
  70. //
  71. //
  72. // CCREP_ACCEPT
  73. //    long  port
  74. //
  75. // CCREP_REJECT
  76. //    string  reason
  77. //
  78. // CCREP_SERVER_INFO
  79. //    string  server_address
  80. //    string  host_name
  81. //    string  level_name
  82. //    byte  current_players
  83. //    byte  max_players
  84. //    byte  protocol_version  NET_PROTOCOL_VERSION
  85. //
  86. // CCREP_PLAYER_INFO
  87. //    byte  player_number
  88. //    string  name
  89. //    long  colors
  90. //    long  frags
  91. //    long  connect_time
  92. //    string  address
  93. //
  94. // CCREP_RULE_INFO
  95. //    string  rule
  96. //    string  value
  97.  
  98. //  note:
  99. //    There are two address forms used above.  The short form is just a
  100. //    port number.  The address that goes along with the port is defined as
  101. //    "whatever address you receive this reponse from".  This lets us use
  102. //    the host OS to solve the problem of multiple host addresses (possibly
  103. //    with no routing between them); the host will use the right address
  104. //    when we reply to the inbound connection request.  The long from is
  105. //    a full address and port in a string.  It is used for returning the
  106. //    address of a server that is not running locally.
  107.  
  108. #define CCREQ_CONNECT   0x01
  109. #define CCREQ_SERVER_INFO 0x02
  110. #define CCREQ_PLAYER_INFO 0x03
  111. #define CCREQ_RULE_INFO   0x04
  112.  
  113. #define CCREP_ACCEPT    0x81
  114. #define CCREP_REJECT    0x82
  115. #define CCREP_SERVER_INFO 0x83
  116. #define CCREP_PLAYER_INFO 0x84
  117. #define CCREP_RULE_INFO   0x85
  118.  
  119. typedef struct qsocket_s
  120. {
  121.   struct qsocket_s  *next;
  122.   double      connecttime;
  123.   double      lastMessageTime;
  124.   double      lastSendTime;
  125.  
  126.   qboolean    disconnected;
  127.   qboolean    canSend;
  128.   qboolean    sendNext;
  129.   
  130.   int       driver;
  131.   int       landriver;
  132.   int       socket;
  133.   void      *driverdata;
  134.  
  135.   unsigned int  ackSequence;
  136.   unsigned int  sendSequence;
  137.   unsigned int  unreliableSendSequence;
  138.   int       sendMessageLength;
  139.   byte      sendMessage [NET_MAXMESSAGE];
  140.  
  141.   unsigned int  receiveSequence;
  142.   unsigned int  unreliableReceiveSequence;
  143.   int       receiveMessageLength;
  144.   byte      receiveMessage [NET_MAXMESSAGE];
  145.  
  146.   struct qsockaddr  addr;
  147.   char        address[NET_NAMELEN];
  148.  
  149. } qsocket_t;
  150.  
  151. extern qsocket_t  *net_activeSockets;
  152. extern qsocket_t  *net_freeSockets;
  153. extern int      net_numsockets;
  154.  
  155. typedef struct
  156. {
  157.   char    *name;
  158.   qboolean  initialized;
  159.   int     controlSock;
  160.   int     (*Init) (void);
  161.   void    (*Shutdown) (void);
  162.   void    (*Listen) (qboolean state);
  163.   int     (*OpenSocket) (int port);
  164.   int     (*CloseSocket) (int socket);
  165.   int     (*Connect) (int socket, struct qsockaddr *addr);
  166.   int     (*CheckNewConnections) (void);
  167.   int     (*Read) (int socket, byte *buf, int len, struct qsockaddr *addr);
  168.   int     (*Write) (int socket, byte *buf, int len, struct qsockaddr *addr);
  169.   int     (*Broadcast) (int socket, byte *buf, int len);
  170.   char *    (*AddrToString) (struct qsockaddr *addr);
  171.   int     (*StringToAddr) (char *string, struct qsockaddr *addr);
  172.   int     (*GetSocketAddr) (int socket, struct qsockaddr *addr);
  173.   int     (*GetNameFromAddr) (struct qsockaddr *addr, char *name);
  174.   int     (*GetAddrFromName) (char *name, struct qsockaddr *addr);
  175.   int     (*AddrCompare) (struct qsockaddr *addr1, struct qsockaddr *addr2);
  176.   int     (*GetSocketPort) (struct qsockaddr *addr);
  177.   int     (*SetSocketPort) (struct qsockaddr *addr, int port);
  178. } net_landriver_t;
  179.  
  180. #define MAX_NET_DRIVERS   8
  181. extern int        net_numlandrivers;
  182. extern net_landriver_t  net_landrivers[MAX_NET_DRIVERS];
  183.  
  184. typedef struct
  185. {
  186.   char    *name;
  187.   qboolean  initialized;
  188.   int     (*Init) (void);
  189.   void    (*Listen) (qboolean state);
  190.   void    (*SearchForHosts) (qboolean xmit);
  191.   qsocket_t *(*Connect) (char *host);
  192.   qsocket_t   *(*CheckNewConnections) (void);
  193.   int     (*QGetMessage) (qsocket_t *sock);
  194.   int     (*QSendMessage) (qsocket_t *sock, sizebuf_t *data);
  195.   int     (*SendUnreliableMessage) (qsocket_t *sock, sizebuf_t *data);
  196.   qboolean  (*CanSendMessage) (qsocket_t *sock);
  197.   qboolean  (*CanSendUnreliableMessage) (qsocket_t *sock);
  198.   void    (*Close) (qsocket_t *sock);
  199.   void    (*Shutdown) (void);
  200.   int     controlSock;
  201. } net_driver_t;
  202.  
  203. extern int      net_numdrivers;
  204. extern net_driver_t net_drivers[MAX_NET_DRIVERS];
  205.  
  206. extern int      DEFAULTnet_hostport;
  207. extern int      net_hostport;
  208.  
  209. extern int net_driverlevel;
  210. extern cvar_t   hostname;
  211. extern char     playername[];
  212. extern int      playercolor;
  213.  
  214. extern int    messagesSent;
  215. extern int    messagesReceived;
  216. extern int    unreliableMessagesSent;
  217. extern int    unreliableMessagesReceived;
  218.  
  219. qsocket_t *NET_NewQSocket (void);
  220. void NET_FreeQSocket(qsocket_t *);
  221. double SetNetTime(void);
  222.  
  223.  
  224. #define HOSTCACHESIZE 8
  225.  
  226. typedef struct
  227. {
  228.   char  name[16];
  229.   char  map[16];
  230.   char  cname[32];
  231.   int   users;
  232.   int   maxusers;
  233.   int   driver;
  234.   int   ldriver;
  235.   struct qsockaddr addr;
  236. } hostcache_t;
  237.  
  238. extern int hostCacheCount;
  239. extern hostcache_t hostcache[HOSTCACHESIZE];
  240.  
  241. #if !defined(_WIN32 ) && !defined (__linux__) && !defined (__sun__)
  242. #ifndef htonl
  243. extern unsigned long htonl (unsigned long hostlong);
  244. #endif
  245. #ifndef htons
  246. extern unsigned short htons (unsigned short hostshort);
  247. #endif
  248. #ifndef ntohl
  249. extern unsigned long ntohl (unsigned long netlong);
  250. #endif
  251. #ifndef ntohs
  252. extern unsigned short ntohs (unsigned short netshort);
  253. #endif
  254. #endif
  255.  
  256. #ifdef IDGODS
  257. qboolean IsID(struct qsockaddr *addr);
  258. #endif
  259.  
  260. //============================================================================
  261. //
  262. // public network functions
  263. //
  264. //============================================================================
  265.  
  266. extern  double    net_time;
  267. extern  sizebuf_t net_message;
  268. extern  int     net_activeconnections;
  269.  
  270. void    NET_Init (void);
  271. void    NET_Shutdown (void);
  272.  
  273. struct qsocket_s  *NET_CheckNewConnections (void);
  274. // returns a new connection number if there is one pending, else -1
  275.  
  276. struct qsocket_s  *NET_Connect (char *host);
  277. // called by client to connect to a host.  Returns -1 if not able to
  278.  
  279. qboolean NET_CanSendMessage (qsocket_t *sock);
  280. // Returns true or false if the given qsocket can currently accept a
  281. // message to be transmitted.
  282.  
  283. int     NET_GetMessage (struct qsocket_s *sock);
  284. // returns data in net_message sizebuf
  285. // returns 0 if no data is waiting
  286. // returns 1 if a message was received
  287. // returns 2 if an unreliable message was received
  288. // returns -1 if the connection died
  289.  
  290. int     NET_SendMessage (struct qsocket_s *sock, sizebuf_t *data);
  291. int     NET_SendUnreliableMessage (struct qsocket_s *sock, sizebuf_t *data);
  292. // returns 0 if the message connot be delivered reliably, but the connection
  293. //    is still considered valid
  294. // returns 1 if the message was sent properly
  295. // returns -1 if the connection died
  296.  
  297. int     NET_SendToAll(sizebuf_t *data, int blocktime);
  298. // This is a reliable *blocking* send to all attached clients.
  299.  
  300.  
  301. void    NET_Close (struct qsocket_s *sock);
  302. // if a dead connection is returned by a get or send function, this function
  303. // should be called when it is convenient
  304.  
  305. // Server calls when a client is kicked off for a game related misbehavior
  306. // like an illegal protocal conversation.  Client calls when disconnecting
  307. // from a server.
  308. // A netcon_t number will not be reused until this function is called for it
  309.  
  310. void NET_Poll(void);
  311.  
  312.  
  313. typedef struct _PollProcedure
  314. {
  315.   struct _PollProcedure *next;
  316.   double          nextTime;
  317.   void          (*procedure)();
  318.   void          *arg;
  319. } PollProcedure;
  320.  
  321. void SchedulePollProcedure(PollProcedure *pp, double timeOffset);
  322.  
  323. extern  qboolean  serialAvailable;
  324. extern  qboolean  ipxAvailable;
  325. extern  qboolean  tcpipAvailable;
  326. extern  char    my_ipx_address[NET_NAMELEN];
  327. extern  char    my_tcpip_address[NET_NAMELEN];
  328. extern void (*GetComPortConfig) (int portNumber, int *port, int *irq, int *baud, qboolean *useModem);
  329. extern void (*SetComPortConfig) (int portNumber, int port, int irq, int baud, qboolean useModem);
  330. extern void (*GetModemConfig) (int portNumber, char *dialType, char *clear, char *init, char *hangup);
  331. extern void (*SetModemConfig) (int portNumber, char *dialType, char *clear, char *init, char *hangup);
  332.  
  333. extern  qboolean  slistInProgress;
  334. extern  qboolean  slistSilent;
  335. extern  qboolean  slistLocal;
  336.  
  337. void NET_Slist_f (void);
  338.