/*! 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); }
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; }