- bessere Dokumentation des Modules bzw. der Funktionen.

This commit is contained in:
Alexander Barton 2001-12-29 22:33:36 +00:00
parent 6fd126d6f4
commit bc140df80b
1 changed files with 38 additions and 8 deletions

View File

@ -9,11 +9,14 @@
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an comBase beteiligten Autoren finden Sie in der Datei AUTHORS. * der an comBase beteiligten Autoren finden Sie in der Datei AUTHORS.
* *
* $Id: conn.c,v 1.20 2001/12/29 22:09:43 alex Exp $ * $Id: conn.c,v 1.21 2001/12/29 22:33:36 alex Exp $
* *
* connect.h: Verwaltung aller Netz-Verbindungen ("connections") * connect.h: Verwaltung aller Netz-Verbindungen ("connections")
* *
* $Log: conn.c,v $ * $Log: conn.c,v $
* Revision 1.21 2001/12/29 22:33:36 alex
* - bessere Dokumentation des Modules bzw. der Funktionen.
*
* Revision 1.20 2001/12/29 22:09:43 alex * Revision 1.20 2001/12/29 22:09:43 alex
* - kleinere Aenderungen ("clean-ups") bei Logging (Resolver). * - kleinere Aenderungen ("clean-ups") bei Logging (Resolver).
* *
@ -178,6 +181,8 @@ LOCAL CONNECTION My_Connections[MAX_CONNECTIONS];
GLOBAL VOID Conn_Init( VOID ) GLOBAL VOID Conn_Init( VOID )
{ {
/* Modul initialisieren: statische Strukturen "ausnullen". */
CONN_ID i; CONN_ID i;
/* zu Beginn haben wir keine Verbindungen */ /* zu Beginn haben wir keine Verbindungen */
@ -194,6 +199,9 @@ GLOBAL VOID Conn_Init( VOID )
GLOBAL VOID Conn_Exit( VOID ) GLOBAL VOID Conn_Exit( VOID )
{ {
/* Modul abmelden: alle noch offenen Connections
* schliessen und freigeben. */
CONN_ID idx; CONN_ID idx;
INT i; INT i;
@ -224,8 +232,9 @@ GLOBAL VOID Conn_Exit( VOID )
GLOBAL BOOLEAN Conn_NewListener( CONST INT Port ) GLOBAL BOOLEAN Conn_NewListener( CONST INT Port )
{ {
/* Neuen Listen-Socket erzeugen: der Server wartet dann /* Neuen Listen-Socket erzeugen: der Server wartet dann auf
* auf dem angegebenen Port auf Verbindungen. */ * dem angegebenen Port auf Verbindungen. Kann der Listen-
* Socket nicht erteugt werden, so wird NULL geliefert.*/
struct sockaddr_in addr; struct sockaddr_in addr;
INT sock, on = 1; INT sock, on = 1;
@ -287,6 +296,16 @@ GLOBAL BOOLEAN Conn_NewListener( CONST INT Port )
GLOBAL VOID Conn_Handler( INT Timeout ) GLOBAL VOID Conn_Handler( INT Timeout )
{ {
/* Aktive Verbindungen ueberwachen. Mindestens alle "Timeout"
* Sekunden wird die Funktion verlassen. Folgende Aktionen
* werden durchgefuehrt:
* - neue Verbindungen annehmen,
* - geschlossene Verbindungen loeschen,
* - volle Schreibpuffer versuchen zu schreiben,
* - volle Lesepuffer versuchen zu verarbeiten,
* - Antworten von Resolver Sub-Prozessen annehmen.
*/
fd_set read_sockets, write_sockets; fd_set read_sockets, write_sockets;
struct timeval tv; struct timeval tv;
time_t start; time_t start;
@ -435,7 +454,8 @@ GLOBAL BOOLEAN Conn_Write( CONN_ID Idx, CHAR *Data, INT Len )
GLOBAL VOID Conn_Close( CONN_ID Idx, CHAR *Msg ) GLOBAL VOID Conn_Close( CONN_ID Idx, CHAR *Msg )
{ {
/* Verbindung schliessen */ /* Verbindung schliessen. Evtl. noch von Resolver
* Sub-Prozessen offene Pipes werden geschlossen. */
assert( Idx >= 0 ); assert( Idx >= 0 );
assert( My_Connections[Idx].sock >= 0 ); assert( My_Connections[Idx].sock >= 0 );
@ -499,7 +519,10 @@ LOCAL BOOLEAN Try_Write( CONN_ID Idx )
LOCAL VOID Handle_Read( INT Sock ) LOCAL VOID Handle_Read( INT Sock )
{ {
/* Aktivitaet auf einem Socket verarbeiten */ /* Aktivitaet auf einem Socket verarbeiten:
* - neue Clients annehmen,
* - Daten von Clients verarbeiten,
* - Resolver-Rueckmeldungen annehmen. */
CONN_ID idx; CONN_ID idx;
@ -687,6 +710,8 @@ LOCAL VOID Read_Request( CONN_ID Idx )
LOCAL VOID Handle_Buffer( CONN_ID Idx ) LOCAL VOID Handle_Buffer( CONN_ID Idx )
{ {
/* Daten im Lese-Puffer einer Verbindung verarbeiten. */
CHAR *ptr, *ptr1, *ptr2; CHAR *ptr, *ptr1, *ptr2;
INT len, delta; INT len, delta;
@ -727,7 +752,9 @@ LOCAL VOID Handle_Buffer( CONN_ID Idx )
LOCAL VOID Check_Connections( VOID ) LOCAL VOID Check_Connections( VOID )
{ {
/* Pruefen, ob Verbindungen noch "alive" sind */ /* Pruefen, ob Verbindungen noch "alive" sind. Ist dies
* nicht der Fall, zunaechst PING-PONG spielen und, wenn
* auch das nicht "hilft", Client disconnectieren. */
INT i; INT i;
@ -782,6 +809,7 @@ LOCAL RES_STAT *Resolve( struct sockaddr_in *Addr )
RES_STAT *s; RES_STAT *s;
INT pid; INT pid;
/* Speicher anfordern */
s = malloc( sizeof( RES_STAT )); s = malloc( sizeof( RES_STAT ));
if( ! s ) if( ! s )
{ {
@ -789,6 +817,7 @@ LOCAL RES_STAT *Resolve( struct sockaddr_in *Addr )
return NULL; return NULL;
} }
/* Pipe fuer Antwort initialisieren */
if( pipe( s->pipe ) != 0 ) if( pipe( s->pipe ) != 0 )
{ {
free( s ); free( s );
@ -796,11 +825,12 @@ LOCAL RES_STAT *Resolve( struct sockaddr_in *Addr )
return NULL; return NULL;
} }
/* Sub-Prozess erzeugen */
pid = fork( ); pid = fork( );
if( pid > 0 ) if( pid > 0 )
{ {
/* Haupt-Prozess */ /* Haupt-Prozess */
Log( LOG_DEBUG, "Resolver process for %s created (PID %d).", inet_ntoa( Addr->sin_addr ), pid ); Log( LOG_DEBUG, "Resolver for %s created (PID %d).", inet_ntoa( Addr->sin_addr ), pid );
FD_SET( s->pipe[0], &My_Resolvers ); FD_SET( s->pipe[0], &My_Resolvers );
if( s->pipe[0] > My_Max_Fd ) My_Max_Fd = s->pipe[0]; if( s->pipe[0] > My_Max_Fd ) My_Max_Fd = s->pipe[0];
s->pid = pid; s->pid = pid;
@ -844,9 +874,9 @@ LOCAL VOID Read_Resolver_Result( INT r_fd )
return; return;
} }
/* zugehoerige Connection suchen */
for( i = 0; i < MAX_CONNECTIONS; i++ ) for( i = 0; i < MAX_CONNECTIONS; i++ )
{ {
/* zugehoerige Connection suchen */
if(( My_Connections[i].sock >= 0 ) && ( My_Connections[i].res_stat ) && ( My_Connections[i].res_stat->pipe[0] == r_fd )) break; if(( My_Connections[i].sock >= 0 ) && ( My_Connections[i].res_stat ) && ( My_Connections[i].res_stat->pipe[0] == r_fd )) break;
} }