+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+
+int server_create ()
+{
+
+ int fd;
+ struct sockaddr_in saddr;
+
+ fd = socket (PF_INET, SOCK_STREAM, 0);
+
+ saddr.sin_family = AF_INET;
+ saddr.sin_port = htons (5222);
+ saddr.sin_addr.s_addr = INADDR_ANY;
+
+ bind (fd, (struct sockaddr*) &saddr, sizeof (struct sockaddr_in));
+
+ listen (fd, 5);
+
+ return fd;
+
+}
+
+int server_loop (int fd)
+{
+ int client;
+ struct sockaddr_in saddr;
+ socklen_t saddr_size;
+ saddr_size = sizeof (struct sockaddr_in);
+ client = accept (fd, (struct sockaddr*) &saddr, &saddr_size);
+ fprintf (stderr, "Accepted connection from %s:%d.\n",
+ inet_ntoa (saddr.sin_addr), ntohs (saddr.sin_port));
+ return client;
+}
+
+int client_create ()
+{
+
+ int fd;
+ struct sockaddr_in saddr;
+ struct hostent* host;
+
+ host = gethostbyname ("jabber.org");
+
+ fd = socket (PF_INET, SOCK_STREAM, 0);
+
+ saddr.sin_family = AF_INET;
+ saddr.sin_port = htons (5222);
+ saddr.sin_addr = *(struct in_addr*) host->h_addr;
+
+ if (connect (fd, (struct sockaddr*) &saddr, sizeof (struct sockaddr_in)) < 0)
+ {
+ fprintf (stderr, "%s\n", strerror (errno));
+ exit (1);
+ }
+ else
+ {
+ fprintf (stderr, "Connected to jabber.org:5222.\n");
+ }
+
+ return fd;
+
+}
+
+int client_loop (int client, int server)
+{
+
+ char buffer[256];
+ int r;
+
+ fd_set fds;
+
+ while (1)
+ {
+ FD_ZERO (&fds);
+ FD_SET (client, &fds);
+ FD_SET (server, &fds);
+ select (FD_SETSIZE, &fds, NULL, NULL, NULL);
+ if (FD_ISSET (client, &fds))
+ {
+ r = read (client, buffer, 256);
+ if (r <= 0)
+ {
+ close (client);
+ close (server);
+ return r;
+ }
+ write (server, buffer, r);
+ }
+ if (FD_ISSET (server, &fds))
+ {
+ r = read (server, buffer, 256);
+ if (r <= 0)
+ {
+ close (client);
+ close (server);
+ return r;
+ }
+ write (client, buffer, r);
+ }
+ }
+
+ return r;
+
+}
+
+int main ()
+{
+ int proxy;
+ int client;
+ int server;
+ proxy = server_create ();
+ client = server_loop (proxy);
+ server = client_create ();
+ if (client_loop (client, server) < 0)
+ {
+ fprintf (stderr, "%s\n", strerror (errno));
+ exit (1);
+ }
+ return 0;
+}