source: trunk/source/visualization/FukuiRenderer/src/G4FRClientServer.cc @ 1202

Last change on this file since 1202 was 944, checked in by garnier, 15 years ago

mise a jour des tags

File size: 8.7 KB
Line 
1//
2// ********************************************************************
3// * License and Disclaimer                                           *
4// *                                                                  *
5// * The  Geant4 software  is  copyright of the Copyright Holders  of *
6// * the Geant4 Collaboration.  It is provided  under  the terms  and *
7// * conditions of the Geant4 Software License,  included in the file *
8// * LICENSE and available at  http://cern.ch/geant4/license .  These *
9// * include a list of copyright holders.                             *
10// *                                                                  *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work  make  any representation or  warranty, express or implied, *
14// * regarding  this  software system or assume any liability for its *
15// * use.  Please see the license in the file  LICENSE  and URL above *
16// * for the full disclaimer and the limitation of liability.         *
17// *                                                                  *
18// * This  code  implementation is the result of  the  scientific and *
19// * technical work of the GEANT4 collaboration.                      *
20// * By using,  copying,  modifying or  distributing the software (or *
21// * any work based  on the software)  you  agree  to acknowledge its *
22// * use  in  resulting  scientific  publications,  and indicate your *
23// * acceptance of all terms of the Geant4 Software license.          *
24// ********************************************************************
25//
26//
27// $Id: G4FRClientServer.cc,v 1.6 2006/06/29 21:16:56 gunter Exp $
28// GEANT4 tag $Name:  $
29//
30// Satoshi TANAKA, Wed Jul  3 14:14:29 JST 1996
31////////////////////////////////
32///// G4FRClientServer.cc /////
33////////////////////////////////
34
35
36//=================//
37#ifdef G4VIS_BUILD_DAWN_DRIVER
38//=================//
39
40#include "G4FRClientServer.hh"
41
42// #define DEBUG_CLIENT_SERVER
43
44#include<sys/param.h>
45
46        //----- const   
47const  char     DEFAULT_SUN_PATH[]              = "FR_TMP3"        ;
48const  int      DEFAULT_PORT_NUMBER             = 40701            ;
49//const  char   FR_ENV_SERVER_HOST_NAME[]       = "G4DAWN_HOST_NAME" ; // moved to .hh
50const  int      MAX_BINDING_TRIAL               = 10               ;
51const  int      BINDING_TRIAL_INTERVAL          = 5                ;
52const  int      MAX_CONNECT_TRIAL               = 10               ;
53const  char     FR_DEFAULT_HOST_NAME[]          = "localhost"      ;     
54
55        //----- G4FRClientServer::G4FRClientServer ()
56G4FRClientServer::G4FRClientServer ( char terminator , char end_line ) : 
57        TERMINATOR ( terminator ) , 
58        END_OF_LINE( end_line   ) ,
59        fSocketFd  ( -1 )           
60{ 
61        SetSunPath    ( DEFAULT_SUN_PATH ) ; // for Unix domain
62        SetPortNumber ( DEFAULT_PORT_NUMBER ) ;
63        ClearReceivedMessage () ;
64}
65
66
67        //----- G4FRClientServer::ConnectUnix()
68int G4FRClientServer::ConnectUnix()
69{
70                //----- local
71        int                     flag_connected = 0 ; 
72        struct sockaddr_un      server_address ;
73
74                //----- make socket
75        fSocketFd = socket( AF_UNIX, SOCK_STREAM, 0 );
76        if( fSocketFd < 0 ) { Err("G4FRClientServer::ConnectUnix(),socket"); }
77
78                //----- set server address
79        memset( (char *)&server_address, '\0', sizeof(server_address)) ;
80        server_address.sun_family = AF_UNIX ;
81        strcpy( server_address.sun_path, SUN_PATH );
82
83                //----- connection
84        int     connection_status = -1  ;
85        int     num_trial         = 0 ;
86        while( connection_status < 0 && num_trial <= MAX_CONNECT_TRIAL ) {
87                num_trial++ ; 
88                connection_status = connect( fSocketFd, (struct sockaddr * )(&server_address), sizeof( server_address ) ) ;
89                if( connection_status  <0 ) 
90                {
91#if defined DEBUG_CLIENT_SERVER
92                        Err("G4FRClientServer::ConnectUnix(),connect => RETRY");
93#endif
94                        flag_connected = 0 ;
95                } else {
96                        flag_connected = 1 ;
97                        break ;
98                }
99
100                sleep(1);
101               
102        } // while(connection_status...)
103
104                //----- return status of connection
105        return flag_connected ;
106
107} // G4FRClientServer::ConnectUnix()
108
109
110        //----- G4FRClientServer::Receive()
111void    G4FRClientServer::Receive()
112{
113                //-----
114        ClearReceivedMessage () ;
115        if( recv( fSocketFd, fReceivedMessage, G4FRClientServer::RECV_BUFMAX , 0 ) < 0 ) 
116        {
117                Err("G4FRClientServer::Receive(), recv");
118        }
119
120#if defined DEBUG_CLIENT_SERVER
121        G4cerr << ">>>>> receivedMessage = " << fReceivedMessage << G4endl;
122#endif
123
124}
125
126
127        //----- G4FRClientServer::ReceiveLine()
128void    G4FRClientServer::ReceiveLine()
129{
130                //----- local
131        char    buf[1];
132        int index = 0 ;
133
134                //----- receive a line (until newline)
135        memset(fReceivedMessage, '\0', RECV_BUFMAX) ;   
136        while( read( fSocketFd, buf, 1 ) == 1 ) {
137                fReceivedMessage[index++] = buf[0];
138                if( IsEndOfLine(buf[0]) ) { break ;}
139        }
140} // G4FRClientServer::ReceiveLine()
141
142
143        //----- G4FRClientServer::Send()
144void    G4FRClientServer::Send()
145{
146        if( send( fSocketFd, fSendingMessage, strlen(fSendingMessage) , 0 ) < 0 ) 
147        {
148                Err("G4FRClientServer::Send(), send");
149        }
150
151#if defined DEBUG_CLIENT_SERVER
152        G4cerr << "<<<<< SentMessage = " << fSendingMessage << G4endl;
153#endif
154
155} // G4FRClientServer::Send()
156
157
158        //----- G4FRClientServer::Send( message )
159void    G4FRClientServer::Send( const char* message ) 
160{
161        this->SetSendingMessage( message )      ;
162        this->Send();
163
164} // G4FRClientServer::Send( message )
165
166
167        //----- G4FRClientServer::SendLine()
168void    G4FRClientServer::SendLine( const char* message ) 
169{
170                //----- local
171        int     smsg_length ;
172
173                //----- set message to sending buf
174        this->SetSendingMessage( message )      ;
175        smsg_length = GetSendingMessageLength() ;
176
177                //----- add newline if necessary
178        if( !IsEndOfLine( fSendingMessage[ (smsg_length - 1)] ) ) {
179                fSendingMessage[ smsg_length ]      = GetEndOfLine() ;
180                fSendingMessage[ (smsg_length +1) ] = '\0' ;
181                smsg_length = GetSendingMessageLength();
182        }
183
184                //----- send
185        this->Send();
186
187}// G4FRClientServer::SendLine()
188
189
190        //----- G4FRClientServer::DisConnect()
191void G4FRClientServer::DisConnect()
192{
193                //----- close connection
194        if( shutdown(fSocketFd,2) < 0 ) { 
195                Err("G4FRClientServer::DisConnect,shutdown");
196        }
197        close( fSocketFd );
198
199        this->Clear();
200}
201
202
203
204        //----- G4FRClientServer::Clear()
205void G4FRClientServer::Clear()
206{
207        unlink(SUN_PATH) ;
208        fSocketFd = -1   ;
209}
210
211
212        //----- G4FRClientServer::ConnectINET()
213int G4FRClientServer::ConnectINET()
214{
215                //----- local
216        int                     flag_connected = 0 ;
217        sockaddr_in             server_address ;
218        char                    server_hostname[32] ;
219        hostent*                server_host_p ;
220
221                //----- make socket
222        fSocketFd = socket( AF_INET, SOCK_STREAM, 0 );
223        if( fSocketFd < 0 ) { 
224#if defined DEBUG_CLIENT_SERVER
225          Err("G4FRClientServer::ConnectINET(),socket"); 
226#endif
227        }
228
229                //----- get IP address of server from its name
230        if( getenv( FR_ENV_SERVER_HOST_NAME ) != NULL ) 
231        {
232                        //----- get server name
233                strcpy( server_hostname, getenv( FR_ENV_SERVER_HOST_NAME ) );
234
235                        //----- get IP address of server from its name,
236                        //..... reading /etc/hosts
237                server_host_p = gethostbyname( server_hostname ) ;
238                       
239                        //----- If the host specified by FR_ENV_SERVER_HOST_NAME
240                        //.....  is not written in /etc/hosts,
241                        //...... server host is set to the same as the
242                        //...... client host
243                if( !server_host_p ) {
244#if defined DEBUG_CLIENT_SERVER
245                        Err("G4FRClientServer::ConnectINET(), gethostbyname");
246#endif
247                        server_host_p = gethostbyname( FR_DEFAULT_HOST_NAME ) ;
248                }
249
250        } else {
251                        server_host_p = gethostbyname( FR_DEFAULT_HOST_NAME ) ;
252        }
253
254
255
256// #if defined DEBUG_CLIENT_SERVER
257        G4cerr << "***** Trying connection to  " << server_hostname << G4endl;
258// #endif
259       
260
261                //----- connection and binding
262        memset( (char *)&server_address, '\0', sizeof(server_address)) ; 
263                                // clear server_address
264        server_address.sin_family = AF_INET ;
265        server_address.sin_port   = htons( PORT_NUMBER );
266        memcpy( (char *)(&server_address.sin_addr ), 
267                (char *)( server_host_p->h_addr   ), 
268                server_host_p->h_length             ); 
269
270        int     connection_status = -1  ;
271        int     num_trial         = 0 ;
272        while( connection_status < 0 && num_trial <= MAX_CONNECT_TRIAL ) {
273                num_trial++ ; 
274                connection_status = connect( fSocketFd, (struct sockaddr * )(&server_address), sizeof( server_address ) ) ;
275                if( connection_status  <0 ) 
276                {
277#if defined DEBUG_CLIENT_SERVER
278                        Err("G4FRClientServer::ConnectINET(),connect => RETRY");
279#endif
280                        flag_connected  = 0 ;
281                } else {
282                        flag_connected  = 1 ;
283                        break ;
284                }
285
286                sleep(1);
287
288        } // while(connection_status...)
289
290                //----- return status of connection
291        return flag_connected ;
292
293} // G4FRClientServer::ConnectINET()
294
295
296        //----- G4FRClientServer::WaitSendBack()
297void    G4FRClientServer::WaitSendBack( const char* command_string ) 
298{
299                //----- wait for sending back
300        while(1) { 
301                this->ReceiveLine();
302
303                if( !strncmp(   this->GetReceivedMessage(), \
304                                command_string                , \
305                                (strlen(command_string))       )   )
306                {
307                        break;
308                } else {
309                        sleep(2);
310                }
311
312        } // while
313
314                //----- clear buffer to receive message
315        this->ClearReceivedMessage();   
316
317} // G4FRClientServer::WaitSendBack()
318
319#endif // G4VIS_BUILD_DAWN_DRIVER
Note: See TracBrowser for help on using the repository browser.