Client.cpp

00001 
00002 //
00003 // SFML - Simple and Fast Multimedia Library
00004 // Copyright (C) 2007 Laurent Gomila (laurent.gom@gmail.com)
00005 //
00006 // This software is provided 'as-is', without any express or implied warranty.
00007 // In no event will the authors be held liable for any damages arising from the use of this software.
00008 //
00009 // Permission is granted to anyone to use this software for any purpose,
00010 // including commercial applications, and to alter it and redistribute it freely,
00011 // subject to the following restrictions:
00012 //
00013 // 1. The origin of this software must not be misrepresented;
00014 //    you must not claim that you wrote the original software.
00015 //    If you use this software in a product, an acknowledgment
00016 //    in the product documentation would be appreciated but is not required.
00017 //
00018 // 2. Altered source versions must be plainly marked as such,
00019 //    and must not be misrepresented as being the original software.
00020 //
00021 // 3. This notice may not be removed or altered from any source distribution.
00022 //
00024 
00026 // Headers
00028 #include <SFML/AdvancedNetwork/Client.hpp>
00029 #include <SFML/Network/Packet.hpp>
00030 
00031 
00035 sfClient::~sfClient()
00036 {
00037     // Disconnect the client
00038     Disconnect();
00039 }
00040 
00041 
00045 void sfClient::Connect(const sfIPAddress& Server, unsigned short Port)
00046 {
00047     // If client is already connected, disconnect it first
00048     if (myIsConnected)
00049         Disconnect();
00050 
00051     // Save the connection settings
00052     myServer      = Server;
00053     myPort        = Port;
00054     myIsConnected = true;
00055 
00056     // Launch the receiving loop in a separate thread
00057     Launch();
00058 }
00059 
00060 
00064 void sfClient::Disconnect()
00065 {
00066     // Clear the connection flag
00067     myIsConnected = false;
00068 
00069     // And wait for the receiving thread to finish
00070     Wait();
00071 }
00072 
00073 
00077 bool sfClient::IsConnected() const
00078 {
00079     return myIsConnected;
00080 }
00081 
00082 
00086 void sfClient::Run()
00087 {
00088     // Connect to the specified server
00089     if (!mySocket.Connect(myPort, myServer))
00090     {
00091         myIsConnected = false;
00092         return;
00093     }
00094 
00095     // Let the derived class do something useful
00096     OnServerConnected();
00097 
00098     // Loop while we are connected
00099     while (myIsConnected)
00100     {
00101         // Wait for an incoming packet
00102         sfPacket Packet;
00103         myIsConnected = mySocket.Receive(Packet);
00104 
00105         // Forward the received packet to the derived class
00106         if (myIsConnected)
00107             OnPacketReceived(Packet);
00108     }
00109 
00110     // Connection closed : notify the derived class
00111     OnServerDisconnected();
00112 
00113     // Properly close the socket
00114     mySocket.Close();
00115 }
00116 
00117 
00121 void sfClient::Send(sfPacket& Packet)
00122 {
00123     // If Send() failed, it means that we are no longer connected to the server
00124     if (!mySocket.Send(Packet))
00125         myIsConnected = false;
00126 }
00127 
00128 
00132 void sfClient::OnServerConnected()
00133 {
00134     // Does nothing by default
00135 }
00136 
00137 
00141 void sfClient::OnPacketReceived(sfPacket&)
00142 {
00143     // Does nothing by default
00144 }
00145 
00146 
00150 void sfClient::OnServerDisconnected()
00151 {
00152     // Does nothing by default
00153 }