欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Linux Socket學(xué)習(五)
地址轉換函數

上一章中,我們已經(jīng)了可以分配與初始化各種類(lèi)型的套接口。這些是由一個(gè)常量進(jìn)行初始化的簡(jiǎn)單例子。由一個(gè)使用變化地址的C字符串設置一個(gè)地址需要更多的編程努力。在這一章,我們將會(huì )關(guān)注建立網(wǎng)絡(luò )地址的傳統問(wèn)題,以及了解可以在這一領(lǐng)域幫助我們的函數。
在這一章,我們了解到如下內容:
網(wǎng)絡(luò )地址分類(lèi)
IP網(wǎng)絡(luò )掩碼
私有的以及保留的IP地址
IP轉換函數
然而在我們開(kāi)始之前,這是一個(gè)很好的機會(huì )來(lái)回顧一下IP地址的設計。這樣我們就會(huì )更為理解我們將要進(jìn)行的工作。

網(wǎng)絡(luò )IP地址
IP地址是由四個(gè)十進(jìn)制數組成的,其中由十進(jìn)制的點(diǎn)來(lái)分隔,通常為點(diǎn)。每一個(gè)十進(jìn)制值以網(wǎng)絡(luò )字節順序來(lái)表示一個(gè)字節的無(wú)符號值。在這里我們記住網(wǎng)絡(luò )字節順序要求最重要的字節先出現(大端順序)。
每一個(gè)字節都作為一個(gè)無(wú)符號的8位值。這將每一個(gè)字節的值限制在0到255之間。因為這個(gè)值是無(wú)符號的,這個(gè)值不可以是負的,加號也是不允許的。例如,考慮下地址192.168.0.1,網(wǎng)絡(luò )順序的第一個(gè)字節必須為十進(jìn)制的192。
當我們看到一個(gè)電影在屏幕上顯示192.168.300.5的IP地址,我們就會(huì )知道這個(gè)制作者對于TCP/IP編程了解較少。雖然這個(gè)地址在句法上是正確的,但是十進(jìn)制的300超過(guò)了最大的無(wú)符號數255。

網(wǎng)絡(luò )地址分類(lèi)
網(wǎng)絡(luò )地址是由下面的兩個(gè)組件構成的:
網(wǎng)絡(luò )號(最重要位)
主機號(次重要位)
網(wǎng)絡(luò )號標識主機可以連接到的網(wǎng)絡(luò )。主機號標識一個(gè)特定網(wǎng)絡(luò )中的一個(gè)主機(例如我們的PC)。
正如我們已經(jīng)知道的,IP地址是32位的(或者是4個(gè)8位字節)。然而,網(wǎng)絡(luò )號與主機號組件之間的分隔并不是固定的位置。分隔線(xiàn)取決于網(wǎng)絡(luò )地址的分類(lèi),這是由地址的最重要的字節的檢測來(lái)決定的。下表顯示了IP地址是如何分類(lèi)的:
Table 3.1: Internet Address Classes
Class       Lowest            Highest             Network Bits     Host Bits
A           0.0.0.0           127.255.255.255     7                24
B           128.0.0.0         191.255.255.255     14               16
C           192.0.0.0         223.255.255.255     21               8
D           224.0.0.0         239.255.255.255     28               N/A
E           240.0.0.0         247.255.255.255     27               N/A

A,B,C類(lèi)定義了主機的特定IP地址。對于D類(lèi)與E類(lèi)地址,在地址沒(méi)有主機位可用。D類(lèi)地址用于多播,其中28位用于描述一個(gè)多播組。E類(lèi)地址的27位保留的。

下圖描述了32IP地址的分隔。下圖顯示的常用的A,B,C類(lèi)地址:

理解網(wǎng)絡(luò )掩碼

有時(shí)我們必須決定一個(gè)地址的網(wǎng)絡(luò )掩碼。如是要我們設置我們的網(wǎng)絡(luò )時(shí)這尤為正確。所以,什么是一個(gè)網(wǎng)絡(luò )掩碼。

如果我們將一個(gè)IP地址作為32位,網(wǎng)絡(luò )ID是由地址的最重要的位來(lái)標識的。另外,同一個(gè)地址的主機ID是由次重要的位來(lái)決定的。網(wǎng)絡(luò )掩碼是一個(gè)簡(jiǎn)單的值,我們可以用來(lái)與一個(gè)地址進(jìn)行按位與,從而只保留網(wǎng)絡(luò )ID。下圖顯示了IP地址192.168.9.1是如何進(jìn)行掩碼從而得到網(wǎng)絡(luò )ID位的。

