317 lines
8.5 KiB
C++
317 lines
8.5 KiB
C++
//
|
|
// ********************************************************************
|
|
// * DISCLAIMER *
|
|
// * *
|
|
// * The following disclaimer summarizes all the specific disclaimers *
|
|
// * of contributors to this software. The specific disclaimers,which *
|
|
// * govern, are listed with their locations in: *
|
|
// * http://cern.ch/geant4/license *
|
|
// * *
|
|
// * Neither the authors of this software system, nor their employing *
|
|
// * institutes,nor the agencies providing financial support for this *
|
|
// * work make any representation or warranty, express or implied, *
|
|
// * regarding this software system or assume any liability for its *
|
|
// * use. *
|
|
// * *
|
|
// * This code implementation is the intellectual property of the *
|
|
// * GEANT4 collaboration. *
|
|
// * By copying, distributing or modifying the Program (or any work *
|
|
// * based on the Program) you indicate your acceptance of this *
|
|
// * statement, and all its terms. *
|
|
// ********************************************************************
|
|
//
|
|
//
|
|
// $Id: G4FRClientServer.cc,v 1.5 2001/07/11 10:08:45 gunter Exp $
|
|
// GEANT4 tag $Name: geant4-07-00-cand-01 $
|
|
//
|
|
// Satoshi TANAKA, Wed Jul 3 14:14:29 JST 1996
|
|
////////////////////////////////
|
|
///// G4FRClientServer.cc /////
|
|
////////////////////////////////
|
|
|
|
|
|
//=================//
|
|
#ifdef G4VIS_BUILD_DAWN_DRIVER
|
|
//=================//
|
|
|
|
#include "G4FRClientServer.hh"
|
|
|
|
// #define DEBUG_CLIENT_SERVER
|
|
|
|
#include<sys/param.h>
|
|
|
|
//----- const
|
|
const char DEFAULT_SUN_PATH[] = "FR_TMP3" ;
|
|
const int DEFAULT_PORT_NUMBER = 40701 ;
|
|
//const char FR_ENV_SERVER_HOST_NAME[] = "G4DAWN_HOST_NAME" ; // moved to .hh
|
|
const int MAX_BINDING_TRIAL = 10 ;
|
|
const int BINDING_TRIAL_INTERVAL = 5 ;
|
|
const int MAX_CONNECT_TRIAL = 10 ;
|
|
const char FR_DEFAULT_HOST_NAME[] = "localhost" ;
|
|
|
|
//----- G4FRClientServer::G4FRClientServer ()
|
|
G4FRClientServer::G4FRClientServer ( char terminator , char end_line ) :
|
|
TERMINATOR ( terminator ) ,
|
|
END_OF_LINE( end_line ) ,
|
|
fSocketFd ( -1 )
|
|
{
|
|
SetSunPath ( DEFAULT_SUN_PATH ) ; // for Unix domain
|
|
SetPortNumber ( DEFAULT_PORT_NUMBER ) ;
|
|
ClearReceivedMessage () ;
|
|
}
|
|
|
|
|
|
//----- G4FRClientServer::ConnectUnix()
|
|
int G4FRClientServer::ConnectUnix()
|
|
{
|
|
//----- local
|
|
int flag_connected = 0 ;
|
|
struct sockaddr_un server_address ;
|
|
|
|
//----- make socket
|
|
fSocketFd = socket( AF_UNIX, SOCK_STREAM, 0 );
|
|
if( fSocketFd < 0 ) { Err("G4FRClientServer::ConnectUnix(),socket"); }
|
|
|
|
//----- set server address
|
|
memset( (char *)&server_address, '\0', sizeof(server_address)) ;
|
|
server_address.sun_family = AF_UNIX ;
|
|
strcpy( server_address.sun_path, SUN_PATH );
|
|
|
|
//----- connection
|
|
int connection_status = -1 ;
|
|
int num_trial = 0 ;
|
|
while( connection_status < 0 && num_trial <= MAX_CONNECT_TRIAL ) {
|
|
num_trial++ ;
|
|
connection_status = connect( fSocketFd, (struct sockaddr * )(&server_address), sizeof( server_address ) ) ;
|
|
if( connection_status <0 )
|
|
{
|
|
#if defined DEBUG_CLIENT_SERVER
|
|
Err("G4FRClientServer::ConnectUnix(),connect => RETRY");
|
|
#endif
|
|
flag_connected = 0 ;
|
|
} else {
|
|
flag_connected = 1 ;
|
|
break ;
|
|
}
|
|
|
|
sleep(1);
|
|
|
|
} // while(connection_status...)
|
|
|
|
//----- return status of connection
|
|
return flag_connected ;
|
|
|
|
} // G4FRClientServer::ConnectUnix()
|
|
|
|
|
|
//----- G4FRClientServer::Receive()
|
|
void G4FRClientServer::Receive()
|
|
{
|
|
//-----
|
|
ClearReceivedMessage () ;
|
|
if( recv( fSocketFd, fReceivedMessage, G4FRClientServer::RECV_BUFMAX , 0 ) < 0 )
|
|
{
|
|
Err("G4FRClientServer::Receive(), recv");
|
|
}
|
|
|
|
#if defined DEBUG_CLIENT_SERVER
|
|
G4cerr << ">>>>> receivedMessage = " << fReceivedMessage << G4endl;
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
//----- G4FRClientServer::ReceiveLine()
|
|
void G4FRClientServer::ReceiveLine()
|
|
{
|
|
//----- local
|
|
char buf[1];
|
|
int index = 0 ;
|
|
|
|
//----- receive a line (until newline)
|
|
memset(fReceivedMessage, '\0', RECV_BUFMAX) ;
|
|
while( read( fSocketFd, buf, 1 ) == 1 ) {
|
|
fReceivedMessage[index++] = buf[0];
|
|
if( IsEndOfLine(buf[0]) ) { break ;}
|
|
}
|
|
} // G4FRClientServer::ReceiveLine()
|
|
|
|
|
|
//----- G4FRClientServer::Send()
|
|
void G4FRClientServer::Send()
|
|
{
|
|
if( send( fSocketFd, fSendingMessage, strlen(fSendingMessage) , 0 ) < 0 )
|
|
{
|
|
Err("G4FRClientServer::Send(), send");
|
|
}
|
|
|
|
#if defined DEBUG_CLIENT_SERVER
|
|
G4cerr << "<<<<< SentMessage = " << fSendingMessage << G4endl;
|
|
#endif
|
|
|
|
} // G4FRClientServer::Send()
|
|
|
|
|
|
//----- G4FRClientServer::Send( message )
|
|
void G4FRClientServer::Send( const char* message )
|
|
{
|
|
this->SetSendingMessage( message ) ;
|
|
this->Send();
|
|
|
|
} // G4FRClientServer::Send( message )
|
|
|
|
|
|
//----- G4FRClientServer::SendLine()
|
|
void G4FRClientServer::SendLine( const char* message )
|
|
{
|
|
//----- local
|
|
int smsg_length ;
|
|
|
|
//----- set message to sending buf
|
|
this->SetSendingMessage( message ) ;
|
|
smsg_length = GetSendingMessageLength() ;
|
|
|
|
//----- add newline if necessary
|
|
if( !IsEndOfLine( fSendingMessage[ (smsg_length - 1)] ) ) {
|
|
fSendingMessage[ smsg_length ] = GetEndOfLine() ;
|
|
fSendingMessage[ (smsg_length +1) ] = '\0' ;
|
|
smsg_length = GetSendingMessageLength();
|
|
}
|
|
|
|
//----- send
|
|
this->Send();
|
|
|
|
}// G4FRClientServer::SendLine()
|
|
|
|
|
|
//----- G4FRClientServer::DisConnect()
|
|
void G4FRClientServer::DisConnect()
|
|
{
|
|
//----- close connection
|
|
if( shutdown(fSocketFd,2) < 0 ) {
|
|
Err("G4FRClientServer::DisConnect,shutdown");
|
|
}
|
|
close( fSocketFd );
|
|
|
|
this->Clear();
|
|
}
|
|
|
|
|
|
|
|
//----- G4FRClientServer::Clear()
|
|
void G4FRClientServer::Clear()
|
|
{
|
|
unlink(SUN_PATH) ;
|
|
fSocketFd = -1 ;
|
|
}
|
|
|
|
|
|
//----- G4FRClientServer::ConnectINET()
|
|
int G4FRClientServer::ConnectINET()
|
|
{
|
|
//----- local
|
|
int flag_connected = 0 ;
|
|
sockaddr_in server_address ;
|
|
char server_hostname[32] ;
|
|
hostent* server_host_p ;
|
|
|
|
//----- make socket
|
|
fSocketFd = socket( AF_INET, SOCK_STREAM, 0 );
|
|
if( fSocketFd < 0 ) {
|
|
#if defined DEBUG_CLIENT_SERVER
|
|
Err("G4FRClientServer::ConnectINET(),socket");
|
|
#endif
|
|
}
|
|
|
|
//----- get IP address of server from its name
|
|
if( getenv( FR_ENV_SERVER_HOST_NAME ) != NULL )
|
|
{
|
|
//----- get server name
|
|
strcpy( server_hostname, getenv( FR_ENV_SERVER_HOST_NAME ) );
|
|
|
|
//----- get IP address of server from its name,
|
|
//..... reading /etc/hosts
|
|
server_host_p = gethostbyname( server_hostname ) ;
|
|
|
|
//----- If the host specified by FR_ENV_SERVER_HOST_NAME
|
|
//..... is not written in /etc/hosts,
|
|
//...... server host is set to the same as the
|
|
//...... client host
|
|
if( !server_host_p ) {
|
|
#if defined DEBUG_CLIENT_SERVER
|
|
Err("G4FRClientServer::ConnectINET(), gethostbyname");
|
|
#endif
|
|
server_host_p = gethostbyname( FR_DEFAULT_HOST_NAME ) ;
|
|
}
|
|
|
|
} else {
|
|
server_host_p = gethostbyname( FR_DEFAULT_HOST_NAME ) ;
|
|
}
|
|
|
|
|
|
|
|
// #if defined DEBUG_CLIENT_SERVER
|
|
G4cerr << "***** Trying connection to " << server_hostname << G4endl;
|
|
// #endif
|
|
|
|
|
|
//----- connection and binding
|
|
memset( (char *)&server_address, '\0', sizeof(server_address)) ;
|
|
// clear server_address
|
|
server_address.sin_family = AF_INET ;
|
|
server_address.sin_port = htons( PORT_NUMBER );
|
|
memcpy( (char *)(&server_address.sin_addr ),
|
|
(char *)( server_host_p->h_addr ),
|
|
server_host_p->h_length );
|
|
|
|
int connection_status = -1 ;
|
|
int num_trial = 0 ;
|
|
while( connection_status < 0 && num_trial <= MAX_CONNECT_TRIAL ) {
|
|
num_trial++ ;
|
|
connection_status = connect( fSocketFd, (struct sockaddr * )(&server_address), sizeof( server_address ) ) ;
|
|
if( connection_status <0 )
|
|
{
|
|
#if defined DEBUG_CLIENT_SERVER
|
|
Err("G4FRClientServer::ConnectINET(),connect => RETRY");
|
|
#endif
|
|
flag_connected = 0 ;
|
|
} else {
|
|
flag_connected = 1 ;
|
|
break ;
|
|
}
|
|
|
|
sleep(1);
|
|
|
|
} // while(connection_status...)
|
|
|
|
//----- return status of connection
|
|
return flag_connected ;
|
|
|
|
} // G4FRClientServer::ConnectINET()
|
|
|
|
|
|
//----- G4FRClientServer::WaitSendBack()
|
|
void G4FRClientServer::WaitSendBack( const char* command_string )
|
|
{
|
|
//----- wait for sending back
|
|
while(1) {
|
|
this->ReceiveLine();
|
|
|
|
if( !strncmp( this->GetReceivedMessage(), \
|
|
command_string , \
|
|
(strlen(command_string)) ) )
|
|
{
|
|
break;
|
|
} else {
|
|
sleep(2);
|
|
}
|
|
|
|
} // while
|
|
|
|
//----- clear buffer to receive message
|
|
this->ClearReceivedMessage();
|
|
|
|
} // G4FRClientServer::WaitSendBack()
|
|
|
|
#endif // G4VIS_BUILD_DAWN_DRIVER
|