aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/include/gnunet_server_lib.h10
-rw-r--r--src/util/server.c30
2 files changed, 40 insertions, 0 deletions
diff --git a/src/include/gnunet_server_lib.h b/src/include/gnunet_server_lib.h
index 3d8130c605..45da3efa28 100644
--- a/src/include/gnunet_server_lib.h
+++ b/src/include/gnunet_server_lib.h
@@ -326,6 +326,16 @@ GNUNET_SERVER_client_get_address (struct GNUNET_SERVER_Client *client,
/**
+ * Retrieve the unique id from the opaque defined GNUNET_SERVER_Client
+ *
+ * @param client the client
+ * @return the unique id
+ */
+uint64_t
+GNUNET_SERVER_client_get_id (struct GNUNET_SERVER_Client *client);
+
+
+/**
* Functions with this signature are called whenever a client
* is disconnected on the network level.
*
diff --git a/src/util/server.c b/src/util/server.c
index 31d298e3a2..ddbae44109 100644
--- a/src/util/server.c
+++ b/src/util/server.c
@@ -247,6 +247,11 @@ struct GNUNET_SERVER_Client
* Type of last message processed (for warn_no_receive_done).
*/
uint16_t warn_type;
+
+ /**
+ * unique identifier to distinguish between clients
+ */
+ uint64_t id;
};
@@ -933,6 +938,18 @@ client_message_tokenizer_callback (void *cls, void *client,
/**
+ * Get a unique identifier for each GNUNET_SERVER_Client
+ */
+static uint64_t
+get_client_id (void)
+{
+ static uint64_t id;
+
+ GNUNET_assert (id < ULONG_LONG_MAX);
+ return (id++);
+}
+
+/**
* Add a TCP socket-based connection to the set of handles managed by
* this server. Use this function for outgoing (P2P) connections that
* we initiated (and where this server should process incoming
@@ -963,6 +980,7 @@ GNUNET_SERVER_connect_socket (struct GNUNET_SERVER_Handle *server,
client->receive_pending = GNUNET_YES;
client->callback = NULL;
client->callback_cls = NULL;
+ client->id = get_client_id ();
GNUNET_CONNECTION_receive (client->connection,
GNUNET_SERVER_MAX_MESSAGE_SIZE - 1,
client->idle_timeout, &process_incoming, client);
@@ -1275,6 +1293,18 @@ GNUNET_SERVER_client_persist_ (struct GNUNET_SERVER_Client *client)
/**
+ * Retrieve the unique id from the opaque defined GNUNET_SERVER_Client
+ *
+ * @param client the client
+ * @return the unique id
+ */
+uint64_t
+GNUNET_SERVER_client_get_id (struct GNUNET_SERVER_Client *client)
+{
+ return client->id;
+}
+
+/**
* Resume receiving from this client, we are done processing the
* current request. This function must be called from within each
* GNUNET_SERVER_MessageCallback (or its respective continuations).