1 /* Echo server (TCP blocking)
2  * Copyright (C) 2000-2003  David Helder
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13 
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA  02110-1301  USA
18  */
19 
20 
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include <glib.h>
25 #include <gnet.h>
26 
27 #include <signal.h>
28 
29 
30 static void normal_sig_int (int signum);
31 
32 static GTcpSocket* normal_server = NULL;
33 
34 
35 int
main(int argc,char ** argv)36 main(int argc, char** argv)
37 {
38   gint 	      port;
39   GTcpSocket* server;
40   GInetAddr*  addr;
41   gchar*      name;
42   GTcpSocket* client = NULL;
43   gchar       buffer[1024];
44   gsize       n;
45   GIOChannel* ioclient = NULL;
46   GIOError    error;
47 
48   gnet_init ();
49 
50   if (argc !=  2)
51     {
52       fprintf (stderr, "usage: echoserver <port> \n");
53       exit(EXIT_FAILURE);
54     }
55 
56   port = atoi(argv[argc - 1]);
57 
58   /* Create the server */
59   server = gnet_tcp_socket_server_new_with_port (port);
60   if (server == NULL)
61     {
62       fprintf (stderr, "Could not create server on port %d\n", port);
63       exit (EXIT_FAILURE);
64     }
65 
66   normal_server = server;
67   signal (SIGINT, normal_sig_int);
68 
69   /* Print the address */
70   addr = gnet_tcp_socket_get_local_inetaddr(server);
71   g_assert (addr);
72   name = gnet_inetaddr_get_canonical_name (addr);
73   g_assert (name);
74   port = gnet_inetaddr_get_port (addr);
75   g_print ("Normal echoserver running on %s:%d\n", name, port);
76   gnet_inetaddr_delete (addr);
77   g_free (name);
78 
79   while ((client = gnet_tcp_socket_server_accept (server)) != NULL)
80     {
81       /* Get IOChannel */
82       ioclient = gnet_tcp_socket_get_io_channel(client);
83       g_assert (ioclient);
84 
85       /* Print the address */
86       addr = gnet_tcp_socket_get_remote_inetaddr(client);
87       g_assert (addr);
88       name = gnet_inetaddr_get_canonical_name (addr);
89       g_assert (name);
90       port = gnet_inetaddr_get_port (addr);
91       g_print ("Accepted connection from %s:%d\n", name, port);
92 
93       while ((error = gnet_io_channel_readline(ioclient, buffer,
94 					       sizeof(buffer), &n))
95 	     == G_IO_ERROR_NONE && (n > 0))
96 	{
97 	  error = gnet_io_channel_writen(ioclient, buffer, n, &n);
98 	  if (error != G_IO_ERROR_NONE) break;
99 	  fwrite(buffer, n, 1, stdout);
100 	}
101 
102       if (error != G_IO_ERROR_NONE)
103       gnet_tcp_socket_delete (client);
104 
105       g_print ("Connection from %s:%d closed\n", name, port);
106 
107       gnet_inetaddr_delete (addr);
108       g_free (name);
109     }
110 
111   exit (EXIT_SUCCESS);
112   return 0;
113 }
114 
115 
116 static void
normal_sig_int(int signum)117 normal_sig_int (int signum)
118 {
119   gnet_tcp_socket_delete (normal_server);
120   exit (EXIT_FAILURE);
121 }
122 
123