1
Network / TCP Client/Server Code - one client running much slower than the other
« on: December 06, 2014, 01:23:49 am »
I've been writing a simple TCP Client/Server game and while both clients can send/recieve data, the first client will always run at around half the FPS as the other. Here is the code:
Client update function that is ran each frame
And the server update function that is ran each frame also:
Can you see any problems with this? Thanks!
EDIT: I should say that both the client and server sockets are set too non-blocking.
Client update function that is ran each frame
(click to show/hide)
void Client::Update(Player* _player, Player* _player2)
{
sf::Vector2f tempPosition;
//If the player has been assigned a number by the server
if (_player->getPlayerNumber() == 0 || _player->getPlayerNumber() == 1)
{
//Load the send packet with the player's position
float sendX, sendY, recieveX, recieveY;
sendX = _player->getPosition().x;
sendY = _player->getPosition().y;
sendPacket << sendX << sendY;
//If the time between messages has been reached
if (time.asMilliseconds() >= 50)
{
//Send the packet
if (socket.send(sendPacket) != sf::Socket::Done)
{
//error...
}
else
{
sendPacket.clear();
}
//Reset the timer
time = sf::Time::Zero;
}
//Attempt to recieve data from the server each frame
if (socket.receive(recievePacket) != sf::Socket::Done)
{
//error...
}
else
{
recievePacket >> recieveX >> recieveY;
recievePacket.clear();
tempPosition.x = recieveX;
tempPosition.y = recieveY;
_player2->setGoalPosition(tempPosition);
}
//Increment the timer with delta time
time += deltaClock.getElapsedTime();
deltaClock.restart();
}
}
{
sf::Vector2f tempPosition;
//If the player has been assigned a number by the server
if (_player->getPlayerNumber() == 0 || _player->getPlayerNumber() == 1)
{
//Load the send packet with the player's position
float sendX, sendY, recieveX, recieveY;
sendX = _player->getPosition().x;
sendY = _player->getPosition().y;
sendPacket << sendX << sendY;
//If the time between messages has been reached
if (time.asMilliseconds() >= 50)
{
//Send the packet
if (socket.send(sendPacket) != sf::Socket::Done)
{
//error...
}
else
{
sendPacket.clear();
}
//Reset the timer
time = sf::Time::Zero;
}
//Attempt to recieve data from the server each frame
if (socket.receive(recievePacket) != sf::Socket::Done)
{
//error...
}
else
{
recievePacket >> recieveX >> recieveY;
recievePacket.clear();
tempPosition.x = recieveX;
tempPosition.y = recieveY;
_player2->setGoalPosition(tempPosition);
}
//Increment the timer with delta time
time += deltaClock.getElapsedTime();
deltaClock.restart();
}
}
And the server update function that is ran each frame also:
(click to show/hide)
void Server::updatePlayers()
{
//If both clients are connected
if (isClient0Connected && isClient1Connected)
{
//If the clients haven't been sent their initial positions
if (!player0Resolved || !player1Resolved)
{
//Send the client's their player number
int playerNumber = 0;
sendPacket0 << playerNumber;
clientSocket0.send(sendPacket0);
sendPacket0.clear();
player0Resolved = true;
playerNumber = 1;
sendPacket1 << playerNumber;
clientSocket1.send(sendPacket1);
sendPacket1.clear();
player1Resolved = true;
}
//Attempt to recieve data from the client's each frame
if (clientSocket0.receive(recievePacket0) != sf::Socket::Done)
{
dropTimer++;
}
else
{
recievePacket0 >> recieveX >> recieveY;
recievePacket0.clear();
player0LatestPos.x = recieveX;
player0LatestPos.y = recieveY;
}
if (clientSocket1.receive(recievePacket1) != sf::Socket::Done)
{
dropTimer++;
}
else
{
recievePacket1 >> recieveX2 >> recieveY2;
recievePacket1.clear();
player1LatestPos.x = recieveX2;
player1LatestPos.y = recieveY2;
}
//If the time between messages has been reached
if (time.asMilliseconds() >= 50)
{
//Send the clients the latest positional data from the other player
sendPacket0 << recieveX << recieveY;
clientSocket1.send(sendPacket0);
sendPacket0.clear();
sendPacket1 << recieveX2 << recieveY2;
clientSocket0.send(sendPacket1);
sendPacket1.clear();
dropTimer = 0;
time = sf::Time::Zero;
}
//Increment the timer
time += deltaClock.getElapsedTime();
deltaClock.restart();
}
}
{
//If both clients are connected
if (isClient0Connected && isClient1Connected)
{
//If the clients haven't been sent their initial positions
if (!player0Resolved || !player1Resolved)
{
//Send the client's their player number
int playerNumber = 0;
sendPacket0 << playerNumber;
clientSocket0.send(sendPacket0);
sendPacket0.clear();
player0Resolved = true;
playerNumber = 1;
sendPacket1 << playerNumber;
clientSocket1.send(sendPacket1);
sendPacket1.clear();
player1Resolved = true;
}
//Attempt to recieve data from the client's each frame
if (clientSocket0.receive(recievePacket0) != sf::Socket::Done)
{
dropTimer++;
}
else
{
recievePacket0 >> recieveX >> recieveY;
recievePacket0.clear();
player0LatestPos.x = recieveX;
player0LatestPos.y = recieveY;
}
if (clientSocket1.receive(recievePacket1) != sf::Socket::Done)
{
dropTimer++;
}
else
{
recievePacket1 >> recieveX2 >> recieveY2;
recievePacket1.clear();
player1LatestPos.x = recieveX2;
player1LatestPos.y = recieveY2;
}
//If the time between messages has been reached
if (time.asMilliseconds() >= 50)
{
//Send the clients the latest positional data from the other player
sendPacket0 << recieveX << recieveY;
clientSocket1.send(sendPacket0);
sendPacket0.clear();
sendPacket1 << recieveX2 << recieveY2;
clientSocket0.send(sendPacket1);
sendPacket1.clear();
dropTimer = 0;
time = sf::Time::Zero;
}
//Increment the timer
time += deltaClock.getElapsedTime();
deltaClock.restart();
}
}
Can you see any problems with this? Thanks!
EDIT: I should say that both the client and server sockets are set too non-blocking.