結果就得到了IP地址中表示網(wǎng)絡(luò )部分的最重要的位,而沒(méi)有主機ID。下圖演示了一個(gè)網(wǎng)絡(luò )掩碼如何轉換為一個(gè)十進(jìn)制IP地址的:

如果我們必須設置我們的網(wǎng)絡(luò ),我們就必須確定我們的網(wǎng)絡(luò )掩碼是多少。下表列出A,B,C類(lèi)地址的網(wǎng)絡(luò )掩碼:
Class Lowest    Highest         Netmask
A     0.0.0.0   127.255.255.255 255.0.0.0
B     128.0.0.0 191.255.255.255 255.255.0.0
C     192.0.0.0 223.255.255.255 255.255.255.0

有時(shí),在一個(gè)網(wǎng)絡(luò )軟件中,我們的軟件必須可以分類(lèi)一個(gè)網(wǎng)絡(luò )地址。有時(shí),這是通過(guò)確定一個(gè)默認的網(wǎng)絡(luò )掩碼來(lái)簡(jiǎn)單完成的。

下面提供了一個(gè)簡(jiǎn)單的例子程序來(lái)演示如何由一個(gè)套接口地址分類(lèi)一個(gè)IP地址。
在這個(gè)程序中,在一個(gè)網(wǎng)絡(luò )套接口地址結構中設置了四個(gè)不同的IP地址。然后對這個(gè)地址進(jìn)行檢測與分類(lèi)。這就演示了如何分類(lèi)連接到我們服務(wù)器的遠程客戶(hù)端的IP地址。
/*
 * netmask.c
 *
 * Classify an IP address:
 */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main(int argc,char **argv)
{
    int x;        /* Index variable */
    struct sockaddr_in adr_inet;    /* AF_INET */
    int len_inet;    /* length */
    unsigned msb;    /* most significant byte */
    char class;
    char *netmask;
    static struct
    {
    unsigned char ip[4];
    }addresses[]={
        {{44,135,86,12}},
    {{127,0,0,1}},
    {{172,16,23,95}},
    {{192,168,9,1}}
    };

    for (x=0;x<4;x++)
    {
    /*
     * set up the socket address,to
     * demonstrate how to classify it;
     */
    memset(&adr_inet,0,sizeof adr_inet);
    adr_inet.sin_family = AF_INET;
    adr_inet.sin_port = htons(9000);
    memcpy(&adr_inet.sin_addr.s_addr,addresses[x].ip,4);
    len_inet = sizeof adr_inet;

    /*
     * classify this address
     *
     * 1 get the most significant byte
     * 2 classify by that byte
     */
    msb = *(unsigned char*)&adr_inet.sin_addr.s_addr;
    if((msb &0x80) == 0x00)
    {
        class = ‘A‘;
        netmask = "255.0.0.0";
    }
    else if((msb &0xc0) == 0x80)
    {
        class = ‘B‘;
        netmask = "255.255.0.0";
    }
    else if((msb &0xe0) == 0xc0)
    {
        class = ‘C‘;
        netmask = "255.255.255.0";
    }
    else if((msb &0xf0) == 0xe0)
    {
        class = ‘D‘;
        netmask = "255.255.255.255";
    }
    else
    {
        class = ‘E‘;
        netmask = "255.255.255.255";
    }

    printf("Address %u.%u.%u.%u is class %c "
        "netmask %s\n",
        addresses[x].ip[0],
        addresses[x].ip[1],
        addresses[x].ip[2],
        addresses[x].ip[3],
        class,
        netmask);   
    }

    return 0;
}
通過(guò)這個(gè)程序例子,我們就可以了解如何來(lái)分類(lèi)一個(gè)正在處理的IP地址。

分配IP地址
在前一個(gè)例子中,我們已經(jīng)了解了如何來(lái)分類(lèi)一個(gè)IP地址。IP地址是由一個(gè)名InterNIC的組織分配給各種個(gè)人或是組織的。然而一些范圍的IP地址是設置為私有的,而其他的一些保留為特殊的用途。

私有IP地址
通常IP地址必須由InterNICd rs.internic.net進(jìn)行注冊。然而,如果我們的系統并沒(méi)有直接連接到網(wǎng)絡(luò ),我們并不需要一個(gè)全球唯一的地址。相反,我們可以使用私用的IP地址。

