IP轉換為32位無符號數(即,inet_aton函數)

來源:互聯網
上載者:User

上周跟著宿舍一哥們去海豚瀏覽器霸面,問我的題比較簡單,二分尋找的;當時莫名其妙的緊張了,答的不好,被鄙視了。

不過問宿舍哥們的題是IP轉換成無符號32位整數,當時我感覺這個好像很熟悉的,就是想不起來。現在正好看網路編程,都清楚了。在unix網路編程中,IP地址有兩種表示方法,一種是:字串“192.168.101.25”;另一種是:與字串對應的32位無符號數;

       unix網路編程中有對兩種IP轉換的的函數,暫且先看一下字串轉32為無符號數的函數;

  1. int inet_aton(const char *strptr, struct in_addr *addr);
    傳回值:1----串有效,0----串有錯;
  2. in_addr_t inet_addr(const char *strptr);
    傳回值:若成功,返回32位二進位的網路位元組地址;若有錯,返回INADDR_NONE;
  3. int inet_pton(int family, const char *strptr, void *addrptr); 傳回值:1---成功,0---輸入不是有效運算式,-1------出錯;
下面看一下 inet_aton的原始碼
#include<sys/types.h>#include<netinet/in.h>int  inet_aton(const char *cp, struct in_addr *ap){    int dots = 0;    register u_long acc = 0, addr = 0;    do {register char cc = *cp;switch (cc) {case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':    acc = acc * 10 + (cc - '0');    break;case '.':    if (++dots > 3) {return 0;    }    /* Fall through */case '\0':    if (acc > 255) {return 0;    }    addr = addr << 8 | acc;    acc = 0;    break;default:    return 0;}    } while (*cp++) ;    /* Normalize the address */    if (dots < 3) {addr <<= 8 * (3 - dots) ;    }    /* Store it if requested */    if (ap) {ap->s_addr = htonl(addr);    }    return 1;    }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.