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