sockaddr與sockaddr in結構體簡介

2021-06-05 21:35:56 字數 2488 閱讀 5189

sockaddr與sockaddr_in結構體簡介

2007-09-01 20:56

【標   題】:sockaddr與sockaddr_in結構體簡介

【關鍵字】:sockaddr,sockaddr_in

【來   源】:ttp:

sockaddr與sockaddr_in結構體簡介

struct sockaddr ;

sa_family是位址家族,一般都是「af_***」的形式。好像通常大多用的是都是af_inet。

sa_data是14位元組協議位址。

此資料結構用做bind、connect、recvfrom、sendto等函式的引數,指明位址資訊。

但一般程式設計中並不直接針對此資料結構操作,而是使用另乙個與sockaddr等價的資料結構

sockaddr_in(在netinet/in.h中定義):

struct   sockaddr_in ;

struct   in_addr ;

typedef struct in_addr s_un_b;

struct s_un_w;

unsigned long s_addr;

} s_un;

} in_addr;

sin_family指代協議族,在socket程式設計中只能是af_inet

sin_port儲存埠號(使用網路位元組順序)

sin_addr儲存ip位址,使用in_addr這個資料結構

sin_zero是為了讓sockaddr與sockaddr_in兩個資料結構保持大小相同而保留的空位元組。

s_addr按照網路位元組順序儲存ip位址

sockaddr_in和sockaddr是並列的結構,指向sockaddr_in的結構體的指標也可以指向

sockadd的結構體,並代替它。也就是說,你可以使用sockaddr_in建立你所需要的資訊,

在最後用進行型別轉換就可以了bzero((char*)&mysock,sizeof(mysock));//初始化

mysock結構體名

mysock.sa_family=af_inet;

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

……等到要做轉換的時候用:

(struct sockaddr*)mysock

struct sockaddr和struct sockaddr_in這兩個結構體用來處理網路通訊的位址。

在各種系統呼叫或者函式中,只要和網路位址打交道,就得用到這兩個結構體。

網路中的位址包含3個方面的屬性:

1 位址型別: ipv4還是ipv6

2 ip位址

3 埠

相應的,標頭檔案有如下定義:

c**  

include 

struct

sockaddr ;  

// ipv4 af_inet sockets:

struct

sockaddr_in ;  

struct

in_addr ;  

注釋中標明了屬性的含義及其位元組大小,這兩個結構體一樣大,都是16個位元組,而且都有family屬性,不同的是:

sockaddr用其餘14個位元組來表示sa_data,而sockaddr_in把14個位元組拆分成sin_port, sin_addr和sin_zero

分別表示埠、ip位址。sin_zero用來填充位元組使sockaddr_in和sockaddr保持一樣大小。

sockaddr和sockaddr_in包含的資料都是一樣的,但他們在使用上有區別:

程式設計師不應操作sockaddr,sockaddr是給作業系統用的

程式設計師應使用sockaddr_in來表示位址,sockaddr_in區分了位址和埠,使用更方便。

一般的用法為:

程式設計師把型別、ip位址、埠填充sockaddr_in結構體,然後強制轉換成sockaddr,作為引數傳遞給系統呼叫函式

網路程式設計中一段典型的**為:

c**  

intsockfd;  

struct

sockaddr_in servaddr;  

sockfd = socket(af_inet, sock_stream, 0);  

/* 填充struct sockaddr_in */

bzero(&servaddr, sizeof

(servaddr));  

servaddr.sin_family = af_inet;  

servaddr.sin_port = htons(serv_port);  

inet_pton(af_inet, "127.0.0.1"

, &servaddr.sin_addr);  

/* 強制轉換成struct sockaddr */

connect(sockfd, (struct

sockaddr *) &servaddr, 

sizeof

(servaddr));  

sockaddr與sockaddr in的比較

struct sockaddr sa family是位址家族,一般都是 af 的形式。好像通常大多用的是都是af inet。sa data是14位元組協議位址。此資料結構用做bind connect recvfrom sendto等函式的引數,指明位址資訊。但一般程式設計中並不直接針對此資料結構操作...

sockaddr與sockaddr in結構體簡介

struct sockaddr sa family是位址家族,一般都是 af 的形式。好像通常大多用的是都是af inet。sa data是14位元組協議位址。此資料結構用做bind connect recvfrom sendto等函式的引數,指明位址資訊。但一般程式設計中並不直接針對此資料結構操作...

sockaddr與sockaddr in結構體簡介

struct sockaddr sa family是位址家族,一般都是 af 的形式。好像通常大多用的是都是af inet。sa data是14位元組協議位址。此資料結構用做bind connect recvfrom sendto等函式的引數,指明位址資訊。但一般程式設計中並不直接針對此資料結構操作...