當前位置:
首頁 > 知識 > 總結一下遇到的幾個sockaddr數據結構的用法-philarlala

總結一下遇到的幾個sockaddr數據結構的用法-philarlala

  1. /***********ipv4的套接字地址*********************************/
  2. struct sockaddr_in {
  3. __kernel_sa_family_t sin_family; /* AF_INET */
  4. __be16 sin_port; /* Port number */
  5. struct in_addr sin_addr; /* Internet address */
  6. /* Pad to size of `struct sockaddr". */
  7. unsigned char __pad[__SOCK_SIZE__ - sizeof(short int) -
  8. sizeof(unsigned short int) - sizeof(struct in_addr)];
  9. };
  1. /********* ipv6的套接字地址***********************/
  2. struct sockaddr_in6 {
  3. unsigned short int sin6_family; /* AF_INET6 */
  4. __be16 sin6_port; /* Transport layer port # */
  5. __be32 sin6_flowinfo; /* IPv6 flow information */
  6. struct in6_addr sin6_addr; /* IPv6 address */
  7. __u32 sin6_scope_id; /* scope id (new in RFC2553) */
  8. };
  1. /*********netlink通訊的套接字地址**************************/
  2. struct sockaddr_nl {
  3. __kernel_sa_family_t nl_family; /* AF_NETLINK */
  4. unsigned short nl_pad; /* zero */
  5. __u32 nl_pid; /* port ID */
  6. __u32 nl_groups; /* multicast groups mask */
  7. };
  1. /*設備無關的物理層地址結構,通過setsockopt可以設置網卡的多播或混雜模*/
  2. struct sockaddr_ll {
  3. unsigned short sll_family; /* AF_PACKET*/
  4. __be16 sll_protocol;
  5. int sll_ifindex;
  6. unsigned short sll_hatype;
  7. unsigned char sll_pkttype;
  8. unsigned char sll_halen;
  9. unsigned char sll_addr[8];
  10. };
  11. linux 2.0 以前的版本是用struct sockaddr_pkt 的,而且獲取二層的socket是通過socket(AF_INET, SOCK_PACKET, protocol)來獲取的,並沒有AF_PACKET 這個domain ,只有SOCK_PACKET這個socket_type

  1. /*********通用套接字地址**************************/
  2. struct sockaddr {
  3. sa_family_t sa_family; /* address family, AF_xxx */
  4. char sa_data[14]; /* 14 bytes of protocol address */
  5. };
  6. #define _K_SS_MAXSIZE 128 /* Implementation specific max size */
  7. #define _K_SS_ALIGNSIZE (__alignof__ (struct sockaddr *))
  8. /* Implementation specific desired alignment */
  9. typedef unsigned short __kernel_sa_family_t;
  10. #define sockaddr_storage __kernel_sockaddr_storage
  11. struct __kernel_sockaddr_storage {
  12. __kernel_sa_family_t ss_family; /* address family */
  13. /* Following field(s) are implementation specific */
  14. char __data[_K_SS_MAXSIZE - sizeof(unsigned short)];
  15. /* space to achieve desired size, */
  16. /* _SS_MAXSIZE value minus size of ss_family */
  17. } __attribute__ ((aligned(_K_SS_ALIGNSIZE))); /* force desired alignment */
  18. struct sockaddr 和struct sockaddr_storage 都是通用套接字

為了統一各種協議,socket對應的介面就定義了兩個通用結構,分別是sockaddr(16位元組)和sockaddr_storage(128位元組) ,其中sockaddr_storage是為了適配sockaddr_in6(28位元組)這樣長度比較大的協議而後來定義的,如果需要用到sockaddr_storage 這樣的通用套接字,則強轉為sockaddr,並且長度用sizeof(struct sockaddr_storage)

網路編程中的一下幾個介面會用到以上的數據結構

應用層->內核,對應用層來說就是發送的,數據是送到協議棧的,addrlen是入參

int bind (int sockfd, struct sockaddr *my_addr, socklen_t addrlen);

int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);

int sendto (int s, const void *msg, size_t len, int flags, const struct sockaddr *to, socklen_t tolen);

內核->應用層的,對應用層來說就是接收的,數據從協議棧上來的,addrlen是值-結果參數

int accept (int s, struct sockaddr *addr, socklen_t *addrlen);

int recvfrom (int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen);

int getpeername(int s, struct sockaddr *name, socklen_t *namelen);

int getsockname(int s, struct sockaddr *name, socklen_t *namelen);

getsockname: 返回本地協議地址:getpeername:返回遠程協議地址

適用場景:

1.當不用bind或調用bind沒有指定本地協議地址時,可以調用getsockname來返回內核分配給此連接的本地IP地址和埠號,還可以獲得某套介面的協議族。

2.當一個新的連接建立時,伺服器也可以調用getsockname來獲得分配給此連接的本地IP地址。

3.當一個伺服器的子進程調用exec函數啟動執行時,只能調用getpeername函數來獲得客戶的Ip地址和埠號。

4.未調用bind就調用了connect,這時唯有getsockname調用可以獲知系統內定的本地地址。在返回時,namelen參數包含了名字的實際位元組數。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 達人科技 的精彩文章:

NetCore1.1+Linux部署初體驗

TAG:達人科技 |

您可能感興趣

如果Facebook告訴你 你的數據被Cambridge Analytica使用
Salesforce數據現在可以導入到Google Analytics 360中了
阻止Facebook跟蹤數據的Firefox開源插件Facebook Container
Spring Boot與Kotlin使用Spring-data-jpa簡化數據訪問層
talmo-design-cables數據線品牌與包裝設計
Veritas收購雲數據管理公司fluid Operations AG
奇簡 Terark:數據壓縮存儲方面,我們幹掉了 Facebook、Google
Facebook後 Twitter被指出售數據給同一個研究員
Twitter 開源數據分析工具——tinfoleak
奇簡 Terark:數據壓縮存儲方面,我們幹掉了 Facebook、Google|創業
用戶數據泄露三連彈:Facebook、安德瑪&Panera Bread
Facebook 稱谷歌和 Twitter 也會收集數據
Alphabet 旗下的 Sidewalk Labs 成立了一家子公司,想用大數據讓城市美好
FB及Cambridge Analytica因用戶數據泄露事件面臨訴訟
基於Markov Chain Monte Carlo的智能手錶睡眠數據分析
數據挖掘平台Discover解鎖Tensorflow
Young Academy:unleash young的群體智慧,解碼26個月長PFS數據背後的真相
您的Apple iCloud數據現在存儲在Google伺服器上-感到驚訝嗎?
受Facebook隱私醜聞影響,Instagram將開放數據下載功能
Illumina收購Edico Genome,加速基因組數據分析