/*********************************************************/ /* Autori: */ /* Pelosi Giovanni, 346787, pelosi */ /* Pesce Agatino, 456868, pesce */ /* */ /* Progetto: Sistemi 2: biblioteca */ /* Data Pr.: 9/2/96 */ /* File: socket.h */ /* */ /*********************************************************/ #ifndef _SOCKET_H #define _SOCKET_H #include "system.h" #include "libro.h" #include "message.h" #define TRUE 1 #define FALSE 0 /************************************/ /*** stato interazione con socket ***/ /************************************/ typedef enum SocketType_tag { SockTypeUnknown = '0', /* socket non identificata (dopo accept) */ SockTypeClient = '1', /* socket di tipo client */ SockTypeServer = '2', /* socket di tipo server (risposta) */ SockTypeControl = '3', /* socket di controllo per collegamento iniziale */ SockTypeListen = '4' /* socket di listen */ } SocketType_t; typedef enum SocketControl_tag { SockCtrlNone = '0', /* socket non client */ SockCtrlLocalServer = '1', /* socket in ricerca locale */ SockCtrlNextServer = '2', /* socket scansione server */ SockCtrlContinue = '3' /* socket trattamento risposta server */ } SocketControl_t; typedef enum SocketState_tag { SockStateIdle = '0', /* stato iniziale di socked accepted */ SockStateWaitRead = '1', /* inizio lettura messaggio */ SockStateReading = '2', /* continuazione lettura messaggio */ SockStateWriting = '3' /* scrittura in corso */ } SocketState_t; typedef struct SocketInfo_tag { SocketType_t Type; /* stato connessione (req_state) */ SocketState_t State; /* stato connessione (req_state) */ SocketControl_t Control; /* stato richiesta (se client) */ int Request; /* indice scansione server */ long Offset; /* Offset ricerca su file */ int Linked; /* socket client (per richieste da server) */ int NoForward; /* flag per inoltro ad altri server */ Libro_t Libro; /* struttura dati query/riposte */ int Len; /* lunghezza messaggio */ int ToRead; /* numero bytes letti */ int ToWrite; /* numero bytes scritti */ MessageText_t Text; /* buffer messaggio (padded) */ } SocketInfo_t; /**********************/ /*** tabella server ***/ /**********************/ typedef enum HostState_tag { HostStateNone = '0', HostStateConnectable = '1', HostStateConnected = '2', HostStateAccepted = '3' } HostState_t; typedef struct HostInfo_tag { int Inactive; /* flag annullamento host */ HostState_t State; /* nome descrittivo biblioteca */ Biblio_t Biblio; /* nome descrittivo biblioteca */ int Socket; /* socket (connected/accepted) */ struct sockaddr_in Peer; /* host:port peer se accepted */ } HostInfo_t; /* * Stampa a video una socket */ void DumpSocket(int Sock); int CreateSocket(void); int CreateConnectSocket(void); /*usata per connettersi a server*/ int CreateAcceptedSocket(int Socket); /*usata per client o nouvi server (inizio)*/ void DestroySocket(int Socket); int AddAcceptedPeer(int Socket, struct sockaddr_in * Sin); int AddRemoteHost(char * Host, char * Port); int PassiveSocket(int Port, int Qlen); SocketInfo_t* RetrieveSockInfo(int Socket); HostInfo_t* RetrieveHostInfo(int Host); int GetHostCount(void); int InitSocket(void); int ExitSocket(void); void LoadSelectFds(void); int GetFdSetSize(void); #ifdef __HPUX_D__ struct fd_set* GetActiveWriteFds(void); struct fd_set* GetActiveReadFds(void); struct fd_set* GetSelectWriteFds(void); struct fd_set* GetSelectReadFds(void); #else fd_set* GetActiveWriteFds(void); fd_set* GetActiveReadFds(void); fd_set* GetSelectWriteFds(void); fd_set* GetSelectReadFds(void); #endif void SetWriteToken(int Socket); void ResetWriteToken(int Socket); void SetReadToken(int Socket); void ResetReadToken(int Socket); int ActiveSocket(char* Host, char * Port); int PassiveSocket(int Port, int Qlen); HostInfo_t * RetrieveHostBySocket(int Socket); #endif