sockaddr和sockaddr in的區別

2021-07-04 09:07:35 字數 1398 閱讀 1310



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

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

1 位址型別: ipv4還是ipv6

2 ip位址

3 埠

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

c**

include 

struct sockaddr ;  

// ipv4 af_inet sockets:

struct sockaddr_in ;  

struct in_addr ;  

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**

int

sockfd;  

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 in和sockaddr二者區別

2011 07 29 15 28 482人閱讀 0 收藏 舉報 cpp view plain copy print?structsockaddr sockaddr in和sockaddr結構的關係 填值的時候使用sockaddr in結構,而作為函式 如socket,listen,bind等 的引數...

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環境下套接字的位址形式。所以在網路程式設計中我...