第三章 位址族與資料序列

2021-08-04 17:31:04 字數 3647 閱讀 6398

《tcp/ip網路程式設計》 尹聖雨

p36~p45

1分配給套接字的ip位址與埠號

ip

是為收發網路資料而分配給計算機的值。埠號是為區分程式中建立的套接字而分配給套接字的序號。

ip位址分為2類:ipv4和ipv6,主要差別是表示ip位址所用的位元組數。ipv4標準的4位元組ip位址分為網路位址和主機位址,分為abcde型別、

網路位址(網路id)是為區分網路而設定的一部分ip位址。

「向相應網路傳輸資料」實際是向構成網路的路由器

rounter

或交換機

switch

傳遞資料,由接收資料的路由器根據資料中的主機位址向目標主機傳輸資料。

(路由器或交換機就是一種物理裝置完成外網與本網之間的資料交換,完成構建網路。)

通過

ip位址的第乙個位元組即可判斷網路位址占用的位元組數。

a類位址首位元組 0~127

b類位址首位元組128~191

c類位址首位元組192~223

a類位址的首位以0開始

b類位址的首位以10開始

c類位址的首位以110開始

若想接收多個計算機發來的資料,則需要相應個數的套接字。如何區分這些套接字?

計算機一般配有網路介面卡資料傳輸裝置。通過nic向計算機內部傳輸資料時會用到ip。作業系統負責把傳遞到內部的資料適當分配給套接字,這時就要利用埠號。

埠號是在同一作業系統內為區分不同套接字而設定的。埠號由

16位組成,埠號範圍

0~65535. 注意:0~1023是知名埠,一般分給特定應用程式,所以應當分配此範圍之外的值。雖然埠號不能重複,但tcp和udp套接字不會共用埠號,允許重複。

2 位址資訊表示

struct sockaddr_in;

struct in_addr;

成員sin_family:

af_inet(ipv4網路協議中使用的位址族)

af_inet6(ipv6網路協議中使用的位址族)

sin_port:儲存16位埠號,以網路位元組序儲存。

sin_addr:儲存32位ip位址,且也以網路位元組序儲存。

sin_zero:無特殊含義。

sockaddr_in結構體變數位址值將以如下方式傳遞給bind函式。

bind函式的第二個引數期望得到sockaddr結構體變數位址值,包括位址值、埠號、ip位址等。

structsockaddr_in serv_addr;

.......

if(bind(serv_sock,(structsockaddr*) &serv_addr, sizeof(serv_addr))==-1)

error_handling("bind() error");

......

3網路位元組流與位址變化

不同cpu中,4位元組整數型值1在記憶體空間的儲存方式是不同的。

位元組序order與網路位元組流

cpu向記憶體儲存資料的方式2種,cpu解析資料方式也分為2種:

大端序(高位位元組存放到低位位址)

小端序(高位位元組存放到高位位址)

在通過網路傳輸資料時約定統一方式,該約定被稱為網路位元組序,一般為大端序。

位元組序轉換

hton中的h代表主機位元組序,htons中的n代表網路位元組序。

注意:s指short,l指long(linux中的long型別占用4位元組)

所以htons

指「把short型資料從主機位元組序轉化為網路位元組序」

以s作為字尾的函式中,s代表2個位元組short,用於埠號轉換;以l作為字尾的函式中,l代表4個位元組,用於ip轉換。

4 網路位址的初始化與分配

將字串資訊轉換為網路位元組序的整數型

//將字串形式ip位址轉換為32位整數型資料

#include

in_addr_tinet_addr(const char * string);

成功時返回32位大端序整數型值,失敗時返回inaddr_none.

#include

intinet_aton(const char * string,struct in_addr * addr);

addr:將儲存轉換結果的in_addr結構體變數的位址值。

成功時返回1(true),否則返回0(false)。

注意:該函式會自動將結果填入到結構體變數。

//把網路位元組序整數型ip位址轉換成熟悉的字串形式

#include

char* inet_ntoa(struct in_addr adr);

成功時返回轉換的字串位址值,失敗時返回-1.

網路位址初始化

memset(&addr,0,sizeof(addr));//將結構體變數addr的所有成員初始化為0

(memset函式將每個位元組初始化同乙個值:第乙個引數為結構體變數的addr的位址值,即初始化物件addr; 第二個引數為0,即初始化為0;第三個引數傳入addr的長度)

addr.sin_port= htons(atoi(serv_port));//基於字串的埠號初始化

(atoi函式把字串型別的值轉換為整數型)

利用常數inaddr_any分配伺服器端的ip位址,採用這種方式則可自動獲取執行伺服器端的計算機ip位址,不必親自輸入。

同一計算機中可以分配多個ip位址,實際ip位址的個數與計算機安裝的nic(網路介面卡)數量相等。即使是伺服器端套接字,也需要決定應接收哪個ip傳來的(哪個nic傳來的)資料。若只有1個nic,則直接使用inaddr_any

向套接字分配網路位址

#include

intbind(int sockfd,struct sockaddr * myaddr, socklen_t addrlen);

成功時返回0,失敗時返回-1.

myaddr:存有位址資訊的結構體變數位址值;

addrlen:第二個結構體變數的長度;

如果函式呼叫成功,則將第二個引數指定的位址資訊分配給第乙個引數中相應的套接字。

網路程式設計第三章總結 位址族與資料序列

ip位址分為ipv4 和ipv6,書中主要講解ipv4,但其實截至到目前ipv4已經全部耗盡,開始使用ipv6了。網路位址分類 ipv4一共分為abcde5類,但e類一般不使用。可以通過ip第乙個位元組判斷網路位址占用的位元組數。a類位址 0 127 0 開始 b類位址 128 191 10 開始 ...

第三章,檢索資料

select prod name from products 上述語句利用select 語句從products表中檢索乙個名為prod name的列,所需要的列名在select 關鍵字之後給出,from關鍵字指出從其中檢索資料的表名 select prod name,prod id,prod nam...

第三章 資料定義

建立資料庫 creat database 資料庫名稱 開啟資料庫 use 資料庫名稱 刪除資料庫 drop database 資料庫名稱 更改資料庫名字 sp renameedp 原資料庫名稱 更改後資料庫名稱 建立資料庫student,並開啟 create database student gou...