#include "talk.hh" #include // Get the Id of the Server-Task // If it doesn't exist yet, create it. Pvm::Task GetServerTask () { // Get all tasks in the pvm Pvm::TaskSet AllTasks; Pvm::Pvm ().Tasks (AllTasks); // The absolute path of the server std::string ServerPath = SERVERNAME; // Check every task, if it is the server. Pvm::TaskSet::iterator Current; for (Current = AllTasks.begin (); Current != AllTasks.end (); ++Current) { // If so, return the coressponding Pvm::Task if ((*Current).Name () == ServerPath) return *Current; } // Else, start server on my host anew return Pvm::Pvm ().I ().Host ().Spawn (ServerPath); } int main (int argc, char **argv) { if (argc != 2) { std::cerr << "Usage: " << argv[0] << " YourName." << std::endl; exit (1); } std::cerr << "End the session with a single \".\" on a line" << std::endl; Pvm::Task Server = GetServerTask (); Register.Send (Server); Message In; Message Out; Out.Name = argv[1]; Pvm::StructSet Awaited; Awaited.insert (In); Awaited.ReadFDs ().insert (STDIN_FILENO); while (true) { if (0 == Awaited.ReceiveFrom (Server)) { // New data written to stdin std::getline (std::cin, Out.String); if (Out.String == ".") break; Out.Send (Server); } else std::cout << In.Name << ":" << In.String << std::endl; } Leaving.Send (Server); }