標籤:style color 使用 strong 檔案 資料
本文目錄:
一:網路地址結構體的介紹
二:大端序和小端序的簡單介紹以及它們轉換的函數接介面
一:網路地址結構體的介紹
Linux中的網路編程通過Socket(通訊端)介面實現,Socket是一種特殊的檔案描述符。
通訊端socket有三種類型:
? 流式通訊端(SOCK_STREAM):流式的通訊端可以提供可靠的、連線導向的通訊流。它使用了TCP協議。TCP保證了資料轉送的正確性和順序性。
? 資料通訊端(SOCK_DGRAM):資料通訊端定義了一種不需連線的服務,資料通過相互獨立的報文進行傳輸,是無序的,並且不保證可靠,無差錯,它使用資料報協議UDP。
?原始通訊端(SOCK_RAM):原始通訊端允許對低層協議如IP或ICMP直接存取,主要用於新的網路通訊協定的測試等。
網路地址結構體:
struct sockaddr
{
u_short sa_family; //Sa_family:地址族,採用“AF_xxx”的形式,如:AF_INET。
char sa_data[14]; //Sa_data:14位元組的特定協議地址。
}
struct sockaddr_in
{
short int sin_family; /* Internet地址族*/
unsigned short int sin_port; /* 連接埠號碼*/
struct in_addr sin_addr; /* IP地址*/
unsigned char sin_zero[8]; /* 填0 */
}
struct in_addr
{
unsigned long s_addr;
}
S_addr: 32位的地址。
編程中一般並不直接針對sockaddr資料結構操作,而是使用與sockaddr等價的sockaddr_in資料結構。
二:大端序和小端序的簡單介紹以及它們轉換的函數接介面
IP地址通常由數字加點(192.168.0.1)的形式表示,而在struct in_addr中使用的是IP地址是由32位的整數表示
的,為了轉換我們可以使用下面兩個函數:
int inet_aton(const char *cp,struct in_addr *inp)
char *inet_ntoa(struct in_addr in)
函數裡面a 代表ascii n代表network.第一個函數表示將a.b.c.d形式的IP轉換為32位的IP,儲存在inp指標裡面。第二個是將32位IP轉換為a.b.c.d的格式。
網路位元組順序是TCP/IP中規定好的一種資料表示格式,它與具體的CPU類型、作業系統等無關,從而可以保證資料在不同主機之間傳輸時能夠被正確解釋。網路位元組順序採用big endian排序方式。傳輸時能夠被正確解釋。網路位元組順序採用big endian排序方式。
32bit的整數(0x01234567)從地址0x100開始:
小端位元組序:
大端位元組序:
位元組序轉換
htons把unsigned short類型從主機序轉換到網路序;
vhtonl把unsigned long類型從主機序轉換到網路序;
vntohs把unsigned short類型從網路序轉換到主機序;
vntohl把unsigned long類型從網路序轉換到主機序;
注意:在實驗編碼中,有很多的與地址相關的函數,如htons(),thonl(),inet_addr()等。是我們進行網路編程必須掌握的相關知識,其中htonl用於將本機上的long型資料轉換為網路上的long型資料,htons()轉化為的對象時short型的,inet_addr()可以將字串表示的ip地址轉化為整形的ip地址。