sockaddr和sockaddr in的區別

2021-08-26 03:12:44 字數 1196 閱讀 8028

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

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

1 位址型別: ipv4還是ipv6

2 ip位址

3 埠

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

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,作為引數傳遞給系統呼叫函式

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

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的區別

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