国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Linux Shell > 正文

Linux C中sockaddr和sockaddr_in的區別

2020-07-27 18:53:24
字體:
來源:轉載
供稿:網友

Linux C中sockaddr和sockaddr_in的區別

struct sockaddr和struct sockaddr_in這兩個結構體用來處理網絡通信的地址。

在各種系統調用或者函數中,只要和網絡地址打交道,就得用到這兩個結構體。

網絡中的地址包含3個方面的屬性:

1 地址類型: ipv4還是ipv6
2 ip地址
3 端口

相應的,頭文件有如下定義:

include <netinet/in.h>  struct sockaddr {   unsigned short  sa_family;  // 2 bytes address family, AF_xxx   char       sa_data[14];   // 14 bytes of protocol address };  // IPv4 AF_INET sockets:  struct sockaddr_in {   short      sin_family;    // 2 bytes e.g. AF_INET, AF_INET6   unsigned short  sin_port;  // 2 bytes e.g. htons(3490)   struct in_addr  sin_addr;   // 4 bytes see struct in_addr, below   char       sin_zero[8];   // 8 bytes zero this if you want to };  struct in_addr {   unsigned long s_addr;     // 4 bytes load with inet_pton() }; 

注釋中標明了屬性的含義及其字節大小,這兩個結構體一樣大,都是16個字節,而且都有family屬性,不同的是:

sockaddr用其余14個字節來表示sa_data,而sockaddr_in把14個字節拆分成sin_port, sin_addr和sin_zero分別表示端口、ip地址。sin_zero用來填充字節使sockaddr_in和sockaddr保持一樣大小。

sockaddr和sockaddr_in包含的數據都是一樣的,但他們在使用上有區別:

程序員不應操作sockaddr,sockaddr是給操作系統用的

程序員應使用sockaddr_in來表示地址,sockaddr_in區分了地址和端口,使用更方便。 

一般的用法為:

程序員把類型、ip地址、端口填充sockaddr_in結構體,然后強制轉換成sockaddr,作為參數傳遞給系統調用函數

網絡編程中一段典型的代碼為:

int sockfd; struct sockaddr_in servaddr;  sockfd = Socket(AF_INET, SOCK_STREAM, 0);  /* 填充struct sockaddr_in */ bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(SERV_PORT); inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);  /* 強制轉換成struct sockaddr */ connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr));   

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宜章县| 黎平县| 金坛市| 随州市| 兴山县| 台湾省| 福泉市| 永胜县| 偃师市| 吉隆县| 夹江县| 鄂尔多斯市| 讷河市| 高阳县| 正阳县| 宜都市| 高青县| 台山市| 惠东县| 邹城市| 招远市| 旬阳县| 县级市| 屯昌县| 崇文区| 娱乐| 安岳县| 凤凰县| 乌鲁木齐县| 那曲县| 铁岭市| 冷水江市| 岗巴县| 商洛市| 阳城县| 宁都县| 阿瓦提县| 兴文县| 安乡县| 安西县| 亳州市|