sysdis-project/sgca/lib/network/udp/server.c

86 lines
2.6 KiB
C
Raw Permalink Normal View History

2017-04-09 16:56:11 +00:00
/**************************
* UDP Server Dependency *
***************************
* Designed & Developed by *
* Adrien Marquès *
* <xdrm-brackets> *
***************************
* doowap31@gmail.com *
**************************/
2017-04-01 15:01:36 +00:00
#include "server.h"
2017-04-26 12:25:05 +00:00
int DROP_UDP_SERVER(in_addr_t pAddr, const int pPort, int* pListenSock, struct sockaddr_in* pInfo, const char pMcast){
if( DEBUGMOD&HDR ) printf("====== DROP_UDP_MCAST(%x, %d, %p, %p, %d) ======\n\n", pAddr, pPort, (void*) pListenSock, (void*) pInfo, (int) pMcast);
2017-04-01 15:01:36 +00:00
/* [0] Initialisation des variables
=========================================================*/
int STATUS; // status
struct ip_mreq mcastReq;
2017-04-01 15:01:36 +00:00
*pListenSock = -1;
2017-04-26 12:25:05 +00:00
struct in_addr tmp;
2017-04-01 15:01:36 +00:00
/* [1] Création de la socket
=======================================================*/
/* 1. Création socket */
2017-04-01 15:01:36 +00:00
*pListenSock = socket(AF_INET, SOCK_DGRAM, 0);
if( DEBUGMOD&SCK && DEBUGMOD&HDR ) printf(" * [drop_udp_server] socket: %d\n", *pListenSock);
2017-04-01 15:01:36 +00:00
/* 2. Gestion erreur */
2017-04-01 15:01:36 +00:00
if( *pListenSock < 0 ) return -1;
/* [2] On définit les infos de la socket
=========================================================*/
/* (1) Reset des valeurs */
bzero(pInfo, sizeof(struct sockaddr_in));
2017-04-01 15:01:36 +00:00
/* (2) On définit les infos */
pInfo->sin_family = AF_INET;
pInfo->sin_port = htons(pPort);
pInfo->sin_addr.s_addr = htonl(INADDR_ANY);
2017-04-01 15:01:36 +00:00
/* [3] On publie la SOCKET
=======================================================*/
/* 1. Publication socket */
int count = -1;
do{
count++;
pInfo->sin_port = htons(pPort+count);
STATUS = bind(*pListenSock, (struct sockaddr*) pInfo, sizeof(struct sockaddr_in));
if( DEBUGMOD&SAD ) printf("\tudp:%d used, trying udp:%d\n", pPort+count-1, pPort+count);
}while( STATUS < 0 && count < 10 );
2017-04-01 15:01:36 +00:00
if( DEBUGMOD&SCK && DEBUGMOD&HDR ) printf(" * [drop_udp_server] bind: %d\n", STATUS);
2017-04-01 15:01:36 +00:00
/* 2. Gestion erreur */
2017-04-01 15:01:36 +00:00
if( STATUS < 0 ) return -1;
/* 3. Demande groupe multicast (si demandé) */
if( pMcast ){
2017-04-26 12:25:05 +00:00
tmp.s_addr = pAddr;
if( DEBUGMOD&SCK && DEBUGMOD&HDR ) printf(" * [drop_udp_server] join mcast group: %s\n", inet_ntoa(tmp));
mcastReq.imr_multiaddr.s_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;
}
}
2017-04-01 15:01:36 +00:00
/* [n] Code succès
=========================================================*/
return pPort+count;
2017-04-01 15:01:36 +00:00
}