緊隨著(zhù)的第一個(gè)問(wèn)題就是"我們應使用什么IP地址?"。在這一節,我們就會(huì )解答這個(gè)問(wèn)題。

RFC 1597是一個(gè)描述私有IP地址是如何分配的網(wǎng)絡(luò )標準文檔。下表是一個(gè)簡(jiǎn)要的描述:
Class Lowest      Highest         Netmask
A     10.0.0.0    10.255.255.255  255.0.0.0
B     172.16.0.0  172.31.255.255  255.255.0.0
C     192.168.0.0 192.168.255.255 255.255.255.0
A,B,C類(lèi)IP地址的選擇在很大程度上取決于單個(gè)的網(wǎng)絡(luò )數量以及我們要建立的主機數。如果網(wǎng)絡(luò )以及主機數很小,那個(gè)一個(gè)C類(lèi)就足夠了。相對于,一個(gè)A類(lèi)地址允許一個(gè)網(wǎng)絡(luò ),但是卻有大量的主機數目。B類(lèi)地址提供了大量的網(wǎng)絡(luò )數與主機數。

保留IP地址

存在大量的保留IP地址,而這些內容位RFC 1166中。作為保留系列地址的一個(gè)例子,在下表中將Amateur廣播IP地址系列作為例子?,F在A(yíng)X.25協(xié)議已經(jīng)構建進(jìn)入Linux內核,將會(huì )有更多的廣播業(yè)余愛(ài)好者使用這些IP地址。
Class Lowest   Highest        Netmask
A     44.0.0.0 44.255.255.255 255.0.0.0

處理IP地址

為了簡(jiǎn)化將字符串格式的IP地址轉換為可用的套接口地址的編程負擔,提供了一些函數來(lái)完成這樣的工作。這些函數將會(huì )在下面的部分中進(jìn)行描述。

使用inet_addr(3)函數

我們首先要了解的函數是一個(gè)較老的函數,這在新的代碼中將不會(huì )再使用。然而,我們仍可以在已存在的網(wǎng)絡(luò )代碼中看到這個(gè)函數,所以我們應了解他,并且知道他的限制。

inet_addr(3)函數概要如下:

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
unsigned long inet_addr(const char *string);

這個(gè)函數接受一個(gè)輸入的C字符串參數string,并且將其解析為一個(gè)32位的網(wǎng)絡(luò )地址值。32位地址值是以網(wǎng)絡(luò )字節順序返回的。

如果輸入參數string并不是一個(gè)可用的地址值,則會(huì )返回INADDR_NONE。其他的返回值則代表轉換的值。

下面的這個(gè)例子程序演示了如何使用這個(gè)函數。當這個(gè)程序運行時(shí),會(huì )將包含一個(gè)IP地址的C字符串轉換為一個(gè)網(wǎng)絡(luò )順序的32位IP地址。然后把這個(gè)值放入AF_INET套接口地址,并且綁定到這個(gè)套接口。
/*
 * inetaddr.c
 *
 * Example using inet_addr(3)
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

/*
 * this function reports the error and
 * exits back to the shell
 */
static void bail(const char *on_what)
{
    fputs(on_what,stderr);
    fputs("/n",stderr);
    exit(1);
}

int main(int argc,char **argv)
{
    int z;       
    struct sockaddr_in adr_inet;    /* AF_INET */
    int len_inet;            /* length */
    int sck_inet;            /* Socket */

    /* create a socket */
    sck_inet = socket(AF_INET,SOCK_STREAM,0);

    if(sck_inet == -1)
    bail("socket()");

    /* Establish address */
    memset(&adr_inet,0,sizeof adr_inet);

    adr_inet.sin_family = AF_INET;
    adr_inet.sin_port = htons(9000);

    adr_inet.sin_addr.s_addr = inet_addr("127.0.0.95");

    if(adr_inet.sin_addr.s_addr == INADDR_NONE)
    bail("bad address");

    len_inet = sizeof adr_inet;

    /* Bind it to the socket */
    z = bind(sck_inet,(struct sockaddr *)&adr_inet,len_inet);

    if(z == -1)
    bail("bind()");

    /* Display our socket address */
    system("netstat -pa --tcp 2>/dev/null"
        " | grep inetaddr");
    return 0;
}
程序運行結果如下:
$ ./inetaddr
tcp 0 0 127.0.0.95:9000 *:* CLOSE 992/inetaddr
$

