raSystem  1.0 bata
raServer.cpp
Go to the documentation of this file.
1 #include "..\include\raMain.h"
2 
3 namespace System
4 {
5  int g_port;
7  {
8  }
9 
10  void raServerSocket::bind(int Port)
11  {
12  m_SocketAddress.sin_family = RA_INET;
13  m_SocketAddress.sin_port = Port;
14  m_SocketAddress.sin_addr.s_addr = INADDR_ANY;
15  g_port = Port;
16 
17  //Blockierender Aufruf!
18  ::bind(m_Socket, (SOCKADDR*) &m_SocketAddress,
19  sizeof(m_SocketAddress));
20  }
22  {
23  ::listen(m_Socket, SOMAXCONN);
24  }
26  {
27  Send(NULL, 0);
28  ::closesocket(m_Socket);
29  RINFO("Server gestoppt");
30  }
32  {
33  if(FD_ISSET(m_Socket, &fdSetRecv))
34  {
35  return (new raSocket(::accept(m_Socket, NULL, NULL)));
36  }
37  return NULL;
38  }
39  //--------------------------------------------------------
41  {
42  }
43 
45  {
46  free(m_ClientSockets);
47  }
48  void raServer::Setup(int Port, int MaxClients)
49  {
50  m_ClientSockets = (raSocket**)malloc(MaxClients*sizeof(m_ClientSockets));
51  m_MaxClients = MaxClients;
52 
53  for(int i = 0; i < MaxClients; i++)
54  {
55  m_ClientSockets[i] = NULL;
56  }
57 
58  m_ListenSocket.bind(Port);
59  m_ListenSocket.listen();
60  RINFO("Server gestartet.\n");
61 
62  OnSetup(Port, MaxClients);
63  }
65  {
66  m_ListenSocket.Stop();
67  }
68  int raServer::Loop(void)
69  {
70  raSocket::fdzero(false);
71  m_ListenSocket.fdset(false);
72 
73  for(int i=0; i < m_MaxClients; i++)
74  {
75  if(m_ClientSockets[i]) m_ClientSockets[i]->fdset(false);
76  }
77  raSocket::select(false);
78 
79  raSocket* pNewClient = m_ListenSocket.accept();
80  if(pNewClient != NULL)
81  {
82  OnClientConnect(pNewClient);
83  }
84 
85  raSocket::fdzero(true);
86  for(int i=0; i < m_MaxClients; i++)
87  {
88  if(m_ClientSockets[i]) m_ClientSockets[i]->fdset(true);
89  }
90  raSocket::select(true);
91 
92  for(int i=0; i < m_MaxClients; i++)
93  {
94  if(m_ClientSockets[i])
95  {
96  int iResult = m_ClientSockets[i]->Receive();
97 
98  if(iResult > 0)
99  {
100  raString Buffer = m_ClientSockets[i]->GetBuffer();
101 
102  OnRun(Buffer, iResult, i);
103  }
104  else if(iResult == 0) //Client beendet die Verbindung
105  {
106  OnClientDisconnect(m_ClientSockets[i], i);
107  SAFE_DELETE(m_ClientSockets[i]);
108  }
109  }
110  }
111  return 0;
112  }
113  bool raServer::SetNewClient(raSocket* Client, int index)
114  {
115  if(index > m_MaxClients) { RERROR_INVALIDVALUE("index"); return false; }
116  if(!Client) { RERROR_NULLPOINTER("Client");return false; }
117 
118  m_ClientSockets[index] = Client;
119  return true;
120  }
121 };
raServerSocket(void)
Definition: raServer.cpp:6
static void fdzero(bool write)
Definition: raSocket.cpp:50
bool SetNewClient(raSocket *Client, int index)
Definition: raServer.cpp:113
int g_port
Definition: raServer.cpp:5
void listen(void)
Definition: raServer.cpp:21
static void select(bool write)
Definition: raSocket.cpp:77
raSocket * accept(void)
Definition: raServer.cpp:31
raSocket(void)
Definition: raSocket.cpp:9
static FD_SET fdSetRecv
Definition: raSocket.h:34
void RAPI RERROR_INVALIDVALUE(raString x)
Definition: raMain.cpp:139
void RAPI RERROR_NULLPOINTER(raString x)
Definition: raMain.cpp:134
bool Send(LPCSTR Data, int Size)
Definition: raSocket.cpp:93
std::string raString
Definition: raMain.h:107
#define RA_INET
~raServer(void)
Definition: raServer.cpp:44
raServer(void)
Definition: raServer.cpp:40
void RAPI RINFO(raString x)
Definition: raMain.cpp:119
void bind(int Port)
Definition: raServer.cpp:10
int Loop(void)
Definition: raServer.cpp:68
void Stop(void)
Definition: raServer.cpp:25
#define SAFE_DELETE(p)
Definition: d3dxGlobal.h:26
SOCKET m_Socket
Definition: raSocket.h:30
sockaddr_in m_SocketAddress
Definition: raSocket.h:31
void Stop(void)
Definition: raServer.cpp:64
void Setup(int Port=28015, int MaxClients=10)
Definition: raServer.cpp:48