【c++】sockaddr,sockaddr_in

struct sockaddr和struct sockaddr_in這兩個結構體用來處理網絡通信的地址。在各種系統調用或者函數中,只要和網絡地址打交道,就得用到這兩個結構體。網絡中的地址包含3個方面的屬性:
1 地址類型; 2 ip地址; 3 端口

上圖看結構:

#include <sys/in.h>

這裏寫圖片描述

#include <sys/socket.h>

這裏寫圖片描述

#include <sockaddr.h>

這裏寫圖片描述

我們從這個宏定義開始,可以看到宏__SOCKADDR_COMMON事實上是聲明一個變量,類型是unsigned short int,sa_prefix是變量名的前綴,宏的##表示連接的意思,即family作爲變量名的後半部分,所以我們在socket編程的時候是爲變量sin_family賦值。
另外宏裏面還可以使用#,表示把宏參數變爲一個字符串。

講解了宏__SOCKADDR_COMMON的含義,sockaddr和sockaddr_in的結構內容相信大家都能看懂,我們注意一下,sockaddr和sockaddr_in第一個變量都是用2字節存放地址類型,區別在於sockaddr_in第二個和第三個變量端口號和地址,第四個變量是字節填充,而sockaddr只剩下第二個變量放置data,可以看到這兩個結構體的長度是一樣的。

在平常編程中把類型、ip地址、端口填充sockaddr_in結構體,然後強制轉換成sockaddr,作爲參數傳遞給系統調用函數。
這裏寫圖片描述

sockaddr常用於bind、connect、recvfrom、sendto等函數的參數,指明地址信息。是一種通用的套接字地址。而sockaddr_in是internet環境下套接字的地址形式。所以在網絡編程中我們會對sockaddr_in結構體進行操作。使用sockaddr_in來建立所需的信息,最後使用類型轉化就可以了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章