/** * 向局域网某些计算机单独发送上线信息. * @param sock udp socket */ void Command::DialUp(int sock) { struct sockaddr_in addr; in_addr_t startip, endip, ipv4; NetSegment *pns; GSList *list, *tlist; CreateCommand(IPMSG_DIALUPOPT | IPMSG_ABSENCEOPT | IPMSG_BR_ENTRY, progdt.nickname); ConvertEncode(progdt.encode); CreateIptuxExtra(progdt.encode); bzero(&addr, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(IPTUX_DEFAULT_PORT); //与某些代码片段的获取网段描述相冲突,必须复制出来使用 pthread_mutex_lock(&progdt.mutex); list = progdt.CopyNetSegment(); pthread_mutex_unlock(&progdt.mutex); tlist = list; while (tlist) { pns = (NetSegment *)tlist->data; inet_pton(AF_INET, pns->startip, &startip); startip = ntohl(startip); inet_pton(AF_INET, pns->endip, &endip); endip = ntohl(endip); ipv4_order(&startip, &endip); ipv4 = startip; while (ipv4 <= endip) { addr.sin_addr.s_addr = htonl(ipv4); sendto(sock, buf, size, 0, (struct sockaddr *)&addr, sizeof(addr)); g_usleep(999); ipv4++; } tlist = g_slist_next(tlist); } for (tlist = list; tlist; tlist = g_slist_next(tlist)) delete (NetSegment *)tlist->data; g_slist_free(list); }
/** * 获取局域网网段名称. * @param ipv4 ipv4 * @return name */ char *ipv4_get_lan_name(in_addr_t ipv4) { /** * @note 局域网网段划分,每两个为一组,以NULL标识结束. */ const char *localgroup[] = { "10.0.0.0", "10.255.255.255", "172.16.0.0", "172.31.255.255", "192.168.0.0", "192.168.255.255", NULL }; in_addr_t startip, endip; uint8_t count; char *ipstr; ipv4 = ntohl(ipv4); ipstr = NULL; count = 0; while (localgroup[count << 1]) { inet_pton(AF_INET, localgroup[count << 1], &startip); startip = ntohl(startip); inet_pton(AF_INET, localgroup[(count << 1) + 1], &endip); endip = ntohl(endip); ipv4_order(&startip, &endip); if (startip <= ipv4 && endip >= ipv4) { ipstr = g_strdup_printf("%s~%s", localgroup[count << 1], localgroup[(count << 1) + 1]); break; } count++; } return ipstr; }