sockaddr in和sockaddr二者區別

2021-06-07 05:08:06 字數 2598 閱讀 9196

2011-07-29 15:28

482人閱讀

(0)收藏

舉報[cpp]view plain

copy

print?

structsockaddr   ;    

sockaddr_in和sockaddr結構的關係

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

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

[cpp]view plain

copy

print?

structsockaddr_in   ;    

struct in_addr這個結構就是儲存ip位址。

[cpp]view plain

copy

print?

typedef

structin_addr s_un_b;  

structs_un_w;  

structs_un;  

}   

}in_addr;   

下面舉例說明一下用法

[cpp]view plain

copy

print?

/*sockadddr_in結構體用作bind、connect、recvfrom、sendto等函式的引數*/

intsockfd;    

sockfd   =   socket(af_inet,   sock_stream,   0);    //socket函式建立乙個socket,並指定通訊方式。

structsockaddr_in   my_addr;    

/*為此結構體賦值*/

my_addr.sin_family   =   af_inet;       

my_addr.sin_port   =   htons(myport); //採用htons函式轉換為網路位元組序

my_addr.sin_addr.s_addr   =   inet_addr("192.168.0.1"

);    

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

bind(sockfd,   (structsockaddr   *)&my_addr,sizeof(structsockaddr));  

關於上面程式中部分難點的講解。

(1)socket函式

函式原型: socket socket(int af, int type, int protocal);

引數: af: 指代協議簇,在socket程式設計中只能使用af_inet

type:為新的socket指定傳輸型別。在windows scokets只能使用以下兩種型別

sock_stream 即tcp

sock_dgram即udp

protocal:用於指定協議簇的特定協議,一般情況下賦值為0 是正確的。

函式功能:socket函式產生乙個socket描述符,並與所分配的資源相聯絡,和繫結特定的傳輸服務。

返回值:如果沒有錯誤發生,那麼socket函式將返回乙個指向新socket的描述符。否則,乙個invalid_socket 值返回。

(2)主機位元組序:

不同的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型別的系統中這些函式會定義成空巨集。

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

sockaddr和sockaddr in的區別

struct sockaddr和struct sockaddr in這兩個結構體用來處理網路通訊的位址。在各種系統呼叫或者函式中,只要和網路位址打交道,就得用到這兩個結構體。1 位址型別 ipv4還是ipv6 2 ip位址 3 埠 相應的,標頭檔案有如下定義 c include struct soc...

sockaddr和sockaddr in的區別

from 初學者很容易對二者有困惑的感覺,下面來講一下二者的區別。sockaddr是在標頭檔案 usr include bits socket.h 中定義的,如下 view source print?1.structsockaddr 2.而sockaddr in是在標頭檔案 usr include ...

SOCKADDR和SOCKADDR IN的區別

二者的占用的記憶體大小是一致的,因此可以互相轉化,從這個意義上說,他們並無區別。sockaddr常用於bind connect recvfrom sendto等函式的引數,指明位址資訊。是一種通用的套接字位址。而sockaddr in 是internet環境下套接字的位址形式。所以在網路程式設計中我...