addrinfo& sockaddr結(jié)構(gòu)解析

1 addrinfo

addrinfo結(jié)構(gòu)內(nèi)容如下:

struct addrinfo {
    int ai_flags;   /* AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST */
    int ai_family;  /* PF_xxx */
    int ai_socktype;    /* SOCK_xxx */
    int ai_protocol;    /* 0 or IPPROTO_xxx for IPv4 and IPv6 */
    socklen_t ai_addrlen;   /* length of ai_addr */
    char    *ai_canonname;  /* canonical name for hostname */
    struct  sockaddr *ai_addr;  /* binary address */
    struct  addrinfo *ai_next;  /* next structure in linked list */
};

1.1 ai_family

ai_family指定了地址族会喝,可取值如下:

取值 含義
AF_INET 2 IPv4
AF_INET6 23 IPv6
AF_UNSPEC 0 協(xié)議無關(guān)
void print_family(struct addrinfo *aip)
{
    printf(" family ");
    switch (aip->ai_family) {
    case AF_INET:
        printf("inet");
        break;T
    case AF_INET6:
        printf("inet6");
        break;
    case AF_UNIX:
        printf("unix");
        break;
    case AF_UNSPEC:
        printf("unspecified");
        break;
    default:
        printf("unknown");
    }
}

1.2 ai_socketype

取值 含義
SOCK_STREAM 1 數(shù)據(jù)流協(xié)議
SOCK_DGRAM 2 數(shù)據(jù)報協(xié)議
void print_type(struct addrinfo *aip)
{
    printf(" type ");
    switch (aip->ai_socktype) {
    case SOCK_STREAM:
        printf("stream");
        break;
    case SOCK_DGRAM:
        printf("datagram");
        break;
    case SOCK_SEQPACKET:
        printf("seqpacket");
        break;
    case SOCK_RAW:
        printf("raw");
        break;
    default:
        printf("unknown (%d)", aip->ai_socktype);
    }
}

1.3 ai_protocol

取值 含義
IPPROTO_IP 0 IP協(xié)議
IPPROTO_IPV4 4 IPv4
IPPROTO_IPV6 41 IPv6
IPPROTO_UDP 17 UDP
IPPROTO_TCP 6 TCP
void print_protocol(struct addrinfo *aip)
{
    printf(" protocol ");
    switch (aip->ai_protocol) {
    case 0:
        printf("default");
        break;
    case IPPROTO_TCP:
        printf("TCP");
        break;
    case IPPROTO_UDP:
        printf("UDP");
        break;
    case IPPROTO_RAW:
        printf("raw");
        break;
    default:
        printf("unknown (%d)", aip->ai_protocol);
    }
}

1.4 ai_flags

取值 含義
AI_PASSIVE 1 被動的心褐,用于bind尖飞,通常用于server socket
AI_CANONNAME 2 用于返回主機的規(guī)范名稱
AI_NUMERICHOST 4 地址為數(shù)字串
void print_flags(struct addrinfo *aip)
{
    printf("flags");
    if (aip->ai_flags == 0) {
        printf(" 0");
    } else {
        if (aip->ai_flags & AI_PASSIVE)
            printf(" passive");
        if (aip->ai_flags & AI_CANONNAME)
            printf(" canon");
        if (aip->ai_flags & AI_NUMERICHOST)
            printf(" numhost");
#if defined(AI_NUMERICSERV)
        if (aip->ai_flags & AI_NUMERICSERV)
            printf(" numserv");
#endif
#if defined(AI_V4MAPPED)
        if (aip->ai_flags & AI_V4MAPPED)
            printf(" v4mapped");
#endif
#if defined(AI_ALL)
        if (aip->ai_flags & AI_ALL)
            printf(" all");
#endif
    }
}

1.5 sockaddr

套接字體制二級制表示。詳見第2節(jié)忘晤。

2. sockaddr & sockaddr_in

sockaddr:

struct sockaddr {
    unsigned  short  sa_family;     /* address family, AF_xxx */
    char  sa_data[14];                 /* 14 bytes of protocol address */
};
  • sa_family是地址家族,一般都是“AF_xxx”的形式。好像通常大多用的是都是AF_INET
  • sa_data是14字節(jié)協(xié)議地址

此數(shù)據(jù)結(jié)構(gòu)用做bind寄摆、connect、recvfrom修赞、sendto等函數(shù)的參數(shù)婶恼,指明地址信息。但一般編程中并不直接針對此數(shù)據(jù)結(jié)構(gòu)操作柏副,而是使用另一個與sockaddr等價的數(shù)據(jù)結(jié)構(gòu):sockaddr_in:

