[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:
parent
0c641726a8
commit
726ab7b4e3
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -41,4 +41,6 @@
|
||||||
#define maxHostLen 64
|
#define maxHostLen 64
|
||||||
#define maxPortLen 6
|
#define maxPortLen 6
|
||||||
|
|
||||||
|
#define SOCK_TIMEOUT 2 // 2sec timeout
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -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;
|
||||||
|
|
|
@ -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");
|
||||||
|
|
Loading…
Reference in New Issue