Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members | Related Pages

Parallel/vtkSocketCommunicator.h

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Visualization Toolkit
00004   Module:    $RCSfile: vtkSocketCommunicator.h,v $
00005 
00006   Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
00007   All rights reserved.
00008   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
00009 
00010      This software is distributed WITHOUT ANY WARRANTY; without even
00011      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
00012      PURPOSE.  See the above copyright notice for more information.
00013 
00014 =========================================================================*/
00036 #ifndef __vtkSocketCommunicator_h
00037 #define __vtkSocketCommunicator_h
00038 
00039 #include "vtkCommunicator.h"
00040 
00041 #include "vtkByteSwap.h" // Needed for vtkSwap macros
00042 
00043 #ifdef VTK_WORDS_BIGENDIAN
00044 # define vtkSwap4 vtkByteSwap::Swap4LE
00045 # define vtkSwap4Range vtkByteSwap::Swap4LERange
00046 # define vtkSwap8 vtkByteSwap::Swap8LE
00047 # define vtkSwap8Range vtkByteSwap::Swap8LERange
00048 #else
00049 # define vtkSwap4 vtkByteSwap::Swap4BE
00050 # define vtkSwap4Range vtkByteSwap::Swap4BERange
00051 # define vtkSwap8 vtkByteSwap::Swap8BE
00052 # define vtkSwap8Range vtkByteSwap::Swap8BERange
00053 #endif
00054 
00055 class VTK_PARALLEL_EXPORT vtkSocketCommunicator : public vtkCommunicator
00056 {
00057 public:
00058   static vtkSocketCommunicator *New();
00059   vtkTypeRevisionMacro(vtkSocketCommunicator,vtkCommunicator);
00060   void PrintSelf(ostream& os, vtkIndent indent);
00061 
00063   virtual int WaitForConnection(int port);
00064 
00066   virtual void CloseConnection();
00067 
00069   virtual int ConnectTo( char* hostName, int port);
00070 
00072 
00073   vtkGetMacro(SwapBytesInReceivedData, int);
00075 
00077 
00078   vtkGetMacro(IsConnected, int);
00080 
00081   //------------------ Communication --------------------
00082   
00084 
00086   int Send(int *data, int length, int remoteProcessId, int tag);
00087   int Send(unsigned long *data, int length, int remoteProcessId, int tag);
00088   int Send(char *data, int length, int remoteProcessId, int tag);
00089   int Send(unsigned char *data, int length, int remoteProcessId, int tag);
00090   int Send(float *data, int length, int remoteProcessId, int tag);
00091   int Send(double *data, int length, int remoteProcessId, int tag);
00092 #ifdef VTK_USE_64BIT_IDS
00093   int Send(vtkIdType *data, int length, int remoteProcessId, int tag);
00095 #endif
00096   int Send(vtkDataObject *data, int remoteId, int tag)
00097     {return this->vtkCommunicator::Send(data,remoteId,tag);}
00098   int Send(vtkDataArray *data, int remoteId, int tag)
00099     {return this->vtkCommunicator::Send(data,remoteId,tag);}
00100 
00102 
00105   int Receive(int *data, int length, int remoteProcessId, int tag);
00106   int Receive(unsigned long *data, int length, int remoteProcessId, int tag);
00107   int Receive(char *data, int length, int remoteProcessId, int tag);
00108   int Receive(unsigned char *data, int length, int remoteProcessId, int tag);
00109   int Receive(float *data, int length, int remoteProcessId, int tag);
00110   int Receive(double *data, int length, int remoteProcessId, int tag);
00111 #ifdef VTK_USE_64BIT_IDS
00112   int Receive(vtkIdType *data, int length, int remoteProcessId, int tag);
00114 #endif
00115   int Receive(vtkDataObject *data, int remoteId, int tag)
00116     {return this->vtkCommunicator::Receive(data, remoteId, tag);}
00117   int Receive(vtkDataArray *data, int remoteId, int tag)
00118     {return this->vtkCommunicator::Receive(data, remoteId, tag);}
00119 
00121 
00123   vtkSetClampMacro(PerformHandshake, int, 0, 1);
00124   vtkBooleanMacro(PerformHandshake, int);
00125   vtkGetMacro(PerformHandshake, int);
00127 
00128   //BTX
00130 
00132   virtual void SetLogStream(ostream* stream);
00133   virtual ostream* GetLogStream();
00134   //ETX
00136   
00138 
00142   virtual int LogToFile(const char* name);
00143   virtual int LogToFile(const char* name, int append);
00145   
00146 protected:
00147 
00148   int Socket;
00149   int IsConnected;
00150   int NumberOfProcesses;
00151   int SwapBytesInReceivedData;
00152   int PerformHandshake;
00153   
00154   ofstream* LogFile;
00155   ostream* LogStream;
00156   
00157   vtkSocketCommunicator();
00158   ~vtkSocketCommunicator();
00159   
00160   // Wrappers around send/recv calls to implement loops.  Return 1 for
00161   // success, and 0 for failure.
00162   int SendInternal(int socket, void* data, int length);
00163   int ReceiveInternal(int socket, void* data, int length);
00164   int SendTagged(void* data, int wordSize, int numWords, int tag,
00165                  const char* logName);
00166   int ReceiveTagged(void* data, int wordSize, int numWords, int tag,
00167                     const char* logName);
00168   
00169   // Internal utility methods.
00170   void LogTagged(const char* name, void* data, int wordSize, int numWords,
00171                  int tag, const char* logName);
00172   int CheckForErrorInternal(int id);
00173 private:
00174   vtkSocketCommunicator(const vtkSocketCommunicator&);  // Not implemented.
00175   void operator=(const vtkSocketCommunicator&);  // Not implemented.
00176 };
00177 
00178 #endif