Me gustaría crear una aplicación de servidor y cliente que se comunique a través de sockets usando GIO. GSocketService y GSocketClient parecen ser perfectos para este propósito, pero desafortunadamente no pude encontrar algún tutorial o código de ejemplo (que un GLib, GIO, ... novato pueda entender). ¿Alguien sabe algunos recursos buenos o puede publicar código de ejemplo aquí?GIO socket-server/-client example
Respuesta
Finalmente logré crear un servidor simple y un cliente usando glib y gio.
Mi servidor tiene el siguiente aspecto:
#include <glib.h>
#include <gio/gio.h>
/* this function will get called everytime a client attempts to connect */
gboolean
incoming_callback (GSocketService *service,
GSocketConnection *connection,
GObject *source_object,
gpointer user_data)
{
g_print("Received Connection from client!\n");
GInputStream * istream = g_io_stream_get_input_stream (G_IO_STREAM (connection));
gchar message[1024];
g_input_stream_read (istream,
message,
1024,
NULL,
NULL);
g_print("Message was: \"%s\"\n", message);
return FALSE;
}
int
main (int argc, char **argv)
{
/* initialize glib */
g_type_init();
GError * error = NULL;
/* create the new socketservice */
GSocketService * service = g_socket_service_new();
/* connect to the port */
g_socket_listener_add_inet_port ((GSocketListener*)service,
1500, /* your port goes here */
NULL,
&error);
/* don't forget to check for errors */
if (error != NULL)
{
g_error (error->message);
}
/* listen to the 'incoming' signal */
g_signal_connect (service,
"incoming",
G_CALLBACK (incoming_callback),
NULL);
/* start the socket service */
g_socket_service_start (service);
/* enter mainloop */
g_print ("Waiting for client!\n");
GMainLoop *loop = g_main_loop_new(NULL, FALSE);
g_main_loop_run(loop);
return 0;
}
y este es el cliente correspondiente:
#include <glib.h>
#include <gio/gio.h>
int
main (int argc, char *argv[])
{
/* initialize glib */
g_type_init();
GError * error = NULL;
/* create a new connection */
GSocketConnection * connection = NULL;
GSocketClient * client = g_socket_client_new();
/* connect to the host */
connection = g_socket_client_connect_to_host (client,
(gchar*)"localhost",
1500, /* your port goes here */
NULL,
&error);
/* don't forget to check for errors */
if (error != NULL)
{
g_error (error->message);
}
else
{
g_print ("Connection successful!\n");
}
/* use the connection */
GInputStream * istream = g_io_stream_get_input_stream (G_IO_STREAM (connection));
GOutputStream * ostream = g_io_stream_get_output_stream (G_IO_STREAM (connection));
g_output_stream_write (ostream,
"Hello server!", /* your message goes here */
13, /* length of your message */
NULL,
&error);
/* don't forget to check for errors */
if (error != NULL)
{
g_error (error->message);
}
return 0;
}
en cuenta sin embargo, que aún soy nuevo en glib, Gio e incluso C, por lo que vuelva a comprobar mi código antes de usarlo
Gracias por compartir esto. Será un recurso invaluable para los recién llegados de GIO. La documentación de referencia es buena, pero faltan ejemplos. – noisebleed
@noisebleed: la misma opinión sobre la documentación aquí. – drakide
en realidad, puede usar un comando como "echo anyword | nc localhost 1500" como el cliente para testificar si el servidor funciona. – mxi1
La devolución de llamada de entrantes no debe bloquearse, de la documentación de gio: "El controlador debe iniciar el manejo de la conexión, pero no puede bloquear; en esencia, deben utilizarse operaciones asíncronas".
Tuve algún problema con la conexión en la versión asíncrona, tiene que ser referido por el usuario o la conexión se cerrará después de que regrese la devolución de llamada entrante.
un ejemplo completo de un servidor que no bloquea, basado en el ejemplo dado antes:
#include <gio/gio.h>
#include <glib.h>
#define BLOCK_SIZE 1024
#define PORT 2345
struct ConnData {
GSocketConnection *connection;
char message[BLOCK_SIZE];
};
void message_ready (GObject * source_object,
GAsyncResult *res,
gpointer user_data)
{
GInputStream *istream = G_INPUT_STREAM (source_object);
GError *error = NULL;
struct ConnData *data = user_data;
int count;
count = g_input_stream_read_finish (istream,
res,
&error);
if (count == -1) {
g_error ("Error when receiving message");
if (error != NULL) {
g_error ("%s", error->message);
g_clear_error (&error);
}
}
g_message ("Message was: \"%s\"\n", data->message);
g_object_unref (G_SOCKET_CONNECTION (data->connection));
g_free (data);
}
static gboolean
incoming_callback (GSocketService *service,
GSocketConnection * connection,
GObject * source_object,
gpointer user_data)
{
g_message ("Received Connection from client!\n");
GInputStream *istream = g_io_stream_get_input_stream (G_IO_STREAM (connection));
struct ConnData *data = g_new (struct ConnData, 1);
data->connection = g_object_ref (connection);
g_input_stream_read_async (istream,
data->message,
sizeof (data->message),
G_PRIORITY_DEFAULT,
NULL,
message_ready,
data);
return FALSE;
}
int main()
{
GSocketService *service;
GError *error = NULL;
gboolean ret;
service = g_socket_service_new();
ret = g_socket_listener_add_inet_port (G_SOCKET_LISTENER (service),
PORT, NULL, &error);
if (ret && error != NULL)
{
g_error ("%s", error->message);
g_clear_error (&error);
return 1;
}
g_signal_connect (service,
"incoming",
G_CALLBACK (incoming_callback),
NULL);
g_socket_service_start (service);
GMainLoop *loop = g_main_loop_new(NULL, FALSE);
g_main_loop_run(loop);
/* Stop service when out of the main loop*/
g_socket_service_stop (service);
return 0;
}
- 1. notifyDataSetChanged example
- 2. Explaining copy constructor example
- 3. AngularJS Test Example
- 4. small haskell libClang example?
- 5. AS3 Memory Leak Example
- 6. F # charting example
- 7. spring 3.1 @Cacheable example
- 8. Fastcall GCC example
- 9. Android Scroller simple example
- 10. JVM getObjectSize example
- 11. NSNotification userinfo example?
- 12. Python3 http.server POST example
- 13. .NET DDD Example
- 14. SQLAlchemy Example Projects
- 15. Sencha sqlite example
- 16. webview shouldinterceptrequest example
- 17. UIManagedDocument example/tutorial
- 18. Compass android example
- 19. javac.exe AST programmatic access example
- 20. Zend Framework 2 project example
- 21. Servicio real RESTful live example
- 22. sqlite example program en android
- 23. Json Schema Example for patternProperties
- 24. Land of Lisp example redundency?
- 25. ¿Cómo gzip @ font-face example?
- 26. F # Tail Recursive Function Example
- 27. Significado del error de aserción-CRÍTICO GLib-GIO
- 28. GTK + gio No existe el fichero o directorio
- 29. Seeking WCF Duplex "TwoWay" Subscribe + Callback Example
- 30. Basic Simple Asp.net + jQuery + JSON example
¿hizo algún progreso? Estoy buscando lo mismo. Además de la [API] (http://developer.gnome.org/gio/stable/highlevel-socket.html) y esta [SO answer] (http://stackoverflow.com/a/2145259/545442) No he podido Encontré algo. – noisebleed
@noisebleed: Sí, realmente hice progresos. De hecho, no entiendo por qué no pude crear servidor y cliente en mi primer intento. Probablemente no debería intentar aprender C, glib y OGRE al mismo tiempo. – drakide