GSocket is done.
authorSamuel Cormier-Iijima <sciyoshi@gmail.com>
Thu, 28 Feb 2008 08:36:14 +0000 (03:36 -0500)
committerSamuel Cormier-Iijima <sciyoshi@gmail.com>
Thu, 28 Feb 2008 08:36:14 +0000 (03:36 -0500)
gnio/gsocket.c
test/test-client.c
test/test-server.c

index 1a095ef..9f9a5ac 100644 (file)
@@ -255,7 +255,7 @@ g_socket_new (GSocketDomain domain, GSocketType type, const gchar *protocol, GEr
       return NULL;
     }
 
-  return G_SOCKET (g_object_new (G_TYPE_SOCKET, "fd", fd, NULL));
+  return G_SOCKET (g_object_new (G_TYPE_SOCKET, "fd", fd, "blocking", TRUE, NULL));
 }
 
 GSocket *
@@ -267,9 +267,9 @@ g_socket_new_from_fd (gint fd)
   if ((arg = fcntl (fd, F_GETFL, NULL)) < 0)
     g_warning ("Error getting socket status flags: %s", g_strerror (errno));
 
-  blocking = ((arg & O_NONBLOCK) != 0);
+  blocking = ((arg & O_NONBLOCK) == 0);
 
-  return G_SOCKET (g_object_new (G_TYPE_SOCKET, "blocking", blocking, "fd", fd, NULL));
+  return G_SOCKET (g_object_new (G_TYPE_SOCKET, "fd", fd, "blocking", blocking, NULL));
 }
 
 void
@@ -304,7 +304,7 @@ g_socket_get_local_address (GSocket  *socket,
                             GError  **error)
 {
   gchar buffer[256];
-  gsize len;
+  gsize len = 256;
 
   g_return_val_if_fail (G_IS_SOCKET (socket), NULL);
 
@@ -325,7 +325,7 @@ g_socket_get_remote_address (GSocket  *socket,
                              GError  **error)
 {
   gchar buffer[256];
-  gsize len;
+  gsize len = 256;
 
   g_return_val_if_fail (G_IS_SOCKET (socket), NULL);
 
@@ -416,3 +416,41 @@ g_socket_connect (GSocket         *socket,
 
   return TRUE;
 }
+
+gssize
+g_socket_receive (GSocket       *socket,
+                  gchar         *buffer,
+                  gsize          size,
+                  GError       **error)
+{
+  gssize ret;
+
+  g_return_val_if_fail (G_IS_SOCKET (socket) && buffer != NULL, FALSE);
+
+  if ((ret = recv (socket->priv->fd, buffer, size, 0)) < 0)
+    {
+      g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errno), "error receiving data: %s", g_strerror (errno));
+      return -1;
+    }
+
+  return ret;
+}
+
+gssize
+g_socket_send (GSocket       *socket,
+               gchar         *buffer,
+               gsize          size,
+               GError       **error)
+{
+  gssize ret;
+
+  g_return_val_if_fail (G_IS_SOCKET (socket) && buffer != NULL, FALSE);
+
+  if ((ret = send (socket->priv->fd, buffer, size, 0)) < 0)
+    {
+      g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errno), "error receiving data: %s", g_strerror (errno));
+      return -1;
+    }
+
+  return ret;
+}
index 7967aef..62572b3 100644 (file)
@@ -26,6 +26,7 @@ accept_callback (GSocket *socket, GAsyncResult *result, gpointer data)
 int main (int argc, char *argv[])
 {
        GSocket *socket;
+       GSocketAddress *address;
 
        g_thread_init (NULL);
 
@@ -39,7 +40,9 @@ int main (int argc, char *argv[])
 
        g_socket_connect (socket, G_SOCKET_ADDRESS (g_inet_socket_address_new (G_INET_ADDRESS (g_inet4_address_from_string ("127.0.0.1")), 31882)), NULL);
 
-       g_printf ("connected!\n");
+       address = g_socket_get_local_address (socket, NULL);
+
+       g_printf ("connected, local socket is %s:%d\n", g_inet_address_to_string (g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (address))), g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (address)));
 
        g_main_loop_run (loop);
 
index 8121cc0..71c7bb1 100644 (file)
@@ -3,8 +3,8 @@
 #include <gnio/ginetsocketaddress.h>
 #include <gnio/ginet4address.h>
 #include <glib.h>
-#include <glib/gprintf.h>
 #include <sys/socket.h>
+#include <errno.h>
 
 GMainLoop *loop;
 
@@ -42,7 +42,7 @@ accept_callback (GSocket *socket, GAsyncResult *result, gpointer data)
        if (!address)
                g_error (error->message);
 
-       g_printf ("got a new connection from %s:%d\n", g_inet_address_to_string (g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (address))), g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (address)));
+       g_print ("got a new connection from %s:%d\n", g_inet_address_to_string (g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (address))), g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (address)));
 
        g_idle_add (accept_source, (gpointer) socket);
 }
@@ -62,26 +62,55 @@ int main (int argc, char *argv[])
 
        socket = g_socket_new (G_SOCKET_DOMAIN_INET, G_SOCKET_TYPE_STREAM, NULL, NULL);
 
-       if (!g_socket_bind (socket, G_SOCKET_ADDRESS (g_inet_socket_address_new (G_INET_ADDRESS (g_inet4_address_from_string ("127.0.0.1")), 31882)), &error))
+       if (!g_socket_bind (socket, G_SOCKET_ADDRESS (g_inet_socket_address_new (G_INET_ADDRESS (g_inet4_address_from_string ("127.0.0.1")), 31882)), &error)) {
                g_error (error->message);
+               return 0;
+       }
 
        g_socket_listen (socket, 10);
 
-       g_printf ("listening on port 31882...\n");
+       g_print ("listening on port 31882...\n");
 
-       new_socket = g_socket_accept (socket, NULL);
+       new_socket = g_socket_accept (socket, &error);
 
-       if (!new_socket)
+       if (!new_socket) {
                g_error (error->message);
+               return 0;
+       }
 
        address = g_socket_get_remote_address (new_socket, &error);
 
-       if (!address)
+       if (!address) {
                g_error (error->message);
+               return 0;
+       }
+
+       g_print ("got a new connection from %s:%d\n", g_inet_address_to_string (g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (address))), g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (address)));
+
+       while (TRUE) {
+               gchar buffer[128] = { };
+               gssize size;
+
+               if ((size = g_socket_receive (new_socket, buffer, 128, &error)) < 0) {
+                       g_error (error->message);
+                       return 0;
+               }
+
+               if (size == 0)
+                       break;
+
+               g_print ("received %d bytes of data: %s\n", size, buffer);
+
+               if ((size = g_socket_send (new_socket, buffer, size, &error)) < 0) {
+                       g_error (error->message);
+                       return 0;
+               }
 
-       g_printf ("got a new connection from %s:%d\n", g_inet_address_to_string (g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (address))), g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (address)));
+               if (size == 0)
+                       break;
+       }
 
-       g_main_loop_run (loop);
+       g_print ("connection closed\n");
 
        return 0;
 }