inet_aton(3)函數
inet_aton是一個(gè)改進(jìn)的方法來(lái)將一個(gè)字符串IP地址轉換為一個(gè)32位的網(wǎng)絡(luò )序列IP地址。這個(gè)函數的概要如下:

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int inet_aton(const char *string, struct in_addr *addr);

inet_aton函數接受兩個(gè)參數。參數描述如下:

1 輸入參數string包含ASCII表示的IP地址。
2 輸出參數addr是將要用新的IP地址更新的結構。

如果這個(gè)函數成功,函數的返回值非零。如果輸入地址不正確則會(huì )返回零。使用這個(gè)函數并沒(méi)有錯誤碼存放在errno中,所以他的值會(huì )被忽略。

對于這個(gè)函數有一點(diǎn)迷惑的就是這個(gè)函數調用所需要的兩個(gè)參數。如果我們定義了一個(gè)AF_INET套接口地址:

struct sockaddr_in adr_inet;    /* AF_INET */

提供給inet_aton函數調用的參數指針為 &adr_inet.sin_addr

下面這個(gè)程序使用inet_aton函數,而不是我們在前面所談到的in_addr函數。
/*
 * inetaton.c
 *
 * Example using inet_aton
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

/*
 * this function reports the error and
 * exits back to the shell
 */
static void bail(const char *on_what)
{
    fputs(on_what,stderr);
    fputs("\n",stderr);
}

int main(int argc,char **argv)
{
    int z;
    struct sockaddr_in adr_inet;    /* AF_INET */
    int len_inet;            /* length */
    int sck_inet;            /* Socket */

    /* Create a Socket */
    sck_inet = socket(AF_INET,SOCK_STREAM,0);

    if(sck_inet == -1)
    bail("Socket()");

    /* Establish address */
    memset(&adr_inet,0,sizeof adr_inet);
    adr_inet.sin_family = AF_INET;
    adr_inet.sin_port = htons(9000);

    if( !inet_aton("127.0.0.1",&adr_inet.sin_addr))
    bail("bad address");

    len_inet = sizeof adr_inet;

    /* Bind it to the socket */
    z = bind(sck_inet,(struct sockaddr *)&adr_inet,len_inet);

    if(z == -1)
    bail("bind()");

    /* Display our socket address */
    system("netstat -pa --tcp 2>/dev/null"
        " | grep inetaton");

    return 0;
}
程序的運行結果如下:
S$ ./inetaton
tcp 0 0 127.0.0.23:9000 *:* CLOSE 1007/inetaton

使用inet_ntoa(3)函數

有時(shí)一個(gè)套接口地址代表一個(gè)連接到我們服務(wù)器的用戶(hù)的地址,或者是一個(gè)UDP包。將一個(gè)網(wǎng)絡(luò )順序的32位值轉換為一個(gè)點(diǎn)分隔的IP地址值是不方便的。從而提供了inet_ntoa函數。這個(gè)函數的概要如下:
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
char *inet_ntoa(struct in_addr addr);

這個(gè)函數僅需要一個(gè)輸入參數addr。注意struct in_addr是網(wǎng)絡(luò )套接口地址的一個(gè)內部部分。這個(gè)地址被轉換為函數個(gè)內部的的static緩沖區。字符數組的指針作為返回值返回。只有當下一次調用這個(gè)函數時(shí)結果才會(huì )可用。

如果在我們的程序中addr作為一個(gè)sockaddr_in結構而存在,那么下面的代碼就顯示了如何使用inet_ntoa函數來(lái)執行這個(gè)轉換。IP地址轉換為一個(gè)字符串,并且使用printf函數進(jìn)行輸出。

struct sockaddr_in addr;   /* Socket Address */
printf("IP ADDR: %s\n",
    inet_ntoa(addr.sin_addr));
下面提供一個(gè)完整的程序例子。
/*
 * inetntoa.c:
 *
 * Example using inet_ntoa(3):
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc,char **argv)
{
    struct sockaddr_in adr_inet;    /* AF_INET */
    int len_inet;            /* length */

    /*
     * Establish address (pretend we got
     * this address from a connecting client):
     */
    memset(&adr_inet,0,sizeof adr_inet);

    adr_inet.sin_family = AF_INET;
    adr_inet.sin_port = htons(9000);

    if(!inet_aton("127.0.0.23",&adr_inet.sin_addr))
    puts("bad address");

    len_inet = sizeof adr_inet;

    /*
     * Demonstrate use of inet_ntoa(3):
     */
    printf("The IP Address is %s\n",
        inet_ntoa(adr_inet.sin_addr));

    return 0;
}
這個(gè)程序的運行結果如下:
$ ./inetntoa
The IP Address is 127.0.0.23

