總結一下遇到的幾個sockaddr數據結構的用法-philarlala
- /***********ipv4的套接字地址*********************************/
- struct sockaddr_in {
- __kernel_sa_family_t sin_family; /* AF_INET */
- __be16 sin_port; /* Port number */
- struct in_addr sin_addr; /* Internet address */
- /* Pad to size of `struct sockaddr". */
- unsigned char __pad[__SOCK_SIZE__ - sizeof(short int) -
- sizeof(unsigned short int) - sizeof(struct in_addr)];
- };
- /********* ipv6的套接字地址***********************/
- struct sockaddr_in6 {
- unsigned short int sin6_family; /* AF_INET6 */
- __be16 sin6_port; /* Transport layer port # */
- __be32 sin6_flowinfo; /* IPv6 flow information */
- struct in6_addr sin6_addr; /* IPv6 address */
- __u32 sin6_scope_id; /* scope id (new in RFC2553) */
- };
- /*********netlink通訊的套接字地址**************************/
- struct sockaddr_nl {
- __kernel_sa_family_t nl_family; /* AF_NETLINK */
- unsigned short nl_pad; /* zero */
- __u32 nl_pid; /* port ID */
- __u32 nl_groups; /* multicast groups mask */
- };
- /*設備無關的物理層地址結構,通過setsockopt可以設置網卡的多播或混雜模*/
- struct sockaddr_ll {
- unsigned short sll_family; /* AF_PACKET*/
- __be16 sll_protocol;
- int sll_ifindex;
- unsigned short sll_hatype;
- unsigned char sll_pkttype;
- unsigned char sll_halen;
- unsigned char sll_addr[8];
- };
linux 2.0 以前的版本是用struct sockaddr_pkt 的,而且獲取二層的socket是通過socket(AF_INET, SOCK_PACKET, protocol)來獲取的,並沒有AF_PACKET 這個domain ,只有SOCK_PACKET這個socket_type
- /*********通用套接字地址**************************/
- struct sockaddr {
- sa_family_t sa_family; /* address family, AF_xxx */
- char sa_data[14]; /* 14 bytes of protocol address */
- };
- #define _K_SS_MAXSIZE 128 /* Implementation specific max size */
- #define _K_SS_ALIGNSIZE (__alignof__ (struct sockaddr *))
- /* Implementation specific desired alignment */
- typedef unsigned short __kernel_sa_family_t;
- #define sockaddr_storage __kernel_sockaddr_storage
- struct __kernel_sockaddr_storage {
- __kernel_sa_family_t ss_family; /* address family */
- /* Following field(s) are implementation specific */
- char __data[_K_SS_MAXSIZE - sizeof(unsigned short)];
- /* space to achieve desired size, */
- /* _SS_MAXSIZE value minus size of ss_family */
- } __attribute__ ((aligned(_K_SS_ALIGNSIZE))); /* force desired alignment */
- 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參數包含了名字的實際位元組數。


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,加速基因組數據分析