198 lines
7.5 KiB
C++
198 lines
7.5 KiB
C++
//
|
|
// Copyright 2020 Electronic Arts Inc.
|
|
//
|
|
// TiberianDawn.DLL and RedAlert.dll and corresponding source code 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.
|
|
|
|
// TiberianDawn.DLL and RedAlert.dll and corresponding source code is distributed
|
|
// in the hope that it will be useful, but with permitted additional restrictions
|
|
// under Section 7 of the GPL. See the GNU General Public License in LICENSE.TXT
|
|
// distributed with this program. You should have received a copy of the
|
|
// GNU General Public License along with permitted additional restrictions
|
|
// with this program. If not, see https://github.com/electronicarts/CnC_Remastered_Collection
|
|
|
|
/* $Header: /CounterStrike/TCPIP.H 1 3/03/97 10:25a Joe_bostic $ */
|
|
/***************************************************************************
|
|
** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S **
|
|
***************************************************************************
|
|
* *
|
|
* Project Name : Command & Conquer *
|
|
* *
|
|
* File Name : TCPIP.CPP *
|
|
* *
|
|
* Programmer : Steve Tall *
|
|
* *
|
|
* Start Date : March 11th, 1996 *
|
|
* *
|
|
* Last Update : March 11th, 1996 [ST] *
|
|
* *
|
|
*-------------------------------------------------------------------------*
|
|
* *
|
|
* *
|
|
* *
|
|
*-------------------------------------------------------------------------*
|
|
* Functions: *
|
|
* *
|
|
* *
|
|
* *
|
|
* *
|
|
* *
|
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
|
|
|
#ifdef WIN32
|
|
|
|
#ifndef WOLAPI_INTEGRATION
|
|
extern bool Server;
|
|
#endif
|
|
|
|
#define FORCE_WINSOCK 1
|
|
|
|
#define WINSOCK_MINOR_VER 1
|
|
#define WINSOCK_MAJOR_VER 1
|
|
#define PORTNUM 0x1000
|
|
#define UDP_PORT 0x1001
|
|
#define WS_INTERNET_BUFFER_LEN 1024
|
|
#define WS_NUM_TX_BUFFERS 16 //Must be a power of 2
|
|
#define WS_NUM_RX_BUFFERS 16 //MUst be a power of 2
|
|
#define WS_RECEIVE_BUFFER_LEN 1024
|
|
//#define WS_IN_BUFFER_LEN 8192
|
|
//#define WS_OUT_BUFFER_LEN 8192
|
|
|
|
#define PLANET_WESTWOOD_HANDLE_MAX 20
|
|
#define PLANET_WESTWOOD_PASSWORD_MAX 20
|
|
#define IP_ADDRESS_MAX 40
|
|
#define PORT_NUMBER_MAX 6
|
|
|
|
//...........................................................................
|
|
// Custom messages: WM_USER + 1 to WM_USER + 100
|
|
// These will be sent to the dialog procedure, for display only.
|
|
//...........................................................................
|
|
#define WM_UPDATE_STATUS (WM_USER + 1) // update status text
|
|
#define WM_UPDATE_CLIENTS (WM_USER + 2) // update client list box
|
|
#define WM_UPDATE_MESSAGE (WM_USER + 3) // update received message list
|
|
|
|
//...........................................................................
|
|
// Messages for Async processing.
|
|
//...........................................................................
|
|
#define WM_ACCEPT (WM_USER + 101) // client wants to connect
|
|
#define WM_HOSTBYADDRESS (WM_USER + 102) // async get host by address
|
|
#define WM_HOSTBYNAME (WM_USER + 103) // async get host by name
|
|
#define WM_ASYNCEVENT (WM_USER + 104) // other Async event
|
|
#define WM_UDPASYNCEVENT (WM_USER + 105) // UDP socket Async event
|
|
|
|
|
|
class TcpipManagerClass {
|
|
|
|
public:
|
|
|
|
TcpipManagerClass(void);
|
|
~TcpipManagerClass(void);
|
|
|
|
BOOL Init(void);
|
|
void Start_Server(void);
|
|
void Start_Client(void);
|
|
void Close_Socket(SOCKET s);
|
|
void Message_Handler(HWND window, UINT message, UINT wParam, LONG lParam);
|
|
void Copy_To_In_Buffer(int bytes);
|
|
int Read(void *buffer, int buffer_len);
|
|
void Write(void *buffer, int buffer_len);
|
|
BOOL Add_Client(void);
|
|
void Close(void);
|
|
void Set_Host_Address(char *address);
|
|
void Set_Protocol_UDP(BOOL state);
|
|
void Clear_Socket_Error(SOCKET socket);
|
|
|
|
inline BOOL Get_Connected(void) {return (Connected);}
|
|
|
|
typedef enum ConnectStatusEnum {
|
|
CONNECTED_OK = 0,
|
|
NOT_CONNECTING,
|
|
CONNECTING,
|
|
UNABLE_TO_CONNECT_TO_SERVER,
|
|
CONTACTING_SERVER,
|
|
SERVER_ADDRESS_LOOKUP_FAILED,
|
|
RESOLVING_HOST_ADDRESS,
|
|
UNABLE_TO_ACCEPT_CLIENT,
|
|
UNABLE_TO_CONNECT,
|
|
CONNECTION_LOST
|
|
} ConnectStatusEnum;
|
|
|
|
inline ConnectStatusEnum Get_Connection_Status(void) {return (ConnectStatus);}
|
|
|
|
private:
|
|
|
|
//...........................................................................
|
|
// This structure defines all the info we need about a host
|
|
//...........................................................................
|
|
typedef struct {
|
|
struct in_addr Addr; // address
|
|
char DotAddr[16]; // decimal-dot address string
|
|
char Name[255]; // character-string name
|
|
} HostType;
|
|
|
|
typedef struct {
|
|
char Buffer[WS_INTERNET_BUFFER_LEN];
|
|
int DataLength;
|
|
bool InUse:1;
|
|
} InternetBufferType;
|
|
|
|
|
|
BOOL WinsockInitialised;
|
|
WSADATA WinsockInfo;
|
|
SOCKET ListenSocket;
|
|
SOCKET ConnectSocket;
|
|
SOCKET UDPSocket;
|
|
IN_ADDR ClientIPAddress;
|
|
HANDLE Async;
|
|
char HostBuff[MAXGETHOSTSTRUCT];
|
|
char ClientName[128];
|
|
char ReceiveBuffer[WS_RECEIVE_BUFFER_LEN];
|
|
//char InBuffer[WS_IN_BUFFER_LEN];
|
|
//int InBufferHead;
|
|
//int InBufferTail;
|
|
//char OutBuffer[WS_OUT_BUFFER_LEN];
|
|
//int OutBufferHead;
|
|
//int OutBufferTail;
|
|
BOOL IsServer;
|
|
BOOL Connected;
|
|
HostType Server;
|
|
char HostAddress[IP_ADDRESS_MAX];
|
|
ConnectStatusEnum ConnectStatus;
|
|
BOOL UseUDP;
|
|
IN_ADDR UDPIPAddress;
|
|
int SocketReceiveBuffer;
|
|
int SocketSendBuffer;
|
|
InternetBufferType ReceiveBuffers[WS_NUM_TX_BUFFERS];
|
|
InternetBufferType TransmitBuffers[WS_NUM_RX_BUFFERS];
|
|
int TXBufferHead;
|
|
int TXBufferTail;
|
|
int RXBufferHead;
|
|
int RXBufferTail;
|
|
|
|
};
|
|
|
|
|
|
extern TcpipManagerClass Winsock;
|
|
|
|
extern char PlanetWestwoodIPAddress[IP_ADDRESS_MAX];
|
|
extern long PlanetWestwoodPortNumber;
|
|
extern bool PlanetWestwoodIsHost;
|
|
extern int Read_Game_Options(char *);
|
|
|
|
|
|
#define TXT_WINSOCK_CONNECTING 4567+13
|
|
#define TXT_WINSOCK_NOT_CONNECTING 4567+14
|
|
#define TXT_WINSOCK_UNABLE_TO_CONNECT_TO_SERVER 4567+15
|
|
#define TXT_WINSOCK_CONTACTING_SERVER 4567+16
|
|
#define TXT_WINSOCK_SERVER_ADDRESS_LOOKUP_FAILED 4567+17
|
|
#define TXT_WINSOCK_UNABLE_TO_ACCEPT_CLIENT 4567+18
|
|
#define TXT_WINSOCK_UNABLE_TO_CONNECT 4567+19
|
|
#define TXT_WINSOCK_CONNECTION_LOST 4567+20
|
|
#define TXT_WINSOCK_RESOLVING_HOST_ADDRESS 4567+21
|
|
|
|
|
|
|
|
#endif //WIN32
|