// sockaddr_in(在netinet/in.h中定義):
struct  sockaddr_in {
  short  int  sin_family;                      /* Address family */
  unsigned  short  int  sin_port;       /* Port number */
  struct  in_addr  sin_addr;              /* Internet address */
  unsigned  char  sin_zero[8];         /* Same size as struct sockaddr */
};

struct in_addr {
  __be32 s_addr;
};
  • sin_family指代協(xié)議族勾邦,在socket編程中只能是AF_INET
  • sin_port存儲端口號(使用網(wǎng)絡(luò)字節(jié)順序)
  • sin_addr存儲IP地址,使用in_addr這個數(shù)據(jù)結(jié)構(gòu)割择,sin_addr按照網(wǎng)絡(luò)字節(jié)順序存儲IP地址
  • sin_zero是為了讓sockaddrsockaddr_in兩個數(shù)據(jù)結(jié)構(gòu)保持大小相同而保留的空字節(jié)眷篇。

sockaddr_insockaddr是并列的結(jié)構(gòu),指向sockaddr_in的結(jié)構(gòu)體的指針也可以指向
sockadd的結(jié)構(gòu)體荔泳,并代替它蕉饼。也就是說,你可以使用sockaddr_in建立你所需要的信息,
在最后用進行類型轉(zhuǎn)換就可以了bzero((char*)&mysock,sizeof(mysock));

//初始化:
mysock; // 結(jié)構(gòu)體名
mysock.sa_family=AF_INET;
mysock.sin_addr.s_addr=inet_addr("192.168.0.1");

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末玛歌,一起剝皮案震驚了整個濱河市昧港,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沾鳄,老刑警劉巖慨飘,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異译荞,居然都是意外死亡瓤的,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門吞歼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來圈膏,“玉大人,你說我怎么就攤上這事篙骡』ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵糯俗,是天一觀的道長尿褪。 經(jīng)常有香客問我,道長得湘,這世上最難降的妖魔是什么杖玲? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮淘正,結(jié)果婚禮上摆马,老公的妹妹穿的比我還像新娘臼闻。我一直安慰自己,他們只是感情好囤采,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布述呐。 她就那樣靜靜地躺著,像睡著了一般蕉毯。 火紅的嫁衣襯著肌膚如雪乓搬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天代虾,我揣著相機與錄音缤谎,去河邊找鬼。 笑死褐着,一個胖子當著我的面吹牛坷澡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播含蓉,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼频敛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了馅扣?” 一聲冷哼從身側(cè)響起斟赚,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎差油,沒想到半個月后拗军,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡蓄喇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年发侵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妆偏。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡刃鳄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钱骂,到底是詐尸還是另有隱情叔锐,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布见秽,位于F島的核電站愉烙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏解取。R本人自食惡果不足惜步责,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧勺择,春花似錦、人聲如沸伦忠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昆码。三九已至气忠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赋咽,已是汗流浹背旧噪。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留脓匿,地道東北人淘钟。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像陪毡,于是被迫代替她去往敵國和親米母。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 研究IPv6 socket編程原因: Supporting IPv6 in iOS 9 WWDC2015蘋果宣布在...
    li大鵬閱讀 7,337評論 7 15
  • 網(wǎng)絡(luò)模型 物理層 物理層表示的是比特流傳輸毡琉,通常包括串口/COM口铁瞒、并行/LPT口、USB桅滋、網(wǎng)線接口慧耍、電話線接口;...
    秋風(fēng)弄影閱讀 720評論 0 2
  • socket通信原理 socket又被叫做套接字,它就像連接到兩端的插座孔一樣,通過建立管道丐谋,將兩個不同的進程之間...
    jiodg45閱讀 1,144評論 0 1
  • 系統(tǒng)與網(wǎng)絡(luò)編程 OSI模型 應(yīng)用層芍碧,表示層,會話層号俐,傳輸層师枣,網(wǎng)絡(luò)層,數(shù)據(jù)鏈路層萧落,物理層 socket 在網(wǎng)絡(luò)編程中...
    I踏雪尋梅閱讀 846評論 0 1
  • 在美麗的海南島上有那么一個地方践美,緊靠瓊州海峽,椰林遍地找岖,四季花開陨倡,她有一個美麗的名字-海口许布,還有一個熱帶風(fēng)情...
    李小嬋閱讀 486評論 1 1