Socket結構區別

2021-08-25 20:52:57 字數 1739 閱讀 5464

struct sockaddr ;

上面是通用的socket位址,具體到internet socket,用下面的結構,二者可以進行型別轉換

struct sockaddr_in ;

struct in_addr就是32位ip位址。

struct in_addr s_un_b;

struct s_un_w;

u_long s_addr;

} s_un;

#define s_addr s_un.s_addr

}; inet_addr()是將乙個點分制的ip位址(如192.168.0.1)轉換為上述結構中需要的32位ip位址(0xc0a80001)。

填值的時候使用sockaddr_in結構,而作為函式(如socket, listen, bind等)的引數傳入的時候轉換成sockaddr結構就行了,畢竟都是16個字元長。

通常的用法是:

int sockfd;

struct sockaddr_in my_addr;

sockfd = socket(af_inet, sock_stream, 0);

my_addr.sin_family = af_inet;

my_addr.sin_port = htons(myport);

my_addr.sin_addr.s_addr = inet_addr("192.168.0.1");

bzero(&(my_addr.sin_zero), 8);

bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));

可以用c++做個不太準確的假設。

sockaddr是base class

sockaddr_in 等是derived class

如此一來,bind, connect , sendto , recvfrom等函式就可以使用base class

來處理多種不同的derived class了。

但是實際上,這是沒有繼承關係資料結構(c嘛),所以需要強制造型來轉換資料型別。正因為如此,在sendto的時候需要給出len長度,因為不同的sockaddr_xx實現長度並不相同。

名詞解析:

主機位元組序:

不同的cpu有不同的位元組序型別,這些位元組序是指整數在記憶體中儲存的順序,這個叫做主機序。最常見的有兩種 1.little endian:低位元組存高位址,高位元組存低位址 2.big endian:低位元組存低位址,高位元組存高位址

網路位元組序:

網路位元組順序是tcp/ip中規定好的一種資料表示格式,它與具體的cpu型別、作業系統等無關,從而可以保證資料在不同主機之間傳輸時能夠被正確解釋。網路位元組順序採用big endian排序方式。

為了進行轉換bsd socket提供了轉換的函式,有下面四個網路與主機位元組轉換函式:

htons ntohs htonl ntohl (s 就是short l是long h是host n是network)

htons 把unsigned short型別從主機序轉換到網路序

htonl 把unsigned long型別從主機序轉換到網路序

ntohs 把unsigned short型別從網路序轉換到主機序,

ntohl 把unsigned long型別從網路序轉換到主機序。

在使用little endian的系統中 這些函式會把位元組序進行轉換 在使用big endian型別的系統中這些函式會定義成空巨集

socket模型區別

如何監控socket的變化 如何通知socket的變化 1.select 應用場合 主要面向的是某些使用u n i x作業系統的計算機,它們採用的是b e r k e l e y套接字方案。s e l e c t模型已整合到winsock 1.1中,它使那些想避免在套接字呼叫過程中被無辜 鎖定 的應...

Socket位址結構

如bind函式的第二個引數型別就是通用套接字位址結構的指標,使用的時候一般需要把乙個ipv4 ipv6套接字位址結構強制轉換成乙個通用通用套接字位址結構再取位址 注意埠和位址都是使用網路位元組序,填寫時需要分別呼叫htons,htonl h host,s 16位short,l 32位long 將主機...

SOCKET位址結構

sockaddr與sockaddr in結構體簡介 struct sockaddr sa family是位址家族,或者叫協議簇,有網際協議 tcpip ipx協議,等等,一般都是 af 的形式。通常大多用的是都是af inet,表示tcpip協議。sa data是14位元組協議位址,裡面的資訊是ip...