/* * $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 #include #include #endif #include #include #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 unsigned long checksum; //This value needs to be equal to whatever the checksum is once the packet is decoded unsigned long 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, char *format, ... ); typedef void( *Debug_ConsolePrintf_fp ) (int n, 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); }