1. 程式人生 > >”將一個unsigned long 型的IP轉換為字串型別的IP “ 解釋

”將一個unsigned long 型的IP轉換為字串型別的IP “ 解釋

/*  將一個unsigned long 型的IP轉換為字串型別的IP */
#define IPTOSBUFFERS    12
char *iptos(u_long in)
{
    static char output[IPTOSBUFFERS][3*4+3+1];  //ip字串格式包含4個三位數加三個點加一個結尾符
    static short which;
    u_char *p;

    p = (u_char *)∈
    which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1);
    sprintf(output[which], "%d.%d.%d.%d", p[0],p[1], p[2], p[3]);
    return output[which];
}

如下:這是個特殊應用的轉換函式 

#define   IPTOSBUFFERS   12 //定義緩衝區大小為12個,從下面的函式知道 
//這個函式可以保留11個轉換結果 

char   *iptos(u_long   in) 

static   char   output[IPTOSBUFFERS][3*4+3+1];//輸出3點4段的字串,可以容納12次計算結果,但第一個沒有使用 
static   short   which; //   計數 
u_char   *p; 

p   =   (u_char   *)∈ //   指向長整數IP地址的字元型指標 
which   =   (which   +   1   ==   IPTOSBUFFERS   ?   0   :   which   +   1); //   每呼叫本函式一次,計數器加1 


sprintf(output[which],   "%d.%d.%d.%d ",   p[0],   p[1],   p[2],   p[3]);//轉換為3點4段的字串如192.168.0.1,並儲存到一個 
//output緩衝中 
return   output[which];//返回這個轉換結果。 


struct   sockaddr_in   *a; 
...... 
iptos(a-> sin_addr.s_addr); 


------- 

這個函式可以保留11次轉換結果,但結果在子函式內部,不知道程式設計者幹什麼用,如果不需要這些,可以很簡單改編為: 

char   *iptos(u_long   in) 


static   char   output[3*4+3+1];//輸出3點4段的字串 
u_char   *p; 

p   =   (u_char   *)∈ //   指向長整數IP地址的字元型指標 
sprintf(output,   "%d.%d.%d.%d ",   p[0],   p[1],   p[2],   p[3]); 
return   output;//返回這個轉換結果。 
}