使用inet_network(3)

有時(shí)會(huì )有這樣的情況,將一個(gè)點(diǎn)分隔的IP地址轉換為一個(gè)32位的主機順序的值是比較方便的。當我們要執行掩碼值從地址中得到主機位或是網(wǎng)絡(luò )位是更為方便。

inet_network的函數概要如下:
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
unsigned long inet_network(const char *addr);

這個(gè)函數需要一個(gè)在參數addr中包含一個(gè)點(diǎn)分隔的地址輸入字符串。返回值是IP地址的32位值,但是以主機順序的格式而存在。然而,如果輸入值不合法,返回結果就會(huì )為0xFFFFFFFF。

擁有一個(gè)主機端順序的返回值意味著(zhù)我們可以安全的執行掩碼或是位操作。如果返回值為網(wǎng)絡(luò )端順序,那么對于不同的CPU平臺就會(huì )有不同的操作。

下面的例子程序演示了如何使用inet_network函數。下面顯示了如何從一個(gè)C地址得到一個(gè)網(wǎng)絡(luò )地址:
unsigned long net_addr;
net_addr =
    inet_network("192.168.9.1") & 0xFFFFFF00;
賦給net_addr的值應為)0xC0A80900(或者是點(diǎn)分隔的192.168.9.0)。與操作屏蔽掉低8位從而得到網(wǎng)絡(luò )ID,而沒(méi)有主機ID。
/*
 * network.c
 *
 * Example using inet_network(3):
 */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc,char **argv)
{
    int x;
    const char *addr[]={
    "44.135.86.12",
    "127.0.0.1",
    "172.16.23.95",
    "192.168.9.1"
    };
    unsigned long net_addr;

    for(x=0;x<4;x++)
    {
    net_addr = inet_network(addr[x]);
    printf("%14s = 0x%08lX net 0x%08lX\n",
        addr[x],net_addr,(unsigned long)htonl(net_addr));
    }
    return 0;
}
程序的運行結果如下:
$ ./network
  44.135.86.12 = 0x2C87560C net 0x0C56872C
     127.0.0.1 = 0x7F000001 net 0x0100007F
  172.16.23.95 = 0xAC10175F net 0x5F1710AC
   192.168.9.1 = 0xC0A80901 net 0x0109A8C0
$

使用inet_lnaof(3)函數

inet_lnaof函數將一個(gè)包含在套接口地址中的網(wǎng)絡(luò )字節順序的IP地址轉換為一個(gè)主機ID,而沒(méi)有網(wǎng)絡(luò )ID。返回值為主機端順序。

這個(gè)函數省去我們確定IP地址然后得到主機ID部分的繁瑣操作。這個(gè)函數的概要如下:
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
unsigned long inet_lnaof(struct in_addr addr);

輸入參數必須為我們通常操作所用的套接口地址的struct in_addr成員。這個(gè)值必須為網(wǎng)絡(luò )字節順序,而這也正是這個(gè)函數所要求的。下面的例子演示了如何使用一個(gè)sockaddr_in地址為調用這個(gè)函數:

struct sockaddr_in addr;   /* Socket Address */
unsigned long host_id;     /* Host ID number */
host_id = inet_lnaof(addr.sin_addr);

下表列出了一些可以應用inet_lnaof函數的值以及返回結果。
IP Number    Class Hexadecimal Dotted-Quad
44.135.86.12 A     0087560C    0.135.86.12
127.0.0.1    A     00000001    0.0.0.1
172.16.23.95 B     0000175F    0.0.23.95
192.168.9.1  C     00000001    0.0.0.1

我們可以注意到在上表中A類(lèi)地址在反回結果中只有第一個(gè)字節為0,而B(niǎo)類(lèi)地址在返回結果高十六位為0.最后C類(lèi)地址前三個(gè)字節為0,只保留最后一位的主機號。

使用inet_netof(3)函數

