summaryrefslogtreecommitdiff
path: root/protocols/EmLanProto/src/lan.h
blob: 9083281619d14e4d242ab53e1ae3a96ad9b3322e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
//////////////////////////////////////////////////////////////////////////
// Lan functions

#ifndef __lan_h__
#define __lan_h__

#define MAKE_PORT(x) (HIBYTE(x)|(LOBYTE(x)<<8))

#define MAX_INTERNAL_IP 32
#define PORT_NUMBER MAKE_PORT(34074)

// Class for operating with LAN
class CLan
{
public:
	// constructor
	CLan();
	// destructor
	~CLan();

	// Helper function - returns status
	int GetStatus() { return m_status; }
	// Helper function - returns mode
	int GetMode() { return m_mode; }
	// Getting host addresses count
	int GetHostAddrCount() { return m_hostAddrCount; }
	// Getting host addresses
	in_addr GetHostAddress(int ind) { return m_hostAddr[ind]; }
	// Get current host address
	in_addr GetCurHostAddress() { return m_curAddr; }

protected:
	// Lan status
	enum enumStatus
	{
		LS_OK, //< no problems
		LS_WRONG_WINSOCK, //< not found winsock of propper version
		LS_CANT_CREATE_SOCKET, //< can not create income socket
		LS_CANT_GET_HOSTADDR, //< can not find host address
		LS_CANT_TURN_ON_BROADCAST, //< can not allow broadcast messages for socket
		LS_CANT_BIND_SOCKET, //< can not bind socket to the address
		LS_CANT_START_LISTEN, //< can not start listen on TCP socket
		LS_CANT_CREATE_THREADS, //< can not create threads for listen and accept
	};

	// Lan mode
	enum enumMode
	{
		LM_OFF, //< Winsock is turned off
		LM_ON, //< Winsock is on
		LM_LISTEN, //< Listening for incoming messages
	};

	// Retrieve list of network interfaces
	bool ResetInterfaces();

	// Starts winsock
	void Startup();
	// Stops winsock
	void Shutdown();
	// Listen
	void StartListen();
	// Stop Listen
	void StopListen();

	// Set current host address
	void SetCurHostAddress(in_addr addr);

	// Send packet
	void SendPacket(in_addr addr, const u_char* mes, int len);
	// Send broadcast packet
	void SendPacketBroadcast(const u_char* mes, int len);

	// Event - called when packet is received
	virtual void OnRecvPacket(u_char*, int, in_addr) { };
	// Event - called when new incoming tcp connection is created (new thread is created)
	virtual void OnInTCPConnection(u_long, SOCKET) { };
	// Event - called when new outgoing tcp connection is created )new thread is created)
	virtual void OnOutTCPConnection(u_long, SOCKET, LPVOID) {};
	// Creates new outgoing TCP connection
	SOCKET CreateTCPConnection(u_long addr, LPVOID lpParameter);

private:
	// Launches Listen procedure when in new thread
	static void __cdecl ListenProc(void *lpParameter);
	// Listnes for incoming messages
	void Listen();
	// Listen thread handle
	HANDLE m_hListenThread = nullptr;
	// Structure passed to new TCP connection thread
	struct TTCPConnect
	{
		CLan* m_lan;
		u_long m_addr;
		SOCKET m_socket;
		LPVOID m_lpParameter;
	};
	// Launches accept procedure for TCP connections in new thread
	static void __cdecl AcceptTCPProc(void *lpParameter);
	// Accepts TCP connections
	void AcceptTCP();
	// Accept TCP thread handle
	HANDLE m_hAcceptTCPThread = nullptr;

	// Called when new income TCP connection is created
	static void __cdecl OnInTCPConnectionProc(void *lpParameter);
	// Called when new ougoing TCP connectio is created
	static void __cdecl OnOutTCPConnectionProc(void *lpParameter);

	// Stores retrieved host addresses
	in_addr m_hostAddr[MAX_INTERNAL_IP];
	// Current address count
	int m_hostAddrCount = 0;

	// Stores current host address
	in_addr m_curAddr;
	// Socket for income messages
	SOCKET m_income = INVALID_SOCKET;
	// Socket for income files
	SOCKET m_filesoc = INVALID_SOCKET;
	// Current status
	int m_status = LS_OK;
	// Current mode
	int m_mode = LM_OFF;
};

#endif //__lan_h__