sysdis-project/central-manager/lib/network/tcp/server.c

81 lines
2.2 KiB
C

#include "server.h"
int DROP_TCP_SERVER(const int pPort, int* pListenSock){
if( DEBUGMOD&HDR ) printf("====== DROP_TCP_SERVER(%d, %p) ======\n\n", pPort, (void*) pListenSock);
/* [0] Initialisation des variables
=========================================================*/
static struct sockaddr_in addr; // contiendra les infos du serveur
int STATUS; // status
struct timeval timeout;
*pListenSock = -1;
/* [1] Création de la socket
=======================================================*/
/* 1. Création socket */
*pListenSock = socket(AF_INET, SOCK_STREAM, 0);
if( DEBUGMOD&SCK && DEBUGMOD&HDR ) printf(" * [drop_tcp_server] socket: %d\n", *pListenSock);
/* 2. Gestion erreur */
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
=========================================================*/
/* (1) Reset des valeurs */
bzero(&addr, sizeof(struct sockaddr_in));
/* (2) On définit les infos */
addr.sin_family = AF_INET;
addr.sin_port = htons(pPort);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
/* [3] On publie la SOCKET
=======================================================*/
/* 1. Publication socket */
STATUS = bind(*pListenSock, (struct sockaddr*) &addr, sizeof(addr));
if( DEBUGMOD&SCK && DEBUGMOD&HDR ) printf(" * [drop_tcp_server] bind: %d\n", STATUS);
/* 2. Gestion erreur */
if( STATUS < 0 ) return -1;
/* [4] On met la socket sur écoute
=======================================================*/
/* 1. Démarrage écoute */
STATUS = listen(*pListenSock, MAX_TCP_THR);
if( DEBUGMOD&SCK && DEBUGMOD&HDR ) printf(" * [drop_tcp_server] listen: %d\n", STATUS);
/* 2. Gestion erreur */
if( STATUS < 0 ) return -1;
/* [n] Code succès
=========================================================*/
return 0;
}