inet_netof函數是與inet_lnaof函數相對的。inet_netof函數返回網(wǎng)絡(luò )ID而不是主機ID。在其他方面,這兩個(gè)函數是相同的。這個(gè)函數的概要如下:

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
unsigned long inet_netof(struct in_addr addr);

如下面的例子所示:
struct sockaddr_in addr;   /* Socket Address */
unsigned long net_id;     /* Network ID number */
net_id = inet_netof(addr.sin_addr);

下表列出這個(gè)函數的一些例子返回值:
IP Number    Class Hexadecimal Dotted-Quad
44.135.86.12 A     0000002C    0.0.0.44
127.0.0.1    A     0000007F    0.0.0.127
172.16.23.95 B     0000AC10    0.0.172.16
192.168.9.1  C     00C0A809    0.192.168.9

使用inet_makeaddr(3)函數

使用inet_netof與inet_lnaof函數我們可以得到主機ID與網(wǎng)絡(luò )ID。要使用網(wǎng)絡(luò )ID與主機ID重新組合為IP地址,我們可以使用inet_makeaddr函數。這個(gè)函數的概要如下:
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
struct in_addr inet_makeaddr(int net,int host);

這個(gè)函數的參數描述如下:
1 net參數是網(wǎng)絡(luò )ID,右對齊并且是主機端順序。這也由函數inet_netof函數的返回值相同。
2 host參數是主機ID,主機端順序。這也由函數inet_lnaof返回值相同。

返回值存放在sockaddr_in套接口地址中的struct in_addr成員中。這個(gè)值是網(wǎng)絡(luò )字節順序。

下面所演示的例子程序使用了inet_netof,inet_lnaof,inet_makeaddr三個(gè)函數。sockaddr_in結構中的IP地址將會(huì )被分解為主機ID與網(wǎng)絡(luò )ID。然后套接口地址清零,并且由剛才得到的網(wǎng)絡(luò )部分與主機部分重新進(jìn)行組合。
/*
 * makeaddr.c
 *
 * Demonstrate inet_lnaof,inet_netof
 * and inet_makeaddr functions
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc,char **argv)
{
    int x;
    struct sockaddr_in adr_inet;    /* AF_INET */
    const char *addr[] =
    {
    "44.135.86.12",
    "127.0.0.1",
    "172.16.23.95",
    "192.168.9.1"
    };
    unsigned long net,hst;

    for(x=0;x<4;x++)
    {
    /*
     * Create a socket address
     */
    memset(&adr_inet,0,sizeof adr_inet);
    adr_inet.sin_family = AF_INET;
    adr_inet.sin_port = htons(9000);

    if(!inet_aton(addr[x],&adr_inet.sin_addr))
        puts("bad address");

    /*
     * Split address into Host & Net ID
     */
    hst = inet_lnaof(adr_inet.sin_addr);
    net = inet_netof(adr_inet.sin_addr);

    printf("%14s : net=0x%08lx host=0x%08lx\n",
        inet_ntoa(adr_inet.sin_addr),net,hst);

    /*
     * Zero the address to prove later that
     * we can reconstruct this value:
     */
    memset(&adr_inet,0,sizeof adr_inet);
    adr_inet.sin_family = AF_INET;
    adr_inet.sin_port = htons(9000);

    adr_inet.sin_addr = inet_makeaddr(net,hst);

    /*
     * Now display the reconstructed address;
     */
    printf("%14s : %s\n\n",
        "inet_makeaddr",
        inet_ntoa(adr_inet.sin_addr));
    }
    return 0;
}
程序的運行結果如下:
$ ./makeaddr
   44.135.86.12 : net=0x0000002C host=0x0087560C
  inet_makeaddr : 44.135.86.12
      127.0.0.1 : net=0x0000007F host=0x00000001
  inet_makeaddr : 127.0.0.1
   172.16.23.95 : net=0x0000AC10 host=0x0000175F
  inet_makeaddr : 172.16.23.95
    192.168.9.1 : net=0x00C0A809 host=0x00000001
  inet_makeaddr : 192.168.9.1
$

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1642954


[收藏到我的網(wǎng)摘]   mylxiaoyi發(fā)表于 2007年06月07日 20:47:00
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Linux編程常用的函數(八) 網(wǎng)絡(luò )編程
struct sockaddr 與 struct sockaddr_in的結構說(shuō)明
組播編程
TCP協(xié)議套接字
Socket理解之地址族
網(wǎng)絡(luò )socket編程指南
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久