00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00024
00026
00028 #include <SFML/AdvancedNetwork/Server.hpp>
00029 #include <SFML/Network/IPAddress.hpp>
00030 #include <SFML/Network/Packet.hpp>
00031 #include <SFML/Network/SocketTCP.hpp>
00032
00033
00037 sfServer::~sfServer()
00038 {
00039
00040 Stop();
00041 }
00042
00043
00047 void sfServer::Start(unsigned int Port, std::size_t MaxClients)
00048 {
00049
00050 if (myIsRunning)
00051 Stop();
00052
00053
00054 myPort = Port;
00055 myMaxClients = MaxClients;
00056 myIsRunning = true;
00057
00058
00059 Launch();
00060 }
00061
00062
00066 void sfServer::Stop()
00067 {
00068
00069 myIsRunning = false;
00070
00071
00072 Wait();
00073 }
00074
00075
00079 void sfServer::SendTo(sfSocketTCP Client, sfPacket& Packet)
00080 {
00081
00082 if (!Client.Send(Packet))
00083 Disconnect(Client);
00084 }
00085
00086
00090 void sfServer::SendToAll(sfPacket& Packet, sfSocketTCP* Exclude)
00091 {
00092
00093 for (std::list<sfSocketTCP>::iterator i = myClients.begin(); i != myClients.end(); )
00094 {
00095 sfSocketTCP Client = *i++;
00096
00097 if (!Exclude || (Client != *Exclude))
00098 {
00099 if (!Client.Send(Packet))
00100 Disconnect(Client);
00101 }
00102 }
00103 }
00104
00105
00109 void sfServer::Disconnect(sfSocketTCP Client)
00110 {
00111
00112 mySelector.Remove(Client);
00113
00114
00115 myClients.remove(Client);
00116
00117
00118 OnClientDisconnected(Client);
00119
00120
00121 Client.Close();
00122 }
00123
00124
00128 void sfServer::Run()
00129 {
00130
00131 sfSocketTCP Listener;
00132
00133
00134 Listener.Listen(myPort);
00135
00136
00137 mySelector.Add(Listener);
00138
00139 std::vector<sfSocketTCP> Ready;
00140 while (myIsRunning)
00141 {
00142
00143 mySelector.GetSocketsReady(Ready);
00144
00145
00146 for (std::vector<sfSocketTCP>::iterator i = Ready.begin(); i != Ready.end(); ++i)
00147 {
00148 if (*i == Listener)
00149 {
00150
00151 sfIPAddress Address;
00152 sfSocketTCP NewClient = Listener.Accept(&Address);
00153
00154
00155 if (myClients.size() < myMaxClients)
00156 {
00157
00158 mySelector.Add(NewClient);
00159
00160
00161 OnClientConnected(Address, NewClient);
00162
00163
00164 myClients.push_back(NewClient);
00165 }
00166 else
00167 {
00168
00169 NewClient.Close();
00170 }
00171 }
00172 else
00173 {
00174
00175 sfPacket Packet;
00176 if (i->Receive(Packet))
00177 {
00178
00179 OnPacketReceived(*i, Packet);
00180 }
00181 else
00182 {
00183
00184 Disconnect(*i);
00185 }
00186 }
00187 }
00188 }
00189
00190
00191 for (std::list<sfSocketTCP>::iterator i = myClients.begin(); i != myClients.end(); ++i)
00192 i->Close();
00193
00194
00195 Listener.Close();
00196 }
00197
00198
00202 void sfServer::OnClientConnected(const sfIPAddress& Client, sfSocketTCP Socket)
00203 {
00204
00205 }
00206
00207
00211 void sfServer::OnPacketReceived(sfSocketTCP Socket, sfPacket& Packet)
00212 {
00213
00214 }
00215
00216
00220 void sfServer::OnClientDisconnected(sfSocketTCP Socket)
00221 {
00222
00223 }