Exemple #1
0
/*! Assign a socket. <CODE>Open</CODE> assignes a system socket to the
    DgramSocket. 
    \see Socket::close 
 */
void DgramSocket::open()
{
    _sd = socket(AF_INET, SOCK_DGRAM, 0);
    if(_sd<0)
    {
        throw SocketError("socket()");
    }
    // all dgram sockets are allowed to send broadcast
    int on = 1;
    if(::setsockopt(_sd, 
                    SOL_SOCKET, SO_BROADCAST, 
                    reinterpret_cast<SocketOptT *>(&on), sizeof(on)) < 0)
    {
        throw SocketError("setsockopt(,SOL_SOCKET,SO_BROADCAST)");
    }
    // by default, multicast only in local network
    setTTL(2);
}
Exemple #2
0
MulticastServer::MulticastServer(char *multicastGroup, in_addr_t sourceMulticastIp, unsigned short port, HashTable *_keyHashtable, KeyHashtableTimeout *_keyHashtableTimeout) : Server(SOCK_DGRAM, IPPROTO_IP, port) {
	int returnCode;
	struct in_addr interfaceIp;
	char delimiter[2];

	interfaceIp.s_addr = sourceMulticastIp;
	multicastServerInitialized = false;
		
	returnCode = joinGroup(multicastGroup, &interfaceIp);
	if (returnCode < 0) {
		systemLog->sysLog(ERROR, "cannot initialized MulticastServer correctly");
		return;
	}
	returnCode = setTTL(255);
	if (returnCode < 0) {
		systemLog->sysLog(ERROR, "cannot initialized MulticastServer correctly");
		return;
	}
	delimiter[0] = '\n';
	delimiter[1] = '\0';
	parser = new Parser(delimiter);
	if (! parser) {
		systemLog->sysLog(CRITICAL, "cannot create a Parser object: %s", strerror(errno));
		return;
	}
	keyHashtable = _keyHashtable;
	keyHashtableTimeout = _keyHashtableTimeout;

	/* construct a multicast address structure */
	struct sockaddr_in mc_addr;
	memset(&mc_addr, 0, sizeof(mc_addr));
	mc_addr.sin_family = AF_INET;
	mc_addr.sin_addr.s_addr = inet_addr(multicastGroup);
	mc_addr.sin_port = htons(port);

	if (bind(sd, (struct sockaddr*) &mc_addr, sizeof(mc_addr)) == -1) {
	  systemLog->sysLog(ERROR, "cannot bind multicast adress: %s\n", strerror(errno));
	  return;
	}

	multicastServerInitialized = true;
	
	return;
}