从转换列表中保存ip

时间:2014-01-15 20:48:26

标签: c++ string android-ndk char

该函数将读取一行DNS服务器信息并检​​查它是否为四元组并存储在列表中。 该行将是:8.8.8.8 , 8.8.4.4

问题是它会正确读取第一个并打印十进制值:134744072 但其次是:1476921352

请帮助代码...

因此pszString将读取整行并将每个地址存储在列表中[d] [i]

int SetDNSserver(char* pszString) {
    memset( dnsip, 0, sizeof(dnsip) );  //clear out old

    const char *p;
    int i=0;
    char *nameDottedQuad ;
    std::string dottedquad;
    int flag=0;

    for( p = pszString; *p; ++p ) {
        if( isdigit(*p) || *p == '.' ) {
            //copy the  value to dottedquad
            dottedquad+=*p;
            FREE_SAFE(nameDottedQuad);
            nameDottedQuad = strdup(dottedquad.c_str());
            if(isValidIpAddress(nameDottedQuad)) {
                //save it in a list
                while(i<10) {
                    dnsip[i] = inet_addr(nameDottedQuad);

                    #ifdef ANDROID_DEBUG
                        __android_log_print(ANDROID_LOG_INFO, DEBUG_TAG," DNSSERVER:%d",dnsip[i]);
                    #endif

                    i++;
                    break;
                }
            }
        }
        else {
            //DisplayNot dotted quad ");
        }
    }

    static bool isValidIpAddress(char *ipAddress) {
        struct sockaddr_in sa;
        int result = inet_pton(AF_INET, ipAddress, &(sa.sin_addr));
        return result != 0;
    }
}

#define FREE_SAFE(x)              { if (((x) != NULL)) \
                                  {  free(x); (x) = NULL; } }

2 个答案:

答案 0 :(得分:0)

  1. FREE_SAFE在做什么?
  2. 您可能想检查inet_addr(...)的结果 if(ulAddr == INADDR_NONE){//打印错误消息}
  3. 顺便说一句,如果IP地址有效,您无需在每次迭代中签入。您可以等到完成处理输入字符串,然后只检查一次它是否是有效的IP地址。

答案 1 :(得分:0)

有很多问题,其中一个是解析问题.FREE_SAFE没有正确使用。这个的逻辑方法必须改变,现在工作正常。