--- /dev/null
+bin_PROGRAMS = server client
+
+server_SOURCES = server.cxx
+
+server_LDADD =
+
+client_SOURCES = client.cxx
+
+client_LDADD = \
+ $(top_builddir)/Lib/Bucket/libBucket.a \
+ $(top_builddir)/Lib/Misc/libMisc.a
+
+INCLUDES += \
+ -I$(top_builddir) \
+ -I$(top_builddir)/Lib \
+ -I$(top_builddir)/Tools/Lib \
+ -I$(top_builddir)/Tools/Construct
--- /dev/null
+/* remote_exec.c -- Written by Curtis Olson */
+/* -- for CSci 5502 */
+
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+#include <stdio.h>
+#include <stdlib.h> // atoi()
+#include <string.h> // bcopy()
+
+#include "remote_exec.h"
+
+char *determine_port(char *host);
+
+
+int make_socket (char *host, unsigned short int port) {
+ int sock;
+ struct sockaddr_in name;
+ struct hostent *hp;
+
+ // Create the socket.
+ sock = socket (PF_INET, SOCK_STREAM, 0);
+ if (sock < 0) {
+ perror ("socket");
+ exit (EXIT_FAILURE);
+ }
+
+ // specify address family
+ name.sin_family = AF_INET;
+
+ // get the hosts official name/info
+ hp = gethostbyname(host);
+
+ // Connect this socket to the host and the port specified on the
+ // command line
+ bcopy(hp->h_addr, &(name.sin_addr.s_addr), hp->h_length);
+ name.sin_port = htons(port);
+
+ if ( connect(sock, (struct sockaddr *) &name,
+ sizeof(struct sockaddr_in)) < 0 )
+ {
+ close(sock);
+ perror("Cannot connect to stream socket");
+ exit(-1);
+ }
+
+ return sock;
+}
+
+
+main(int argc, char *argv[]) {
+ int sock, len;
+ fd_set ready;
+ int port;
+ char message[256];
+
+ /* Check usage */
+ if ( argc < 3 ) {
+ printf("Usage: %s remote_machine port\n", argv[0]);
+ exit(1);
+ }
+
+ port = atoi(argv[2]);
+ sock = make_socket(argv[1], port);
+
+ /* build a command string from the argv[]'s */
+ strcpy(message, "hello world!\n");
+
+ /* send command and arguments to remote server */
+ if ( write(sock, message, sizeof(message)) < 0 ) {
+ perror("Cannot write to stream socket");
+ }
+
+ for ( ;; ) {
+ /* loop until remote program finishes */
+
+ FD_ZERO(&ready);
+ FD_SET(sock, &ready);
+
+ /* block until input from sock or stdin */
+ select(32, &ready, 0, 0, NULL);
+
+ if ( FD_ISSET(sock, &ready) ) {
+ /* input coming from socket */
+ if ( (len = read(sock, message, 1024)) > 0 ) {
+ write(1, message, len);
+ } else {
+ exit(0);
+ }
+ }
+ }
+ close(sock);
+}
--- /dev/null
+// remote_server.c -- Written by Curtis Olson
+// -- for CSci 5502
+
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <sys/socket.h> // bind
+#include <netinet/in.h>
+
+#include <unistd.h>
+
+#include <iostream>
+
+// #include <netdb.h>
+// #include <fcntl.h>
+// #include <stdio.h>
+
+
+#define MAXBUF 1024
+
+int make_socket (unsigned short int* port) {
+ int sock;
+ struct sockaddr_in name;
+ socklen_t length;
+
+ // Create the socket.
+ sock = socket (PF_INET, SOCK_STREAM, 0);
+ if (sock < 0) {
+ perror ("socket");
+ exit (EXIT_FAILURE);
+ }
+
+ // Give the socket a name.
+ name.sin_family = AF_INET;
+ name.sin_addr.s_addr = INADDR_ANY;
+ name.sin_port = 0 /* htons (port) */;
+ name.sin_addr.s_addr = htonl (INADDR_ANY);
+ if (bind (sock, (struct sockaddr *) &name, sizeof (name)) < 0) {
+ perror ("bind");
+ exit (EXIT_FAILURE);
+ }
+
+ // Find the assigned port number
+ length = sizeof(struct sockaddr_in);
+ if ( getsockname(sock, (struct sockaddr *) &name, &length) ) {
+ perror("Cannot get socket's port number");
+ }
+ *port = ntohs(name.sin_port);
+
+ return sock;
+}
+
+
+main() {
+ int sock, msgsock, length, pid;
+ fd_set ready;
+ short unsigned int port;
+ char buf[MAXBUF];
+
+ sock = make_socket( &port );
+
+ // Save the port number
+ // set_port( port );
+ cout << "socket is connected to port = " << port << endl;
+
+ /* Specify the maximum length of the connection queue */
+ listen(sock, 3);
+
+ for ( ;; ) {
+ FD_ZERO(&ready);
+ FD_SET(sock, &ready);
+
+ /* block until we get some input on sock */
+ select(32, &ready, 0, 0, NULL);
+
+ if ( FD_ISSET(sock, &ready) ) {
+ /* printf("%d %d Incomming message --> ", getpid(), pid); */
+
+ msgsock = accept(sock, 0, 0);
+
+ /* spawn a child */
+ pid = fork();
+
+ if ( pid < 0 ) {
+ /* error */
+ perror("Cannot fork child process");
+ exit(-1);
+ } else if ( pid > 0 ) {
+ /* This is the parent */
+ close(msgsock);
+ } else {
+ /* This is the child */
+
+ cout << "new process started to handle new connection" << endl;
+ // Read client's message
+ while ( (length = read(msgsock, buf, MAXBUF)) > 0) {
+ cout << "buffer length = " << length << endl;
+ buf[length] = '\0';
+ cout << "Incoming command -> " << buf;
+
+ // reply to the client
+ if ( write(sock, message, sizeof(message)) < 0 ) {
+ perror("Cannot write to stream socket");
+ }
+
+
+ }
+ cout << "process ended" << endl;
+ exit(0);
+ }
+ }
+ }
+}