- bessere Dokumentation des Modules bzw. der Funktionen.
This commit is contained in:
parent
6fd126d6f4
commit
bc140df80b
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue