上周跟著宿舍一哥們去海豚瀏覽器霸面,問我的題比較簡單,二分尋找的;當時莫名其妙的緊張了,答的不好,被鄙視了。
不過問宿舍哥們的題是IP轉換成無符號32位整數,當時我感覺這個好像很熟悉的,就是想不起來。現在正好看網路編程,都清楚了。在unix網路編程中,IP地址有兩種表示方法,一種是:字串“192.168.101.25”;另一種是:與字串對應的32位無符號數;
unix網路編程中有對兩種IP轉換的的函數,暫且先看一下字串轉32為無符號數的函數;
- int inet_aton(const char *strptr, struct in_addr *addr);
傳回值:1----串有效,0----串有錯;
- in_addr_t inet_addr(const char *strptr);
傳回值:若成功,返回32位二進位的網路位元組地址;若有錯,返回INADDR_NONE;
- 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; }