Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/netserver.cc')
-rw-r--r--src/core/netserver.cc136
1 files changed, 69 insertions, 67 deletions
diff --git a/src/core/netserver.cc b/src/core/netserver.cc
index 83bbd6e..1ae928b 100644
--- a/src/core/netserver.cc
+++ b/src/core/netserver.cc
@@ -34,7 +34,7 @@
#include "core/zone.h"
#ifdef _WIN32
- typedef int socklen_t;
+typedef int socklen_t;
#endif
namespace core
@@ -56,13 +56,13 @@ NetServer::NetServer(std::string const host, unsigned int const port)
return;
}
-
+
// Get the local adress to bind to
netserver_addr.sin_family = AF_INET;
netserver_addr.sin_port = htons(port);
if (host.size()) {
netserver_addr.sin_addr.s_addr = inet_addr(host.c_str());
- if ( netserver_addr.sin_addr.s_addr == INADDR_NONE) {
+ if (netserver_addr.sin_addr.s_addr == INADDR_NONE) {
con_error << "Network invalid address " << host << "!" << std::endl;
return;
}
@@ -70,14 +70,14 @@ NetServer::NetServer(std::string const host, unsigned int const port)
netserver_addr.sin_addr.s_addr = htonl(INADDR_ANY);
}
memset(netserver_addr.sin_zero, '\0', sizeof(netserver_addr.sin_zero));
-
+
// bind the local address to the socket ( note the typecast)
if (::bind(netserver_fd, (struct sockaddr *) &netserver_addr, sizeof(struct sockaddr)) == -1) {
con_error << "Network can't bind to local address!" << std::endl;
//perror("bind");
return;
}
-
+
con_print << " listening on " << inet_ntoa(netserver_addr.sin_addr) << ":" << ntohs(netserver_addr.sin_port) << std::endl;
// add the listening socket to the file descriptor set
@@ -101,13 +101,13 @@ NetServer::~NetServer()
for (it = clients.begin(); it != clients.end(); it++) {
// notify the game server
- if ((*it)->state() == NetClient::Connected)
+ if ((*it)->state() == NetClient::Connected)
server()->player_disconnect((*it)->player());
(*it)->send_raw(netmsg);
(*it)->transmit();
-
- delete (*it);
+
+ delete(*it);
}
clients.clear();
@@ -120,7 +120,8 @@ NetServer::~NetServer()
}
}
-void NetServer::abort() {
+void NetServer::abort()
+{
netserver_error = true;
}
@@ -138,8 +139,8 @@ NetClient *NetServer::find_client(Player const *player)
// remove disconnected clients
void NetServer::reap()
{
- for (Clients:: iterator it = clients.begin(); it != clients.end(); ) {
- NetClient *client = *it;
+ for (Clients:: iterator it = clients.begin(); it != clients.end();) {
+ NetClient *client = *it;
if (client->client_timeout + NETTIMEOUT < application()->time()) {
// client timed out, send a disconnect
@@ -157,8 +158,8 @@ void NetServer::reap()
}
}
- if (client->error()) {
-
+ if (client->error()) {
+
// notify other clients
for (Clients::iterator cit = clients.begin(); cit != clients.end(); cit++) {
if ((*cit) != (*it)) {
@@ -172,13 +173,13 @@ void NetServer::reap()
}
// remove the client
- delete client;
+ delete client;
clients.erase(it++);
- } else {
+ } else {
++it;
}
- }
+ }
}
void NetServer::receive()
@@ -191,7 +192,7 @@ void NetServer::receive()
timeout.tv_usec = 2500;
fd_set readset = serverset;
- int nb = select(fd()+1, &readset, NULL, NULL, &timeout);
+ int nb = select(fd() + 1, &readset, NULL, NULL, &timeout);
if (nb == -1) {
#ifndef _WIN32
// ncurses needs SIGWINCH catched
@@ -204,13 +205,13 @@ void NetServer::receive()
return;
}
- if (nb && FD_ISSET(fd(), &readset)) {
+ if (nb && FD_ISSET(fd(), &readset)) {
// receive incoming data
struct sockaddr_in client_addr;
socklen_t client_addr_len = sizeof(client_addr);
memset(recbuf, '\0', sizeof(recbuf));
- ssize_t bytes_received = ::recvfrom(fd(), recbuf, FRAMESIZE-1, 0, (struct sockaddr *)&client_addr, &client_addr_len);
+ ssize_t bytes_received = ::recvfrom(fd(), recbuf, FRAMESIZE - 1, 0, (struct sockaddr *) & client_addr, &client_addr_len);
if (bytes_received == -1) {
con_error << "Network error on recvfrom()!" << std::endl;
this->abort();
@@ -221,19 +222,19 @@ void NetServer::receive()
Stats::network_bytes_received += bytes_received;
// originator
- std::string client_host (inet_ntoa(client_addr.sin_addr));
+ std::string client_host(inet_ntoa(client_addr.sin_addr));
unsigned int client_port = ntohs(client_addr.sin_port);
-
+
// get messages from clients
bool msg_received = false;
for (Clients::iterator it = clients.begin(); it != clients.end() && !msg_received; it++) {
NetClient *client = *it;
-
+
if ((client->host() == client_host) && (client->port() == (int) client_port)) {
// receive data
client->receive(recbuf);
-
+
// process parsed messages
while (client->has_messages()) {
std::string message;
@@ -253,7 +254,7 @@ void NetServer::receive()
if (client) {
// receive data
client->receive(recbuf);
-
+
// process parsed messages
while (client->has_messages()) {
std::string message;
@@ -264,7 +265,7 @@ void NetServer::receive()
}
}
-
+
// remove dead connections
reap();
}
@@ -286,7 +287,8 @@ NetClient * NetServer::client_connect(std::string const host, int const port)
return client;
}
-void NetServer::client_initialize(NetClient *client) {
+void NetServer::client_initialize(NetClient *client)
+{
// send welcome message
std::string welcome("^B");
@@ -328,12 +330,12 @@ void NetServer::client_frame(NetClient *client, unsigned long timestamp)
// send zone info
send_zone_update(client, zone);
-
+
// send entities in zone
- if (client->player()->zone()) {
+ if (client->player()->zone()) {
for (Zone::Content::iterator it = zone->content().begin(); it != zone->content().end(); it++) {
Entity *entity = (*it);
-
+
if (!entity->entity_destroyed) {
send_entity_create(client, entity);
}
@@ -345,25 +347,25 @@ void NetServer::client_frame(NetClient *client, unsigned long timestamp)
} else {
// send a server frame marker
send_frame_marker(client, timestamp);
-
+
// send updates for entities in the zone
for (Entity::Registry::iterator it = Entity::registry().begin(); it != Entity::registry().end(); it++) {
Entity *entity = (*it).second;
- if (entity->zone() == zone) {
+ if (entity->zone() == zone) {
if (entity->entity_destroyed) {
if (!entity->entity_created) {
send_entity_delete(client, entity);
}
} else if (entity->entity_created) {
send_entity_create(client, entity);
-
+
} else if (entity->oldzone()) {
// this entity has entered the zone
send_entity_create(client, entity);
-
- } else if (entity->dirty() && !(entity->flags() & Entity::Static) ) {
-
+
+ } else if (entity->dirty() && !(entity->flags() & Entity::Static)) {
+
// FIXME only within visual range
send_entity_update(client, entity);
}
@@ -408,7 +410,7 @@ void NetServer::frame(unsigned long timestamp)
client->transmit();
}
-
+
// clear dirty state
for (Clients::iterator it = clients.begin(); it != clients.end(); it++) {
NetClient *client = *it;
@@ -468,7 +470,7 @@ void NetServer::send_frame_marker(NetClient *client, unsigned long timestamp)
if (client->state() == NetClient::Connected) {
client->send_raw(msg.str());
}
-
+
}
// send a "ent" create entity message to all clients
@@ -533,7 +535,7 @@ void NetServer::send_player_update(NetClient *client)
{
std::ostringstream msg;
msg << "pif 0 ";
- client->player()->serialize_server_update(msg);
+ client->player()->serialize_server_update(msg);
msg << '\n';
client->send_raw(msg.str());
}
@@ -543,7 +545,7 @@ void NetServer::send_player_update(NetClient *client, Player *player)
{
std::ostringstream msg;
msg << "pif " << player->id() << ' ';
- player->serialize_short_server_update(msg);
+ player->serialize_short_server_update(msg);
msg << '\n';
client->send_raw(msg.str());
}
@@ -579,18 +581,18 @@ void NetServer::send_info_update(NetClient *client, Info *info)
* ping
* say <text>
* priv <player> <text>
- *
+ *
*/
-void NetServer::parse_incoming_message(NetClient *client, const std::string & message)
+void NetServer::parse_incoming_message(NetClient *client, const std::string & message)
{
if (!message.size())
return;
std::stringstream msgstream(message);
-
+
std::string command;
msgstream >> command;
-
+
// disconnect
if (command == "disconnect") {
client->abort();
@@ -621,7 +623,7 @@ void NetServer::parse_incoming_message(NetClient *client, const std::string & me
} else {
std::string message("Unknown client protocol version!");
con_print << client->host() << ":" << client->port() << " " << message << std::endl;
-
+
send_message(client, "info", message);
send_disconnect(client);
}
@@ -662,8 +664,8 @@ void NetServer::parse_incoming_message(NetClient *client, const std::string & me
// cmd
if (command == "cmd") {
- if (message.size() > command.size()+1) {
- std::string cmdline(message.substr(command.size()+1));
+ if (message.size() > command.size() + 1) {
+ std::string cmdline(message.substr(command.size() + 1));
server()->exec(client->player(), cmdline);
}
return;
@@ -672,9 +674,9 @@ void NetServer::parse_incoming_message(NetClient *client, const std::string & me
if (command == "inf") {
std::string n;
char c;
-
- while ( (msgstream.get(c)) && (c != '"'));
- while ( (msgstream.get(c)) && (c != '"'))
+
+ while ((msgstream.get(c)) && (c != '"'));
+ while ((msgstream.get(c)) && (c != '"'))
n += c;
if (n.size()) {
@@ -687,21 +689,21 @@ void NetServer::parse_incoming_message(NetClient *client, const std::string & me
}
if (command == "rcon") {
- if ((message.size() > command.size()+1) && Cvar::sv_password->str().size()) {
+ if ((message.size() > command.size() + 1) && Cvar::sv_password->str().size()) {
if ((Cvar::sv_password->str().compare(client->player()->rconpassword()) == 0)) {
- con_print << "^B" << client->player()->name() << "^F rcon: " << message.substr(command.size()+1) << std::endl;
-
+ con_print << "^B" << client->player()->name() << "^F rcon: " << message.substr(command.size() + 1) << std::endl;
+
core::CommandBuffer::exec();
core::console()->set_rcon(true);
-
- core::cmd() << message.substr(command.size()+1) << "\n";
+
+ core::cmd() << message.substr(command.size() + 1) << "\n";
core::CommandBuffer::exec();
-
- while(console()->rconbuf().size()) {
+
+ while (console()->rconbuf().size()) {
send_message(client, "rcon", (*console()->rconbuf().begin()));
core::console()->rconbuf().pop_front();
}
-
+
// disable rcon buffering
console()->set_rcon(false);
@@ -711,7 +713,7 @@ void NetServer::parse_incoming_message(NetClient *client, const std::string & me
}
}
return;
-
+
}
// cup - client update entity
if (command == "cup") {
@@ -722,13 +724,13 @@ void NetServer::parse_incoming_message(NetClient *client, const std::string & me
if (!entity) {
con_warn << client->host() << ":" << client->port() << " update for unknown entity " << id << "\n";
return;
- }
+ }
if (entity->type() != Entity::Controlable) {
con_warn << client->host() << ":" << client->port() << " update for non-controlable entity " << id << "\n";
return;
}
-
+
EntityControlable *entitycontrolable = (EntityControlable *)entity;
if (entitycontrolable->owner() != client->player()) {
@@ -737,27 +739,27 @@ void NetServer::parse_incoming_message(NetClient *client, const std::string & me
}
entitycontrolable->set_dirty(true);
- entitycontrolable->receive_client_update(msgstream);
+ entitycontrolable->receive_client_update(msgstream);
}
return;
}
// say
- if (command == "say") {
- if (message.size() > command.size()+1) {
- server()->say(client->player(), message.substr(command.size()+1));
+ if (command == "say") {
+ if (message.size() > command.size() + 1) {
+ server()->say(client->player(), message.substr(command.size() + 1));
}
return;
}
// priv
if (command == "priv") {
- if (message.size() > command.size()+1) {
- server()->private_message(client->player(), message.substr(command.size()+1));
+ if (message.size() > command.size() + 1) {
+ server()->private_message(client->player(), message.substr(command.size() + 1));
}
return;
}
-
+
}
}