日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sockaddr数据结构

發布時間:2025/4/5 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sockaddr数据结构 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1 sockaddr數據結構
      • 1.1 sockaddr數據結構詳解
      • 1.2 地址族字段詳解

1 sockaddr數據結構

1.1 sockaddr數據結構詳解

很多網絡編程函數誕生早于IPv4協議,那時候都使用的是sockaddr結構體,為了向前兼容,現在sockaddr退化成了(void *)的作用,傳遞一個地址給函數,至于這個函數是sockaddr_in還是其他的,由地址族確定,然后函數內部再強制類型轉化為所需的地址類型。

通用套接字地址格式:

/* POSIX.1g 規范規定了地址族為2字節的值. */ typedef unsigned short int sa_family_t; /* 描述通用套接字地址 */ struct sockaddr{sa_family_t sa_family; /* 地址族. 16-bit*/char sa_data[14]; /* 具體的地址值 112-bit */ };

IPv4 套接字格式地址:

/* IPV4套接字地址,32bit值. */ typedef uint32_t in_addr_t; struct in_addr {in_addr_t s_addr; };/* 描述IPV4的套接字地址格式 */ struct sockaddr_in {sa_family_t sin_family; /* 16-bit */in_port_t sin_port; /* 端口口 16-bit*/struct in_addr sin_addr; /* Internet address. 32-bit *//* 這里僅僅用作占位符,不做實際用處 */unsigned char sin_zero[8]; };

IPv4的地址格式定義在netinet/in.h中,IPv4地址用sockaddr_in結構體表示,包括16位端口號和32位IP地址,但是sock API的實現早于ANSI C標準化,那時還沒有void *類型,因此這些像bind 、accept函數的參數都用struct sockaddr *類型表示,在傳遞參數之前要強制類型轉換一下,例如:

struct sockaddr_in servaddr; bind(listen_fd, (struct sockaddr *)&servaddr, sizeof(servaddr)); /* initialize servaddr */

IPv6 套接字地址格式:

struct sockaddr_in6 {sa_family_t sin6_family; /* 16-bit */in_port_t sin6_port; /* 傳輸端口號 # 16-bit */uint32_t sin6_flowinfo; /* IPv6流控信息 32-bit*/struct in6_addr sin6_addr; /* IPv6地址128-bit */uint32_t sin6_scope_id; /* IPv6域ID 32-bit */ };

整個結構體長度是 28 個字節,其中流控信息和域 ID 先不用管,這兩個字段,一個在 glibc 的官網上根本沒出現,另一個是當前未使用的字段。這里的地址族顯然應該是 AF_INET6,端口同 IPv4 地址一樣,關鍵的地址從 32 位升級到 128 位,這個數字就大到恐怖了,完全解決了尋址數字不夠的問題。

本地套接字地址格式:

struct sockaddr_un {unsigned short sun_family; /* 固定為 AF_LOCAL */char sun_path[108]; /* 路徑名 */ };

各種套接字對比分析:

1.2 地址族字段詳解

地址族字段,它表示使用什么樣的方式對地址進行解釋和保存。地址族在 glibc 里的定義非常多,常用的有以下幾種:

  • AF_LOCAL:表示的是本地地址,對應的是 Unix 套接字,這種情況一般用于本地 socket 通信,很多情況下也可以寫成 AF_UNIX、AF_FILE;
  • AF_INET:因特網使用的 IPv4 地址;
  • AF_INET6:因特網使用的 IPv6 地址。

這里的 AF_ 表示的含義是 Address Family,但是很多情況下,我們也會看到以 PF_ 表示的宏,比如 PF_INET、PF_INET6 等,實際上 PF_ 的意思是 Protocol Family,也就是協議族的意思。我們用 AF_xxx 這樣的值來初始化 socket 地址,用 PF_xxx 這樣的值來初始化 socket。我們在 <sys/socket.h> 頭文件中可以清晰地看到,這兩個值本身就是一一對應的。

/* 各種地址族的宏定義 */ #define AF_UNSPEC PF_UNSPEC #define AF_LOCAL PF_LOCAL #define AF_UNIX PF_UNIX #define AF_FILE PF_FILE #define AF_INET PF_INET #define AF_AX25 PF_AX25 #define AF_IPX PF_IPX #define AF_APPLETALK PF_APPLETALK #define AF_NETROM PF_NETROM #define AF_BRIDGE PF_BRIDGE #define AF_ATMPVC PF_ATMPVC #define AF_X25 PF_X25 #define AF_INET6 PF_INET6

參考資料:

  • C/C++從入門到精通-高級程序員之路【奇牛學院】
  • 總結

    以上是生活随笔為你收集整理的sockaddr数据结构的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。