BOOL cg_socket_setmulticastttl(CgSocket *sock, int ttl) { int sockOptRet; int ttl_; unsigned int len=0; cg_log_debug_l4("Entering...\n"); #if defined(BTRON) || (defined(TENGINE) && !defined(CG_TENGINE_NET_KASAGO)) sockOptRet = so_setsockopt(sock->id, IPPROTO_IP, IP_MULTICAST_TTL, (B *)&ttl, sizeof(ttl)); #elif defined(TENGINE) && defined(CG_TENGINE_NET_KASAGO) sockOptRet = ka_setsockopt(sock->id, IPPROTO_IP, IP_MULTICAST_TTL, (const char *)&ttl, sizeof(ttl)); #elif defined (ITRON) /**** Not Implemented for NORTi ***/ sockOptRet = -1; #elif defined (WIN32) sockOptRet = setsockopt(sock->id, IPPROTO_IP, IP_MULTICAST_TTL, (const char *)&ttl, sizeof(ttl)); #else cg_log_debug("Setting multicast time to live to %d\n", ttl); sockOptRet = setsockopt(sock->id, IPPROTO_IP, IP_MULTICAST_TTL, (const unsigned char *)&ttl, sizeof(ttl)); if (sockOptRet != 0) { cg_log_debug("setsockopt() failed with errno %d: %s, fd:%d\n", errno, strerror(errno),sock->id); } else { len = sizeof(ttl_); getsockopt(sock->id, IPPROTO_IP, IP_MULTICAST_TTL, &ttl_, (socklen_t*)&len); cg_log_debug("Multicast time to live is %i\n", ttl_); } #endif cg_log_debug_l4("Leaving...\n"); return (sockOptRet == 0) ? TRUE : FALSE; }
BOOL cg_socket_joingroup(CgSocket *sock, char *mcastAddr, char *ifAddr) { struct ip_mreq ipmr; u_long ifInetAddr = ka_inet_addr(ifAddr); BOOL joinSuccess; int sockOptRetCode; cg_log_debug_l4("Entering...\n"); joinSuccess = TRUE; ka_inet_pton( AF_INET, mcastAddr, &(ipmr.imr_multiaddr) ); memcpy(&ipmr.imr_interface, &ifInetAddr, sizeof(struct in_addr)); sockOptRetCode = ka_setsockopt(sock->id, IP_PROTOIP, IPO_ADD_MEMBERSHIP, (char *)&ipmr, sizeof(ipmr)); if (sockOptRetCode != 0) joinSuccess = FALSE; cg_string_setvalue(sock->ipaddr, (joinSuccess == TRUE) ? ifAddr : NULL); cg_log_debug_l4("Leaving...\n"); return joinSuccess; }
BOOL cg_socket_setreuseaddress(CgSocket *sock, BOOL flag) { int sockOptRet; #if defined(BTRON) || (defined(TENGINE) && !defined(CG_TENGINE_NET_KASAGO)) B optval #elif defined(TENGINE) && defined(CG_TENGINE_NET_KASAGO) int optval; #elif defined (WIN32) BOOL optval; #else int optval; #endif cg_log_debug_l4("Entering...\n"); #if defined(BTRON) || (defined(TENGINE) && !defined(CG_TENGINE_NET_KASAGO)) optval = (flag == TRUE) ? 1 : 0; sockOptRet = so_setsockopt(sock->id, SOL_SOCKET, SO_REUSEADDR, (B *)&optval, sizeof(optval)); #elif defined(TENGINE) && defined(CG_TENGINE_NET_KASAGO) optval = (flag == TRUE) ? 1 : 0; sockOptRet = ka_setsockopt(sock->id, SOL_SOCKET, SO_REUSEADDR, (const char *)&optval, sizeof(optval)); #elif defined (ITRON) /**** Not Implemented for NORTi ***/ sockOptRet = -1; #elif defined (WIN32) optval = (flag == TRUE) ? 1 : 0; sockOptRet = setsockopt(sock->id, SOL_SOCKET, SO_REUSEADDR, (const char *)&optval, sizeof(optval)); #else optval = (flag == TRUE) ? 1 : 0; sockOptRet = setsockopt(sock->id, SOL_SOCKET, SO_REUSEADDR, (const char *)&optval, sizeof(optval)); #if defined(USE_SO_REUSEPORT) || defined(TARGET_OS_MAC) || defined(TARGET_OS_IPHONE) if (sockOptRet == 0) { sockOptRet = setsockopt(sock->id, SOL_SOCKET, SO_REUSEPORT, (const char *)&optval, sizeof(optval)); } #endif #endif cg_log_debug_l4("Leaving...\n"); return (sockOptRet == 0) ? TRUE : FALSE; }
BOOL cg_socket_setmulticastinterface(CgSocket *sock, char *ifaddr) { struct sockaddr_in sockaddr; BOOL sockAddrSuccess; int optSuccess; CgNetworkInterfaceList *netIfList; CgNetworkInterface *netIf; int netIfCnt; cg_log_debug_l4("Entering...\n"); netIfList = NULL; if (cg_strlen(ifaddr) <= 0) { netIfList = cg_net_interfacelist_new(); netIfCnt = cg_net_gethostinterfaces(netIfList); if (netIfCnt <= 0) { cg_net_interfacelist_delete(netIfList); return FALSE; } netIf = cg_net_interfacelist_gets(netIfList); ifaddr = cg_net_interface_getaddress(netIf); } sockAddrSuccess = cg_socket_tosockaddrin(ifaddr, 0, &sockaddr, TRUE); if (netIfList != NULL) cg_net_interfacelist_delete(netIfList); if (sockAddrSuccess == FALSE) return FALSE; optSuccess = ka_setsockopt(sock->id, IP_PROTOIP, IPO_MULTICAST_IF, (const char *)&sockaddr.sin_addr, sizeof(sockaddr.sin_addr)); if (optSuccess != 0) return FALSE; cg_log_debug_l4("Leaving...\n"); return TRUE; }