91 lines
2.7 KiB
C
91 lines
2.7 KiB
C
#include "server.h"
|
|
|
|
|
|
|
|
|
|
int DROP_UDP_SERVER(const char* pAddr, const int pPort, int* pListenSock, struct sockaddr_in* pInfo, const char pMcast){
|
|
if( DEBUGMOD&HDR ) printf("====== DROP_UDP_MCAST(%s, %d, %p, %p, %d) ======\n\n", pAddr, pPort, (void*) pListenSock, (void*) pInfo, (int) pMcast);
|
|
|
|
/* [0] Initialisation des variables
|
|
=========================================================*/
|
|
int STATUS; // status
|
|
uint yes = 1;
|
|
struct ip_mreq mcastReq;
|
|
*pListenSock = -1;
|
|
struct timeval timeout;
|
|
|
|
|
|
/* [1] Création de la socket
|
|
=======================================================*/
|
|
/* 1. Création socket */
|
|
*pListenSock = socket(AF_INET, SOCK_DGRAM, 0);
|
|
|
|
if( DEBUGMOD&SCK && DEBUGMOD&HDR ) printf(" * [drop_udp_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;
|
|
}
|
|
|
|
/* 4. MULTICAST -> Autorisation plusieurs sockets sur port */
|
|
if( pMcast ){
|
|
|
|
if( DEBUGMOD&SCK && DEBUGMOD&HDR ) printf(" * [drop_udp_server] set port to be reused\n");
|
|
|
|
if( setsockopt(*pListenSock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(uint) ) < 0 ){
|
|
close(*pListenSock);
|
|
return -1;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
/* [2] On définit les infos de la socket
|
|
=========================================================*/
|
|
/* (1) Reset des valeurs */
|
|
bzero(pInfo, sizeof(struct sockaddr_in));
|
|
|
|
/* (2) On définit les infos */
|
|
pInfo->sin_family = AF_INET;
|
|
pInfo->sin_port = htons(pPort);
|
|
pInfo->sin_addr.s_addr = htonl(INADDR_ANY);
|
|
|
|
|
|
/* [3] On publie la SOCKET
|
|
=======================================================*/
|
|
/* 1. Publication socket */
|
|
STATUS = bind(*pListenSock, (struct sockaddr*) pInfo, sizeof(struct sockaddr_in));
|
|
|
|
if( DEBUGMOD&SCK && DEBUGMOD&HDR ) printf(" * [drop_udp_server] bind: %d\n", STATUS);
|
|
|
|
/* 2. Gestion erreur */
|
|
if( STATUS < 0 ) return -1;
|
|
|
|
/* 3. Demande groupe multicast (si demandé) */
|
|
if( pMcast ){
|
|
|
|
if( DEBUGMOD&SCK && DEBUGMOD&HDR ) printf(" * [drop_udp_server] join mcast group: %s\n", pAddr);
|
|
mcastReq.imr_multiaddr.s_addr = inet_addr(pAddr);
|
|
mcastReq.imr_interface.s_addr = htonl(INADDR_ANY);
|
|
|
|
if( setsockopt(*pListenSock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mcastReq, sizeof(mcastReq)) < 0 ){
|
|
close(*pListenSock);
|
|
return -1;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
/* [n] Code succès
|
|
=========================================================*/
|
|
return 0;
|
|
}
|
|
|