Browse Source

*** empty log message ***

Dave Schuyler 24 years ago
parent
commit
df5c57b73c

+ 39 - 148
direct/src/directd/directd.cxx

@@ -147,31 +147,8 @@ DirectD::~DirectD() {
   cerr<<"DirectD dtor"<<endl;
 }
 
-
-
-DirectDServer::DirectDServer() {
-}
-
-DirectDServer::~DirectDServer() {
-}
-
-
-
-DirectDClient::DirectDClient() {
-}
-
-DirectDClient::~DirectDClient() {
-}
-
-void
-DirectDClient::handle_command(const string& cmd) {
-  if (_verbose) {
-    cerr<<"command: "<<cmd<<endl;
-  }
-}
-
 int 
-DirectD::client_is_ready(const string& client_host, int port) {
+DirectD::client_ready(const string& client_host, int port) {
   connect_to(client_host, port);
   send_command("s");
   disconnect_from(client_host, port);
@@ -206,7 +183,8 @@ DirectD::wait_for_servers(int count, int timeout_ms) {
         //handle_datagram(datagram);
         DatagramIterator di(datagram);
         string s=di.get_string();
-        if (s=="r" && --count) {
+        cerr<<"wait_for_servers() count="<<count<<", s="<<s<<endl;
+        if (s=="r" && !--count) {
           return true;
         }
       }
@@ -221,38 +199,17 @@ DirectD::wait_for_servers(int count, int timeout_ms) {
 }
 
 int 
-DirectD::server_is_ready(const string& client_host, int port) {
-  connect_to(client_host, port);
-  send_command("r");
-  disconnect_from(client_host, port);
+DirectD::server_ready(const string& client_host, int port) {
+  send_one_message(client_host, port, "r");
   return 0;
 }
 
-void
-DirectD::set_host_name(const string& host_name) {
-  _host_name=host_name;
-}
-
-void
-DirectD::set_port(int port) {
-  _port=port;
-}
-
-void
-DirectD::send_start_app(const string& cmd) {
-  
-}
 
 void
 DirectD::start_app(const string& cmd) {
   _app_pid=StartApp(cmd);
 }
 
-void
-DirectD::send_kill_app(const string& cmd) {
-  
-}
-
 void
 DirectD::kill_app() {
   if (_app_pid) {
@@ -272,29 +229,6 @@ DirectD::send_command(const string& cmd) {
   }
 }
 
-void
-DirectD::cli_command(const string& cmd) {
-  cerr<<"command "<<cmd<<endl;
-  if (cmd[0]=='!') {
-    // ...connect to host.
-    cerr<<"Local command "<<flush;
-    string code;
-    cin >> code;
-    string host;
-    cin >> host;
-    int port;
-    cin >> port;
-    cerr<<"connect ("<<code<<") to "<<host<<" port "<<port<<endl;
-    connect_to(host, port);
-  } else {
-    send_command(cmd);
-    if (cmd[0] == 'q' && cmd.size()==1) {
-      // ...user entered quit command.
-      exit(0);
-    }
-  }
-}
-
 void
 DirectD::handle_datagram(NetDatagram& datagram){
   DatagramIterator di(datagram);
@@ -307,47 +241,38 @@ DirectD::handle_command(const string& cmd) {
   if (_verbose) {
     cerr<<"command: "<<cmd<<endl;
   }
-  if (cmd.size()==1) {
-    switch (cmd[0]) {
-    case 's': {
-      string c;
-      read_command(c);
-      start_app(c);
-      }
-      break;
-    case 'k':
-      kill_app();
-      break;
-    case 'q':
-      _shutdown=true;
-      break;
-    default:
-      cerr<<"unknown command: "<<cmd<<endl;
-    }
-  } else {
-    start_app(cmd);
-  }
 }
 
 void
-DirectD::read_command(string& cmd) {
-  try {
-    ifstream f;
-    f.open("directdCommand", ios::in | ios::binary);
-    stringstream ss;
-    const buf_size=512;
-    char buf[buf_size];
-    f.getline(buf, buf_size);
-    if (f.gcount() > 0) {
-      cmd = buf;
-      cerr<<"read_command "<<cmd<<endl;
-    }
-    f.close();
-  } catch (...) {
-    // This could be bad, I suppose.  But we're going to throw out
-    // any exceptions that happen during the above read.
-    cerr<<"DirectD::read_command() exception."<<endl;
+DirectD::send_one_message(const string& host_name, 
+    int port,
+    const string& message) {
+  NetAddress host;
+  if (!host.set_host(host_name, port)) {
+    nout << "Unknown host: " << host_name << "\n";
+  }
+
+  const int timeout_ms=5000;
+  PT(Connection) c = _cm.open_TCP_client_connection(host, timeout_ms);
+  if (c.is_null()) {
+    nout << "No connection.\n";
+    return;
   }
+
+  nout << "Successfully opened TCP connection to " << host_name
+       << " on port "
+       << c->get_address().get_port() << " and IP "
+       << c->get_address() << "\n";
+
+  //_reader.add_connection(c);
+  
+  NetDatagram datagram;
+  datagram.add_string(message);
+  _writer.send(datagram, c);
+  
+  //PR_Sleep(PR_MillisecondsToInterval(200));
+  //_reader.remove_connection(c);
+  _cm.close_connection(c);
 }
 
 void
@@ -361,7 +286,7 @@ DirectD::connect_to(const string& host_name, int port) {
   PT(Connection) c = _cm.open_TCP_client_connection(host, timeout_ms);
   if (c.is_null()) {
     nout << "No connection.\n";
-    exit(1);
+    return;
   }
 
   nout << "Successfully opened TCP connection to " << host_name
@@ -375,11 +300,13 @@ DirectD::connect_to(const string& host_name, int port) {
 
 void
 DirectD::disconnect_from(const string& host_name, int port) {
+  nout<<"disconnect_from(\""<<host_name<<", port="<<port<<")"<<endl;
   for (ConnectionSet::iterator i=_connections.begin(); i != _connections.end(); ++i) {
-    if ((*i)->get_address().get_ip_string()==host_name 
-        && (*i)->get_address().get_port()==port) {
-      _cm.close_connection((*i));
+    nout<<"    found "<<(*i)->get_address().get_ip_string()<<", port "<<(*i)->get_address().get_port()<<endl;
+    if ((*i)->get_address().get_ip_string()==host_name) {
+      nout<<"    disconnecting."<<endl;
       _reader.remove_connection((*i));
+      _cm.close_connection((*i));
       _connections.erase(i);
       break;
     }
@@ -445,39 +372,3 @@ DirectD::check_for_new_clients() {
     }
   }
 }
-
-void
-DirectD::run_server() {
-  if (_verbose) cerr<<"server"<<endl;
-  
-  listen_to(_port);
-
-  while (1) {
-    check_for_new_clients();
-    check_for_lost_connection();
-    check_for_datagrams();
-
-    // Yield the timeslice before we poll again.
-    PR_Sleep(PR_MillisecondsToInterval(200));
-  }
-}
-
-void
-DirectD::run_client() {
-  if (_verbose) {
-    cerr<<"client"<<endl;
-  }
-  
-  connect_to(_host_name, _port);
-
-  while (!cin.fail() && _connections.size()!=0) {
-    cout << "directd send: " << flush;
-    string d;
-    cin >> d;
-    cli_command(d);
-
-    check_for_lost_connection();
-    check_for_datagrams();
-  }
-  nout << "Exiting\n";
-}

+ 25 - 67
direct/src/directd/directd.h

@@ -16,17 +16,6 @@
 //
 ////////////////////////////////////////////////////////////////////
 
-
-
-
-
-// This is a work in progress, if  you have any questions, ask skyler.
-
-
-
-
-
-
 #include <process.h>
 #include <Windows.h>
 #include "pandabase.h"
@@ -42,31 +31,21 @@ typedef int intptr_t;
 #endif //]
 
 
-/*
-    DirectD is a client/server app for starting panda/direct.
-    
-    Usage:
-    DirectD is both the client and the server, what it does depends on
-    which command line argumenta are given at startup.
-    
-    Start a directd server on each of the machines you which to start
-    panda on.
-    
-    Start a directd client on the controlling machine or import
-    ShowBaseGlobal with the xxxxx flag in your Configrc.  The client 
-    will connact each of the servers in the xxxxx list in your Configrc.
-*/
+// Description: DirectD is a client/server app for starting panda/direct.
+//              
+//              Usage:
+//              Start a directd server on each of the machines you
+//              which to start panda on.
+//              
+//              Start a directd client on the controlling machine or 
+//              import ShowBaseGlobal with the xxxxx flag in your
+//              Configrc.  The client will connact each of the servers 
+//              in the xxxxx list in your Configrc.
 class EXPCL_DIRECT DirectD {
 PUBLISHED:
   DirectD();
   ~DirectD();
   
-  // Description: Call connect_to from client for each server.
-  void connect_to(const string& server_host, int port);
-  
-  // Description: 
-  void disconnect_from(const string& server_host, int port);
-  
   // Description: Call listen_to in the server.
   //              port is a rendezvous port.
   //              
@@ -74,44 +53,40 @@ PUBLISHED:
   //              before you handle them.  Consider setting backlog to
   //              the count you send to wait_for_servers(); or higher.
   void listen_to(int port, int backlog=8);
-  
-  // Description: process command string.
-  void send_command(const string& cmd);
 
   // Description: Call this function from the client when
   //              import ShowbaseGlobal is nearly finished.
-  int client_is_ready(const string& client_host, int port);
+  int client_ready(const string& client_host, int port);
 
   // Description: Call this function from the client after
-  //              calling <count> client_is_ready() calls.
+  //              calling <count> client_ready() calls.
   //              
   //              Call listen_to(port) prior to calling
   //              wait_for_servers() (or better yet, prior
-  //              to calling client_is_ready()).
+  //              to calling client_ready()).
   bool wait_for_servers(int count, int timeout_ms);
 
   // Description: Call this function from the server when
   //              import ShowbaseGlobal is nearly finished.
-  int server_is_ready(const string& client_host, int port);
+  int server_ready(const string& client_host, int port);
+  
+  // Description: Call connect_to from client for each server.
+  void connect_to(const string& server_host, int port);
+  
+  // Description: 
+  void disconnect_from(const string& server_host, int port);
+  
+  // Description: process command string.
+  void send_command(const string& cmd);
 
 public:
-  void set_host_name(const string& host_name);
-  void set_port(int port);
   void spawn_background_server();
-  
-  void run_server();
-  void run_client();
-  
-  void send_start_app(const string& cmd);
   void start_app(const string& cmd);
-  
-  void send_kill_app(const string& pid);
   void kill_app();
-  
-  void cli_command(const string& cmd);
   void handle_command(const string& cmd);
-  
   void handle_datagram(NetDatagram& datagram);
+  void send_one_message(const string& host_name, 
+      int port, const string& message);
 
 protected:
   QueuedConnectionManager _cm;
@@ -131,21 +106,4 @@ protected:
   void check_for_new_clients();
   void check_for_datagrams();
   void check_for_lost_connection();
-  
-  void read_command(string& cmd);
-};
-
-class EXPCL_DIRECT DirectDServer: public DirectD {
-public:
-  DirectDServer();
-  ~DirectDServer();
-};
-
-class EXPCL_DIRECT DirectDClient: public DirectD {
-public:
-  DirectDClient();
-  ~DirectDClient();
-
-  void handle_command(const string& cmd);
 };
-

+ 11 - 1
direct/src/directdServer/Sources.pp

@@ -14,6 +14,16 @@
   #define OTHER_LIBS $[OTHER_LIBS] pystub
 
   #define SOURCES \
-    directdServer.cxx
+    directdServer.cxx directdServer.h
 
 #end bin_target
+
+#begin test_bin_target
+  #define TARGET directdClient
+  #define LOCAL_LIBS directd
+  #define OTHER_LIBS $[OTHER_LIBS] pystub
+
+  #define SOURCES \
+    directdClient.cxx directdClient.h
+
+#end test_bin_target

+ 92 - 0
direct/src/directdServer/directdClient.cxx

@@ -0,0 +1,92 @@
+// Filename: directdClient.cxx
+// Created by:  skyler 2002.04.08
+//
+////////////////////////////////////////////////////////////////////
+//
+// PANDA 3D SOFTWARE
+// Copyright (c) 2001, Disney Enterprises, Inc.  All rights reserved
+//
+// All use of this software is subject to the terms of the Panda 3d
+// Software license.  You should have received a copy of this license
+// along with this source code; you will also find a current copy of
+// the license at http://www.panda3d.org/license.txt .
+//
+// To contact the maintainers of this program write to
+// [email protected] .
+//
+////////////////////////////////////////////////////////////////////
+
+#include "directdClient.h"
+
+DirectDClient::DirectDClient() {
+}
+
+DirectDClient::~DirectDClient() {
+}
+
+void
+DirectDClient::cli_command(const string& cmd) {
+  cerr<<"command "<<cmd<<endl;
+  if (cmd[0]=='!') {
+    // ...connect to host.
+    cerr<<"Local command "<<flush;
+    string code;
+    cin >> code;
+    string host;
+    cin >> host;
+    int port;
+    cin >> port;
+    cerr<<"connect ("<<code<<") to "<<host<<" port "<<port<<endl;
+    connect_to(host, port);
+  } else {
+    send_command(cmd);
+    if (cmd[0] == 'q' && cmd.size()==1) {
+      // ...user entered quit command.
+      exit(0);
+    }
+  }
+}
+
+void
+DirectDClient::run_client(const string& host, int port) {
+  if (_verbose) {
+    cerr<<"client"<<endl;
+  }
+  
+  connect_to(host, port);
+
+  while (!cin.fail() && _connections.size()!=0) {
+    cout << "directd send: " << flush;
+    string d;
+    cin >> d;
+    cli_command(d);
+
+    check_for_lost_connection();
+    check_for_datagrams();
+  }
+  nout << "Exiting\n";
+}
+
+int
+main(int argc, char *argv[]) {
+  if (argc > 1 && strcmp(argv[1], "--help")==0) {
+    cerr<<"directd [[<host>] <port>]\n"
+    "    host      default localhost\n"
+    "    port      default 8001\n";
+    return 1;
+  }
+
+  cerr<<"directdClient"<<endl;
+  string host="localhost";
+  int port=8001;
+  if (argc >= 3) {
+    host=argv[argc-2];
+  }
+  if (argc > 1) {
+    port=(atoi(argv[argc-1]));
+  }
+  DirectDClient directd;
+  directd.run_client(port);
+  
+  return 0;
+}

+ 32 - 0
direct/src/directdServer/directdClient.h

@@ -0,0 +1,32 @@
+// Filename: directdClient.h
+// Created by:  skyler 2002.04.08
+//
+////////////////////////////////////////////////////////////////////
+//
+// PANDA 3D SOFTWARE
+// Copyright (c) 2001, Disney Enterprises, Inc.  All rights reserved
+//
+// All use of this software is subject to the terms of the Panda 3d
+// Software license.  You should have received a copy of this license
+// along with this source code; you will also find a current copy of
+// the license at http://www.panda3d.org/license.txt .
+//
+// To contact the maintainers of this program write to
+// [email protected] .
+//
+////////////////////////////////////////////////////////////////////
+
+#include "directd.h"
+
+// Description: DirectDClient is a test app for DriectDServer.
+class EXPCL_DIRECT DirectDClient: public DirectD {
+public:
+  DirectDClient();
+  ~DirectDClient();
+
+  void run_client(const string& host, int port);
+
+protected:
+  void cli_command(const string& cmd);
+};
+

+ 1 - 0
direct/src/directdServer/directdCommand

@@ -0,0 +1 @@
+bash calc

+ 78 - 26
direct/src/directdServer/directdServer.cxx

@@ -1,6 +1,5 @@
-// Filename: directd.cxx
+// Filename: directdServer.cxx
 // Created by:  skyler 2002.04.08
-// Based on test_tcp_*.* by drose.
 //
 ////////////////////////////////////////////////////////////////////
 //
@@ -17,40 +16,93 @@
 //
 ////////////////////////////////////////////////////////////////////
 
-#include "directd.h"
+#include "directdServer.h"
+
+DirectDServer::DirectDServer() {
+}
+
+DirectDServer::~DirectDServer() {
+}
+
+void
+DirectDServer::handle_command(const string& cmd) {
+  if (_verbose) {
+    cerr<<"command: "<<cmd<<endl;
+  }
+  if (cmd.size()==1) {
+    switch (cmd[0]) {
+    case 's': {
+      string c;
+      read_command(c);
+      start_app(c);
+      }
+      break;
+    case 'k':
+      kill_app();
+      break;
+    case 'q':
+      _shutdown=true;
+      break;
+    default:
+      cerr<<"unknown command: "<<cmd<<endl;
+    }
+  } else {
+    start_app(cmd);
+  }
+}
+
+void
+DirectDServer::read_command(string& cmd) {
+  try {
+    ifstream f;
+    f.open("directdCommand", ios::in | ios::binary);
+    stringstream ss;
+    const buf_size=512;
+    char buf[buf_size];
+    f.getline(buf, buf_size);
+    if (f.gcount() > 0) {
+      cmd = buf;
+      cerr<<"read_command "<<cmd<<endl;
+    }
+    f.close();
+  } catch (...) {
+    // This could be bad, I suppose.  But we're going to throw out
+    // any exceptions that happen during the above read.
+    cerr<<"DirectD::read_command() exception."<<endl;
+  }
+}
+
+void
+DirectDServer::run_server(int port) {
+  if (_verbose) cerr<<"server"<<endl;
+  
+  listen_to(port);
+
+  while (!_shutdown) {
+    check_for_new_clients();
+    check_for_lost_connection();
+    check_for_datagrams();
+
+    // Yield the timeslice before we poll again.
+    PR_Sleep(PR_MillisecondsToInterval(200));
+  }
+}
 
 int
 main(int argc, char *argv[]) {
   if (argc > 1 && strcmp(argv[1], "--help")==0) {
-    cerr<<"directd [-c <host>] <port>\n"
-    "    -c        run as client (else run as server).\n"
-    "    host      e.g. localhost\n"
+    cerr<<"directd [<port>]\n"
     "    port      default 8001\n";
     return 1;
   }
 
-  cerr<<"directd"<<endl;
-  DirectD directd;
-  if (argc >= 3) {
-    string host=argv[argc-2];
-    directd.set_host_name(host);
-  }
-  char run_as=' ';
+  cerr<<"directdServer"<<endl;
+  int port=8001;
   if (argc > 1) {
-    directd.set_port(atoi(argv[argc-1]));
-    if (strlen(argv[1]) > 1 && argv[1][0] == '-') {
-      run_as=argv[1][1];
-    }
-  }
-  switch (run_as) {
-  case 's':
-    directd.run_server();
-    break;
-  case 'c':
-  default:
-    directd.run_client();
-    break;
+    port=(atoi(argv[argc-1]));
   }
+  DirectDServer directd;
+  directd.run_server(port);
   
   return 0;
 }

+ 40 - 0
direct/src/directdServer/directdServer.h

@@ -0,0 +1,40 @@
+// Filename: directdServer.h
+// Created by:  skyler 2002.04.08
+//
+////////////////////////////////////////////////////////////////////
+//
+// PANDA 3D SOFTWARE
+// Copyright (c) 2001, Disney Enterprises, Inc.  All rights reserved
+//
+// All use of this software is subject to the terms of the Panda 3d
+// Software license.  You should have received a copy of this license
+// along with this source code; you will also find a current copy of
+// the license at http://www.panda3d.org/license.txt .
+//
+// To contact the maintainers of this program write to
+// [email protected] .
+//
+////////////////////////////////////////////////////////////////////
+
+#include "queuedConnectionReader.h"
+#include "directd.h"
+
+// Description: Start a directdServer on each of the machines you
+//              which to start panda on.
+//              
+//              Start a directdClient on the controlling machine
+//              or import ShowBaseGlobal with the xxxxx flag in
+//              your Configrc.  The client will connact each of
+//              the servers in the xxxxx list in your Configrc.
+class DirectDServer: public DirectD {
+public:
+  DirectDServer();
+  ~DirectDServer();
+  
+  void run_server(int port);
+
+protected:
+  void read_command(string& cmd);
+  void handle_command(const string& cmd);
+};
+