mirror of
https://github.com/kevinbentley/Descent3.git
synced 2025-01-23 12:08:56 +00:00
dec9de7456
Switch all the (u)long types to (u)int32_t where appropriate.
296 lines
7.4 KiB
C++
296 lines
7.4 KiB
C++
/*
|
|
* Descent 3
|
|
* Copyright (C) 2024 Parallax Software
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
--- HISTORICAL COMMENTS FOLLOW ---
|
|
|
|
* $Logfile: /DescentIII/Main/mtclient/mt_net.cpp $
|
|
* $Revision: 1.1.1.1 $
|
|
* $Date: 2003-08-26 03:58:40 $
|
|
* $Author: kevinb $
|
|
*
|
|
* Mastertracker network code
|
|
*
|
|
* $Log: not supported by cvs2svn $
|
|
*
|
|
* 13 10/03/01 12:44a Kevin
|
|
* Smaller version of pxo packets
|
|
*
|
|
* 12 9/02/99 3:16p Kevin
|
|
* Macintosh byte ordering fixes
|
|
*
|
|
* 11 8/24/99 5:47p Kevin
|
|
* Macintosh crap
|
|
*
|
|
* 10 4/19/99 8:36p Jeff
|
|
* Compile under Linux
|
|
*
|
|
* 9 4/19/99 7:56p Kevin
|
|
* ifdef'd out some win32 specific stuff
|
|
*
|
|
* 8 3/02/99 5:50p Kevin
|
|
* Ouch. Duplicate structures existed and were conflicting.
|
|
*
|
|
* 7 12/23/98 6:38p Kevin
|
|
* All UDP data (except gamespy) now uses one (registered) port number
|
|
*
|
|
* 6 10/01/98 11:37a Kevin
|
|
* UI fixes and stuff
|
|
*
|
|
* 5 9/16/98 8:06p Jason
|
|
* got mastertracker working with the dedicated server
|
|
*
|
|
* 4 9/04/98 1:51p Kevin
|
|
* implemented asyncronous gethostbyname
|
|
*
|
|
* 3 8/25/98 6:33p Kevin
|
|
* PXO screens
|
|
*
|
|
* 2 6/01/98 10:10a Kevin
|
|
* Added DLL connection interface and auto update DLL
|
|
*
|
|
* 1 5/21/98 11:21a Kevin
|
|
*
|
|
* $NoKeywords: $
|
|
*/
|
|
|
|
#ifdef WIN32
|
|
#include <windows.h>
|
|
#include <winsock.h>
|
|
#include <wsipx.h>
|
|
#endif
|
|
|
|
#include <memory.h>
|
|
#include <string.h>
|
|
#include "pstypes.h"
|
|
#include "networking.h"
|
|
#include "mtgametrack.h"
|
|
#include "mt_net.h"
|
|
#include "byteswap.h"
|
|
|
|
#define LOGIN_LEN 33
|
|
#define REAL_NAME_LEN 66
|
|
#define PASSWORD_LEN 17
|
|
#define EMAIL_LEN 100
|
|
#define TRACKER_ID_LEN 10
|
|
#define PILOT_NAME_LEN 20
|
|
|
|
#ifdef WIN32
|
|
#pragma pack(push,pxo)
|
|
#endif
|
|
#pragma pack(1) //Single byte alignment!
|
|
typedef struct vmt_descent3_struct {
|
|
char tracker_id[TRACKER_ID_LEN];
|
|
char pilot_name[PILOT_NAME_LEN];
|
|
int rank;
|
|
|
|
int kills;
|
|
int deaths;
|
|
int suicides;
|
|
int online_time;
|
|
int games_played;
|
|
unsigned int security;
|
|
unsigned char virgin_pilot; //This pilot was just created if TRUE
|
|
unsigned int lateral_thrust;
|
|
unsigned int rotational_thrust;
|
|
unsigned int sliding_pct; //Percentage of the time you were sliding
|
|
uint32_t checksum; //This value needs to be equal to whatever the checksum is once the packet is decoded
|
|
uint32_t pad; //just to provide room for out 4 byte encryption boundry only needed on the client side for now
|
|
} vmt_descent3_struct;
|
|
#define DESCENT3_BLOCK_SIZE (sizeof(vmt_descent3_struct)-4)
|
|
#ifdef WIN32
|
|
#pragma pack(pop,pxo)
|
|
#else
|
|
#pragma pack()
|
|
#endif
|
|
|
|
#include "mtpilottrack.h"
|
|
|
|
extern int MT_Initialized;
|
|
//Mastertracker sockets
|
|
SOCKET TCP_game_tracker_socket;
|
|
SOCKET TCP_pilot_tracker_socket;
|
|
SOCKET TCP_chat_server_socket;
|
|
|
|
//Mastertracker addresses (we resolve them on init, and don't want to have to do it again)
|
|
SOCKADDR_IN gtrackaddr;
|
|
SOCKADDR_IN ptrackaddr;
|
|
SOCKADDR_IN ctrackaddr;
|
|
SOCKADDR_IN sockaddr;
|
|
|
|
#define DLLmprintf(args) DLLDebug_ConsolePrintf args
|
|
|
|
|
|
#define NW_AGHBN_CANCEL 1
|
|
#define NW_AGHBN_LOOKUP 2
|
|
#define NW_AGHBN_READ 3
|
|
|
|
//extern void DLLDebug_ConsolePrintf (int n, const char *format, ... );
|
|
typedef void( *Debug_ConsolePrintf_fp ) (int n, const char *format, ... );
|
|
|
|
extern Debug_ConsolePrintf_fp DLLDebug_ConsolePrintf;
|
|
|
|
typedef int (*nw_Asyncgethostbyname_fp) (unsigned int *ip,int command, char *hostname);
|
|
extern nw_Asyncgethostbyname_fp DLLnw_Asyncgethostbyname;
|
|
|
|
typedef int (*nw_SendWithID_fp) (ubyte id,ubyte *data,int len,network_address *who_to);
|
|
extern nw_SendWithID_fp DLLnw_SendWithID;
|
|
typedef int (*PollUI_fp) (void);
|
|
extern PollUI_fp DLLPollUI;
|
|
extern bool *DLLDedicated_server;
|
|
|
|
int SendGameTrackerPacker(void *packet)
|
|
{
|
|
game_packet_header *g_pack = (game_packet_header *)packet;
|
|
|
|
network_address send_address;
|
|
memset(&send_address,0,sizeof(network_address));
|
|
SOCKADDR_IN *inaddr = (SOCKADDR_IN *)>rackaddr;
|
|
memcpy(send_address.address,&inaddr->sin_addr, 4);
|
|
send_address.port = htons(inaddr->sin_port);
|
|
send_address.connection_type = NP_TCP;
|
|
|
|
return DLLnw_SendWithID(PXO_NETID_GAME_TRACKER,(ubyte *)g_pack,INTEL_INT(g_pack->len),&send_address);
|
|
|
|
}
|
|
|
|
|
|
|
|
void InitMTSockets(void)
|
|
{
|
|
#ifdef WIN32
|
|
WSADATA ws_data;
|
|
WORD ver=MAKEWORD(1,1);
|
|
#endif
|
|
int rcode;
|
|
unsigned int ip;
|
|
#ifdef WIN32
|
|
int error=WSAStartup(ver,&ws_data);
|
|
if (error!=0)
|
|
{
|
|
DLLmprintf ((0,"There was an error initializing networking! Error=%d\n",error));
|
|
return;
|
|
}
|
|
else
|
|
#endif
|
|
{
|
|
DLLmprintf ((0,"Network initted successfully!\n"));
|
|
}
|
|
|
|
{
|
|
static HOSTENT lhe;
|
|
memset( &sockaddr, 0, sizeof(SOCKADDR_IN) );
|
|
gtrackaddr.sin_family = AF_INET;
|
|
gtrackaddr.sin_addr.s_addr = INADDR_ANY;
|
|
gtrackaddr.sin_port = 0;
|
|
|
|
gtrackaddr.sin_family = AF_INET;
|
|
//This would be a good place to resolve the IP based on a domain name
|
|
DLLmprintf((0,"Looking up hostname: %s.\n",GAMETRACKERNAME));
|
|
|
|
DLLnw_Asyncgethostbyname(&ip,NW_AGHBN_LOOKUP,GAMETRACKERNAME);
|
|
|
|
do
|
|
{
|
|
rcode = DLLnw_Asyncgethostbyname(&ip,NW_AGHBN_READ,GAMETRACKERNAME);
|
|
|
|
if (!*DLLDedicated_server)
|
|
{
|
|
if(99==DLLPollUI())
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
}while(rcode==0);
|
|
|
|
if(rcode!=1)
|
|
{
|
|
DLLmprintf((0,"Unable to gethostbyname(\"%s\").\n",GAMETRACKERNAME));
|
|
DLLmprintf((0,"WSAGetLastError() returned %d.\n",WSAGetLastError() ));
|
|
DLLnw_Asyncgethostbyname(NULL,NW_AGHBN_CANCEL,NULL);
|
|
return ;
|
|
}
|
|
|
|
memcpy(>rackaddr.sin_addr.s_addr, &ip,4);//&iaddr, 4);
|
|
gtrackaddr.sin_port = htons( GAMEPORT );
|
|
InitGameTrackerClient(GT_D3TNG);
|
|
|
|
}
|
|
{
|
|
|
|
memset( &sockaddr, 0, sizeof(SOCKADDR_IN) );
|
|
sockaddr.sin_family = AF_INET;
|
|
sockaddr.sin_addr.s_addr = INADDR_ANY;
|
|
sockaddr.sin_port = 0;//htons(REGPORT);
|
|
DLLmprintf((0,"Looking up hostname: %s.\n",PILOTTRACKERNAME));
|
|
DLLnw_Asyncgethostbyname(&ip,NW_AGHBN_LOOKUP,PILOTTRACKERNAME);
|
|
do
|
|
{
|
|
rcode = DLLnw_Asyncgethostbyname(&ip,NW_AGHBN_READ,PILOTTRACKERNAME);
|
|
if (!*DLLDedicated_server)
|
|
{
|
|
if(99==DLLPollUI())
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
}while(rcode==0);
|
|
|
|
|
|
if(rcode!=1)
|
|
{
|
|
DLLmprintf((0,"Unable to gethostbyname(\"%s\").\n",PILOTTRACKERNAME));
|
|
DLLmprintf((0,"WSAGetLastError() returned %d.\n",WSAGetLastError() ));
|
|
DLLnw_Asyncgethostbyname(NULL,NW_AGHBN_CANCEL,NULL);
|
|
return;
|
|
}
|
|
ptrackaddr.sin_family = AF_INET;
|
|
memcpy(&ptrackaddr.sin_addr.s_addr, &ip,4);
|
|
ptrackaddr.sin_port = htons(REGPORT);
|
|
InitPilotTrackerClient();
|
|
|
|
}
|
|
MT_Initialized = 1;
|
|
|
|
}
|
|
|
|
void CloseMTSockets(void)
|
|
{
|
|
#ifdef WIN32
|
|
if (WSACleanup())
|
|
{
|
|
DLLmprintf((0, "Error closing wsock!\n") );
|
|
}
|
|
#endif
|
|
}
|
|
|
|
|
|
|
|
|
|
int SendPilotTrackerPacket(void *packet)
|
|
{
|
|
udp_packet_header *p_pack = (udp_packet_header *)packet;
|
|
|
|
network_address send_address;
|
|
memset(&send_address,0,sizeof(network_address));
|
|
SOCKADDR_IN *inaddr = (SOCKADDR_IN *)&ptrackaddr;
|
|
memcpy(send_address.address,&inaddr->sin_addr, 4);
|
|
send_address.port = htons(inaddr->sin_port);
|
|
send_address.connection_type = NP_TCP;
|
|
return DLLnw_SendWithID(PXO_NETID_USER_TRACKER,(ubyte *)p_pack,INTEL_SHORT(p_pack->len),&send_address);
|
|
|
|
}
|