[done] Ajout timeout lors de création sockets + fonction de traitement dynamique pour chaque thread du type "LISTEN_" + debug TCP + fix `make clean`

This commit is contained in:
xdrm-brackets 2017-04-09 18:41:44 +02:00
parent 0c641726a8
commit 726ab7b4e3
6 changed files with 49 additions and 19 deletions

View File

@ -24,4 +24,4 @@ all: boot
# cleans the compiled files # cleans the compiled files
clean: clean:
rm boot; rm boot;
rm ./**/*.o rm lib/network/**/*.o;

View File

@ -29,9 +29,10 @@ int main(int argc, char* argv[]){
sgca_index.update = 0; sgca_index.update = 0;
/* Variables locales */ /* Variables locales */
struct listn_thrd_arg tcp_listn_arg = { SERV_HOST, TCP_LIST }; struct listn_thrd_arg tcp_listn_arg = { SERV_HOST, TCP_LIST, &managePlane };
struct listn_thrd_arg udp_vterm_arg = { MCST_VTER, UDP_VTER }; struct listn_thrd_arg udp_mcast_arg = { MCST_HOST, UDP_MCST, NULL };
struct listn_thrd_arg udp_cterm_arg = { MCST_CTER, UDP_CTER }; struct listn_thrd_arg udp_vterm_arg = { MCST_VTER, UDP_VTER, &manageTerminal };
struct listn_thrd_arg udp_cterm_arg = { MCST_CTER, UDP_CTER, &manageTerminal };
/* [1] Lancement des THREADS d'écoute /* [1] Lancement des THREADS d'écoute
@ -41,8 +42,8 @@ int main(int argc, char* argv[]){
if( DEBUGMOD&THR ) printf("{tcp_listn} démarré\n"); if( DEBUGMOD&THR ) printf("{tcp_listn} démarré\n");
/* (2) Ecoute UDP multicast */ /* (2) Ecoute UDP multicast */
// pthread_create(&listenManagers[1], NULL, LISTEN_UDP, (void*)(intptr_t) UDP_MCST); pthread_create(&listenManagers[1], NULL, LISTEN_UDP, (void*) &udp_mcast_arg);
// if( DEBUGMOD&THR ) printf("{udp_mcast} émarré\n\n"); if( DEBUGMOD&THR ) printf("{udp_mcast} démarré\n\n");
/* (3) Ecoute UDP viewTerm */ /* (3) Ecoute UDP viewTerm */
pthread_create(&listenManagers[2], NULL, LISTEN_UDP, (void*) &udp_vterm_arg); pthread_create(&listenManagers[2], NULL, LISTEN_UDP, (void*) &udp_vterm_arg);
@ -122,6 +123,7 @@ void* LISTEN_TCP(void* THREADABLE_ARG){
index = -1; index = -1;
/* 2. On attends une connection TCP */ /* 2. On attends une connection TCP */
len = sizeof(struct sockaddr_in);
CLIENT_SOCKET = accept(LISTENSOCK, (struct sockaddr*) &clientInfo, &len); CLIENT_SOCKET = accept(LISTENSOCK, (struct sockaddr*) &clientInfo, &len);
/* 3. Si erreur, on attend une nouvelle connection */ /* 3. Si erreur, on attend une nouvelle connection */
@ -130,6 +132,8 @@ void* LISTEN_TCP(void* THREADABLE_ARG){
break; break;
} }
if( DEBUGMOD&SCK ) printf("{tcp_listn} %s:%d connecté\n", inet_ntoa(clientInfo.sin_addr), ntohs(clientInfo.sin_port));
/* 4. On cherche un "manager" libre (inactif) */ /* 4. On cherche un "manager" libre (inactif) */
for( i = 0 ; i < MAX_TCP_THR ; i++ ) for( i = 0 ; i < MAX_TCP_THR ; i++ )
if( activeTCPManagers[i] == 0 ){ index = i; break; } if( activeTCPManagers[i] == 0 ){ index = i; break; }
@ -138,7 +142,7 @@ void* LISTEN_TCP(void* THREADABLE_ARG){
if( index != -1 ){ if( index != -1 ){
/* 5. On lance un thread pour le traitement de ce client */ /* 5. On lance un thread pour le traitement de ce client */
pthread_create(&TCPManagers[index], NULL, managePlane, (void*)(intptr_t) CLIENT_SOCKET); pthread_create(&TCPManagers[index], NULL, arg->func, (void*)(intptr_t) CLIENT_SOCKET);
if( DEBUGMOD&THR ) printf("{tcp_listn}{com}(%d) démarré\n", index); if( DEBUGMOD&THR ) printf("{tcp_listn}{com}(%d) démarré\n", index);
@ -246,7 +250,7 @@ void* LISTEN_UDP(void* THREADABLE_ARG){
} }
/* 3. On récupère l'adresse IP du client */ /* 3. On récupère l'adresse IP du client */
if( DEBUGMOD&SCK ) printf("{%s} '%s' connecté\n", entity, inet_ntoa(clientInfo.sin_addr)); if( DEBUGMOD&SCK ) printf("{%s} %s:%d connecté\n", entity, inet_ntoa(clientInfo.sin_addr), ntohs(clientInfo.sin_port));
@ -327,7 +331,7 @@ void* LISTEN_UDP(void* THREADABLE_ARG){
if( index != -1 ){ if( index != -1 ){
/* 2.1. On lance un thread pour le traitement de ce client */ /* 2.1. On lance un thread pour le traitement de ce client */
pthread_create(&UDPManagers[index], NULL, manageTerminal, (void*)(intptr_t) CLIENT_SOCKET); pthread_create(&UDPManagers[index], NULL, arg->func, (void*)(intptr_t) CLIENT_SOCKET);
if( DEBUGMOD&THR ) printf("{%s}{udp_com}(%d) démarré\n", entity, index); if( DEBUGMOD&THR ) printf("{%s}{udp_com}(%d) démarré\n", entity, index);

View File

@ -21,8 +21,8 @@ void* manageTerminal(void* THREADABLE_SOCKET);
static pthread_t listenManagers[4]; // contiendra les THREADS d'écoute static pthread_t listenManagers[4]; // contiendra les THREADS d'écoute
// 1. Multicast UDP (plane) // 1. Multicast UDP (plane)
// 2. ListenSock TCP (plane) // 2. ListenSock TCP (plane)
// 3. ListenSock UDP (vterm) // 3. ListenSock UDP (vterm) Multicast
// 4. ListenSock UDP (cterm) // 4. ListenSock UDP (cterm) Multicast
// VARIABLES THREADS CONNECTION TCP // VARIABLES THREADS CONNECTION TCP
static pthread_t TCPManagers[MAX_TCP_THR]; // contiendra les THREADS TCP static pthread_t TCPManagers[MAX_TCP_THR]; // contiendra les THREADS TCP
@ -34,8 +34,9 @@ static int activeUDPManagers[MAX_UDP_THR] = {0}; // contiendra les THREADS UDP a
struct listn_thrd_arg{ struct listn_thrd_arg{
const char addr[16]; const char addr[16]; // socket address
const unsigned short port; const unsigned short port; // socket port
void* (*func)(); // management function
}; };

View File

@ -41,4 +41,6 @@
#define maxHostLen 64 #define maxHostLen 64
#define maxPortLen 6 #define maxPortLen 6
#define SOCK_TIMEOUT 2 // 2sec timeout
#endif #endif

View File

@ -11,23 +11,32 @@ int DROP_TCP_SERVER(const int pPort, int* pListenSock){
/* [0] Initialisation des variables /* [0] Initialisation des variables
=========================================================*/ =========================================================*/
// CREATION
static struct sockaddr_in addr; // contiendra les infos du serveur static struct sockaddr_in addr; // contiendra les infos du serveur
int STATUS; // status int STATUS; // status
struct timeval timeout;
// INITIALISATION
*pListenSock = -1; *pListenSock = -1;
/* [1] Création de la socket /* [1] Création de la socket
=======================================================*/ =======================================================*/
/* 1. Création socket */
*pListenSock = socket(AF_INET, SOCK_STREAM, 0); *pListenSock = socket(AF_INET, SOCK_STREAM, 0);
if( DEBUGMOD&SCK && DEBUGMOD&HDR ) printf(" * [drop_tcp_server] socket: %d\n", *pListenSock); if( DEBUGMOD&SCK && DEBUGMOD&HDR ) printf(" * [drop_tcp_server] socket: %d\n", *pListenSock);
// si erreur /* 2. Gestion erreur */
if( *pListenSock < 0 ) return -1; if( *pListenSock < 0 ) return -1;
/* 3. Timeout */
timeout.tv_sec = SOCK_TIMEOUT;
timeout.tv_usec = 0;
if( setsockopt(*pListenSock, SOL_SOCKET, SO_RCVTIMEO|SO_SNDTIMEO, (char*) &timeout, sizeof(struct timeval) ) < 0 ){
close(*pListenSock);
return -1;
}
/* [2] On définit les infos de la socket /* [2] On définit les infos de la socket
=========================================================*/ =========================================================*/
@ -42,24 +51,28 @@ int DROP_TCP_SERVER(const int pPort, int* pListenSock){
/* [3] On publie la SOCKET /* [3] On publie la SOCKET
=======================================================*/ =======================================================*/
/* 1. Publication socket */
STATUS = bind(*pListenSock, (struct sockaddr*) &addr, sizeof(addr)); STATUS = bind(*pListenSock, (struct sockaddr*) &addr, sizeof(addr));
if( DEBUGMOD&SCK && DEBUGMOD&HDR ) printf(" * [drop_tcp_server] bind: %d\n", STATUS); if( DEBUGMOD&SCK && DEBUGMOD&HDR ) printf(" * [drop_tcp_server] bind: %d\n", STATUS);
// si erreur /* 2. Gestion erreur */
if( STATUS < 0 ) return -1; if( STATUS < 0 ) return -1;
/* [4] On met la socket sur écoute /* [4] On met la socket sur écoute
=======================================================*/ =======================================================*/
/* 1. Démarrage écoute */
STATUS = listen(*pListenSock, MAX_TCP_THR); STATUS = listen(*pListenSock, MAX_TCP_THR);
if( DEBUGMOD&SCK && DEBUGMOD&HDR ) printf(" * [drop_tcp_server] listen: %d\n", STATUS); if( DEBUGMOD&SCK && DEBUGMOD&HDR ) printf(" * [drop_tcp_server] listen: %d\n", STATUS);
// si erreur /* 2. Gestion erreur */
if( STATUS < 0 ) return -1; if( STATUS < 0 ) return -1;
/* [n] Code succès /* [n] Code succès
=========================================================*/ =========================================================*/
return 0; return 0;

View File

@ -12,6 +12,7 @@ int DROP_UDP_SERVER(const char* pAddr, const int pPort, int* pListenSock, struct
uint yes = 1; uint yes = 1;
struct ip_mreq mcastReq; struct ip_mreq mcastReq;
*pListenSock = -1; *pListenSock = -1;
struct timeval timeout;
/* [1] Création de la socket /* [1] Création de la socket
@ -24,7 +25,16 @@ int DROP_UDP_SERVER(const char* pAddr, const int pPort, int* pListenSock, struct
/* 2. Gestion erreur */ /* 2. Gestion erreur */
if( *pListenSock < 0 ) return -1; if( *pListenSock < 0 ) return -1;
/* 3. MULTICAST -> Autorisation plusieurs sockets sur port */ /* 3. Timeout */
timeout.tv_sec = SOCK_TIMEOUT;
timeout.tv_usec = 0;
if( setsockopt(*pListenSock, SOL_SOCKET, SO_RCVTIMEO|SO_SNDTIMEO, (char*) &timeout, sizeof(struct timeval) ) < 0 ){
close(*pListenSock);
return -1;
}
/* 4. MULTICAST -> Autorisation plusieurs sockets sur port */
if( pMcast ){ if( pMcast ){
if( DEBUGMOD&SCK && DEBUGMOD&HDR ) printf(" * [drop_udp_server] set port to be reused\n"); if( DEBUGMOD&SCK && DEBUGMOD&HDR ) printf(" * [drop_udp_server] set port to be reused\n");