溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C語言sockaddr和sockaddr_in的區(qū)別什么是

發(fā)布時間:2021-08-16 18:08:00 來源:億速云 閱讀:131 作者:chen 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“C語言sockaddr和sockaddr_in的區(qū)別什么是”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“C語言sockaddr和sockaddr_in的區(qū)別什么是”吧!

一、sockaddr

sockaddr在頭文件#include <sys/socket.h>中定義,sockaddr的缺陷是:sa_data把目標(biāo)地址和端口信息混在一起了,如下:

struct sockaddr {  
     sa_family_t sin_family;//地址族
    char sa_data[14]; //14字節(jié),包含套接字中的目標(biāo)地址和端口信息               
   };

二、sockaddr_in

sockaddr_in在頭文件#include<netinet/in.h>或#include <arpa/inet.h>中定義,該結(jié)構(gòu)體解決了sockaddr的缺陷,把port和addr 分開儲存在兩個變量中,如下: 

C語言sockaddr和sockaddr_in的區(qū)別什么是

sin_port和sin_addr都必須是網(wǎng)絡(luò)字節(jié)序(NBO),一般可視化的數(shù)字都是主機(jī)字節(jié)序(HBO)。

三、總結(jié)

二者長度一樣,都是16個字節(jié),即占用的內(nèi)存大小是一致的,因此可以互相轉(zhuǎn)化。二者是并列結(jié)構(gòu),指向sockaddr_in結(jié)構(gòu)的指針也可以指向sockaddr。

sockaddr常用于bind、connect、recvfrom、sendto等函數(shù)的參數(shù),指明地址信息,是一種通用的套接字地址。 

sockaddr_in 是internet環(huán)境下套接字的地址形式。所以在網(wǎng)絡(luò)編程中我們會對sockaddr_in結(jié)構(gòu)體進(jìn)行操作,使用sockaddr_in來建立所需的信息,最后使用類型轉(zhuǎn)化就可以了。一般先把sockaddr_in變量賦值后,強(qiáng)制類型轉(zhuǎn)換后傳入用sockaddr做參數(shù)的函數(shù):sockaddr_in用于socket定義和賦值;sockaddr用于函數(shù)參數(shù)。

例子如下:

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
 
int main(int argc,char **argv)
{
    int sockfd;
    struct sockaddr_in mysock;
 
    sockfd = socket(AF_INET,SOCK_STREAM,0);  //獲得fd
 
    bzero(&mysock,sizeof(mysock));  //初始化結(jié)構(gòu)體
    mysock.sin_family = AF_INET;  //設(shè)置地址家族
    mysock.sin_port = htons(800);  //設(shè)置端口
    mysock.sin_addr.s_addr = inet_addr("192.168.1.0");  //設(shè)置地址
    bind(sockfd,(struct sockaddr *)&mysock,sizeof(struct sockaddr); /* bind的時候進(jìn)行轉(zhuǎn)化 */
    ... ...
    return 0;
}

題外話,兩個函數(shù) htons() 和 inet_addr()。

htons()作用是將端口號由主機(jī)字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序的整數(shù)值。(host to net)

inet_addr()作用是將一個IP字符串轉(zhuǎn)化為一個網(wǎng)絡(luò)字節(jié)序的整數(shù)值,用于sockaddr_in.sin_addr.s_addr。

inet_ntoa()作用是將一個sin_addr結(jié)構(gòu)體輸出成IP字符串(network to ascii)。比如:

printf("%s",inet_ntoa(mysock.sin_addr));

htonl()作用和htons()一樣,不過它針對的是32位的(long),而htons()針對的是兩個字節(jié),16位的(short)。

與htonl()和htons()作用相反的兩個函數(shù)是:ntohl()和ntohs()。 

C語言sockaddr和sockaddr_in的區(qū)別什么是

到此,相信大家對“C語言sockaddr和sockaddr_in的區(qū)別什么是”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI