210 lines
8.2 KiB
C++
Executable File
210 lines
8.2 KiB
C++
Executable File
//-----------------------------------------------------------------------------
|
|
// ----------------
|
|
// File ....: tcp.h
|
|
// ----------------
|
|
// Author...: Gus J Grubba
|
|
// Date ....: September 1995
|
|
// O.S. ....: Windows NT 3.51
|
|
//
|
|
// Note ....: Copyright 1991, 1995 Gus J Grubba
|
|
//
|
|
// History .: Sep, 03 1995 - Ported to C++ / WinNT
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#ifndef _TCPINCLUDE_
|
|
#define _TCPINCLUDE_
|
|
|
|
#include <winsock.h>
|
|
|
|
//-- Constants ----------------------------------------------------------------
|
|
|
|
#define MAXUDPLEN 512
|
|
#define LOCALHOSTADDRESSH 0x0100007F //-- (Host Order)
|
|
#define LOCALHOSTADDRESSN 0x7F000001 //-- (Network Order)
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//-- Error Codes
|
|
|
|
#define GCRES_SERVICEERROR 0x1000
|
|
#define GCRES_GETHOSTERROR 0x1001
|
|
#define GCRES_CANNOTCREATESOCKET 0x1002
|
|
#define GCRES_CANNOTCONNECT 0x1003
|
|
#define GCRES_BINDERROR 0x1004
|
|
#define GCRES_CANNOTSERVE 0x1005
|
|
#define GCRES_DISCONNECTED 0x1006
|
|
#define GCRES_READERROR 0x1007
|
|
#define GCRES_INVALIDSERVERTHREAD 0x1008
|
|
#define GCRES_INVALIDPORT 0x1009
|
|
#define GCRES_NOTINITIALIZED 0x100A
|
|
#define GCRES_TOOBIG 0x100B
|
|
#define GCRES_WRITEERROR 0x100C
|
|
#define GCRES_TIMEOUT 0x100D
|
|
|
|
//-- Forward References ------------------------------------------------------
|
|
|
|
class ConnectionInfo;
|
|
class TCPcomm;
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//-- Server Thread
|
|
|
|
typedef void (WINAPI *SERVER_THREAD)(
|
|
ConnectionInfo *ci
|
|
);
|
|
|
|
typedef struct tag_tcpSRV {
|
|
ConnectionInfo *ci;
|
|
TCPcomm *tcp;
|
|
} tcpSRV;
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//-- Connection data
|
|
|
|
class ConnectionInfo {
|
|
|
|
//-- All kept in host order
|
|
|
|
void *ptr, *param; //-- Generic Pointers
|
|
|
|
BOOL blocking,dns;
|
|
|
|
SOCKET c_sock; //-- The "client" socket
|
|
DWORD c_address; //-- The "client" inet address
|
|
char c_name[MAX_PATH]; //-- The "client" hostname
|
|
WORD c_port; //-- The "client" port
|
|
|
|
SOCKET s_sock; //-- The "server" socket
|
|
DWORD s_address; //-- The "server" inet address
|
|
char s_name[MAX_PATH]; //-- The "server" hostname
|
|
WORD s_port; //-- The "server" port
|
|
|
|
DWORD bytes_s, bytes_r;
|
|
|
|
public:
|
|
|
|
GCOMMEXPORT ConnectionInfo ( ) { Reset(); dns = FALSE;}
|
|
|
|
GCOMMEXPORT void Reset( ) {
|
|
ptr = NULL;
|
|
param = NULL;
|
|
bytes_s = 0;
|
|
bytes_r = 0;
|
|
ResetClient();
|
|
ResetServer();
|
|
}
|
|
|
|
GCOMMEXPORT void ResetClient ( ) {
|
|
c_sock = INVALID_SOCKET;
|
|
c_address = 0;
|
|
c_name[0] = 0;
|
|
}
|
|
|
|
GCOMMEXPORT void ResetServer ( ) {
|
|
s_sock = INVALID_SOCKET;
|
|
s_address = 0;
|
|
s_name[0] = 0;
|
|
}
|
|
|
|
GCOMMEXPORT void SetClientSocket ( SOCKET s) { c_sock = s; }
|
|
GCOMMEXPORT void SetClientAddress ( DWORD a) { c_address = a; }
|
|
GCOMMEXPORT void SetClientName ( char *n) { strcpy(c_name,n); }
|
|
GCOMMEXPORT void SetClientPort ( WORD p) { c_port = p; }
|
|
|
|
GCOMMEXPORT void SetServerSocket ( SOCKET s) { s_sock = s; }
|
|
GCOMMEXPORT void SetServerAddress ( DWORD a) { s_address = a; }
|
|
GCOMMEXPORT void SetServerName ( char *n) { strcpy(s_name,n); }
|
|
GCOMMEXPORT void SetServerPort ( WORD p) { s_port = p; }
|
|
|
|
GCOMMEXPORT SOCKET ClientSocket ( ) { return c_sock; }
|
|
GCOMMEXPORT DWORD ClientAddress ( ) { return c_address; }
|
|
GCOMMEXPORT WORD ClientPort ( ) { return c_port; }
|
|
GCOMMEXPORT char *ClientName ( ) { return c_name; }
|
|
|
|
GCOMMEXPORT SOCKET ServerSocket ( ) { return s_sock; }
|
|
GCOMMEXPORT WORD ServerPort ( ) { return s_port; }
|
|
GCOMMEXPORT DWORD ServerAddress ( ) { return s_address; }
|
|
GCOMMEXPORT char *ServerName ( ) { return s_name; }
|
|
|
|
GCOMMEXPORT void AddToBytesSent ( DWORD b ) { bytes_s += b; }
|
|
GCOMMEXPORT void AddToBytesReceived ( DWORD b ) { bytes_r += b; }
|
|
|
|
GCOMMEXPORT DWORD BytesSent ( ) { return bytes_s; }
|
|
GCOMMEXPORT DWORD BytesReceived ( ) { return bytes_r; }
|
|
|
|
GCOMMEXPORT void ResetBytesSent ( ) { bytes_s = 0; }
|
|
GCOMMEXPORT void ResetBytesReceived ( ) { bytes_r = 0; }
|
|
|
|
GCOMMEXPORT void *Ptr ( ) { return ptr; }
|
|
GCOMMEXPORT void SetPtr ( void * p ) { ptr = p; }
|
|
GCOMMEXPORT void *Param ( ) { return param; }
|
|
GCOMMEXPORT void SetParam ( void * p ) { param = p; }
|
|
|
|
GCOMMEXPORT void SetBlocking ( BOOL b ) { blocking = b; }
|
|
GCOMMEXPORT BOOL Blocking ( ) { return blocking; }
|
|
|
|
GCOMMEXPORT void SetUseDns ( BOOL b ) { dns = b; }
|
|
GCOMMEXPORT BOOL UseDns ( ) { return dns; }
|
|
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//-- BSD Socket Class Definition ---------------------------------------------
|
|
//-----------------------------------------------------------------------------
|
|
// #> TCPcomm
|
|
//
|
|
|
|
class TCPcomm : public tcCOMM {
|
|
|
|
private:
|
|
|
|
BOOL initialized;
|
|
WSADATA WSAData;
|
|
SOCKET sSocket;
|
|
|
|
BOOL HandleStandardErrors ( int err, TCHAR *msg );
|
|
|
|
public:
|
|
|
|
GCOMMEXPORT TCPcomm ( );
|
|
GCOMMEXPORT ~TCPcomm ( );
|
|
|
|
//-- House Keeping --------------------------------
|
|
|
|
GCOMMEXPORT BOOL Init ( HWND hWnd );
|
|
GCOMMEXPORT BOOL Setup ( void * ) { return TRUE; }
|
|
GCOMMEXPORT void Close ( );
|
|
GCOMMEXPORT BOOL SaveSession ( void *ptr ) { return TRUE; }
|
|
GCOMMEXPORT BOOL LoadSession ( void *ptr ) { return TRUE; }
|
|
GCOMMEXPORT DWORD EvaluateDataSize ( ) { return 0; }
|
|
|
|
//-- Helpers --------------------------------------
|
|
|
|
GCOMMEXPORT GCRES GetHostAddress ( DWORD *addr, char *name, char *fullname = NULL );
|
|
|
|
//-- TCP Transport --------------------------------
|
|
|
|
GCOMMEXPORT GCRES Serve ( WORD port, SERVER_THREAD func, void *param );
|
|
GCOMMEXPORT void StopServer ( );
|
|
GCOMMEXPORT GCRES Send ( ConnectionInfo *ci, void *buf, int len, float timeout = 5.0f );
|
|
GCOMMEXPORT GCRES Receive ( ConnectionInfo *ci, void *buf, int len, float timeout = 5.0f );
|
|
GCOMMEXPORT GCRES rlogin ( ConnectionInfo *ci );
|
|
GCOMMEXPORT GCRES Connect ( ConnectionInfo *ci );
|
|
GCOMMEXPORT void Disconnect ( ConnectionInfo *ci );
|
|
|
|
//-- UDP Transport --------------------------------
|
|
|
|
#define UDP_BLOCK 1
|
|
#define UDP_NONBLOCK 0
|
|
|
|
GCOMMEXPORT GCRES CreateUDPServer ( ConnectionInfo *ci, BOOL block = UDP_NONBLOCK );
|
|
GCOMMEXPORT GCRES CloseUDPServer ( ConnectionInfo *ci );
|
|
GCOMMEXPORT GCRES SendUDP ( ConnectionInfo *ci, void *buf, int len, int *written, float timeout = 5.0f);
|
|
GCOMMEXPORT GCRES ReceiveUDP ( ConnectionInfo *ci, void *buf, int len, int *read, float timeout = 5.0f);
|
|
|
|
};
|
|
|
|
#endif
|
|
|
|
//-- EOF: tcp.h ---------------------------------------------------------------
|