Example #1
0
/**
 * 向局域网某些计算机单独发送上线信息.
 * @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);
}
Example #2
0
/**
 * 获取局域网网段名称.
 * @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;
}