網路程式設計1

2021-09-26 03:09:54 字數 4347 閱讀 5656

tcp/ip四層模型

應用層 telent,ftp和e-mail等

傳輸層 tcp/udp

網路層 ip,icmp和igmp

鏈路層 裝置驅動程式及介面卡

如果兩台計算機在不同的網段中,那麼資料從一台計算機到另一台計算機傳輸過程中要經過乙個或多個路由器

鏈路層之下還有物理層,指的是電訊號的傳遞方式,比如現在乙太網通用的網線。

鏈路層有乙太網、令牌環網等標準,鏈路層負責網絡卡裝置的驅動、幀同步(就是說從網

線上檢測到什麼訊號算作新幀的開始)、衝突檢測(如果檢測到衝突就自動重發)、資料差

錯校驗等工作

網路層的ip協議是構成internet的基礎。internet上的主機通過ip位址來標識,internet上有大量路由器負責根據ip位址選擇合適的路徑**資料報,資料報從internet上的源

主機到目的主機往往要經過十多個路由器。

網路層負責點到點(point-to-point)的傳輸(這裡的「點」指主機或路由器),而傳

輸層負責端到端(end-to-end)的傳輸

ip位址是標識網路中不同主機的位址,而埠號就是同一臺主機上標識不

同程序的位址,ip位址和埠號合起來標識網路中唯一的程序。

位元組轉換

記憶體中的多位元組資料相對於記憶體位址有大端和小端之分,磁碟檔案中的

多位元組資料相對於檔案中的偏移位址也有大端小端之分,網路資料流同樣有大端小端之分

tcp/ip協議規定,網路資料流應採用大端位元組序,即低位址高位元組如果主機是大端位元組

序的,傳送和接收都不需要做轉換

ip位址轉換函式

#include

int inet_pton(int af, const char *src, void *dst);

const char *inet_ntop(int af, const void *src, char dst, socklen_t size);

sockaddr資料結構

內部只識別struct sockaddr 所以在運用是要進行型別強轉

struct sockaddr ;

各種socket位址結構體的開頭都是相同的,前16位表示整個結構體的長度,後16位表四位址型別。型別分別定義為常數af_inet、af_inet6、af_unix因此,socket api可以接受各種型別的

sockaddr結構體指標做引數,例如bind、accept、connect等函式這些函式的引數都用struct sockaddr *型別表示,在傳遞引數之前要強制型別轉換一下。

例如:

struct sockaddr_in servaddr;

/* initialize servaddr */

bind(listen_fd, (struct sockaddr *)&servaddr, sizeof(servaddr));

socket

#include /* see notes */

#include int socket(int domain, int type, int protocol);

domain:

af_inet 這是大多數用來產生socket的協議,使用tcp或udp來傳輸,用ipv4的位址

af_inet6 與上面類似,不過是來用ipv6的位址

af_unix 本地協議,使用在unix和linux系統上,一般都是當客戶端和伺服器在同一臺及其上的時候使用

type:

sock_stream 這個協議是按照順序的、可靠的、資料完整的基於位元組流的連線。這是乙個使用最多的socket類

型,這個socket是使用tcp來進行傳輸。

sock_dgram 這個協議是無連線的、固定長度的傳輸呼叫。該協議是不可靠的,使用udp來進行它的連線。

sock_seqpacket 這個協議是雙線路的、可靠的連線,傳送固定長度的資料報進行傳輸。必須把這個包完整的

接受才能進行讀取。

sock_raw 這個socket型別提供單一的網路訪問,這個socket型別使用icmp公共協議。(ping、traceroute使

用該協議)

sock_rdm 這個型別是很少使用的,在大部分的作業系統上沒有實現,它是提供給資料鏈路層使用,不保證數

據包的順序

protocol:

0 預設協議

返回值:

成功返回乙個新的檔案描述符,失敗返回-1,設定errno

*int connect(int sockfd, const struct sockaddr addr, socklen_t addrlen);

#include /* see notes */

#include int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

sockdf:

socket檔案描述符

addr:

傳入引數,指定伺服器端位址資訊,含ip位址和埠號

addrlen:

傳入引數,傳入sizeof(addr)大小

返回值:

成功返回0,失敗返回-1,設定errno

客戶端需要呼叫connect()連線伺服器,connect和bind的引數形式一致,區別在於

bind的引數是自己的位址,而connect的引數是對方的位址。connect()成功返回0,出錯返

回-1。

*int bind(int sockfd, const struct sockaddr addr, socklen_t addrlen);

sockfd:

socket檔案描述符

addr:

構造出ip位址加埠號

addrlen:

sizeof(addr)長度

返回值:

成功返回0,失敗返回-1, 設定errno

struct sockaddr_in servaddr;

bzero(&servaddr, sizeof(servaddr));

servaddr.sin_family = af_inet;

servaddr.sin_addr.s_addr = htonl(inaddr_any);

servaddr.sin_port = htons(8000);

int listen(int sockfd, int backlog);

#include /* see notes */

#include int listen(int sockfd, int backlog);

sockfd:

socket檔案描述符

backlog:

排隊建立3次握手佇列和剛剛建立3次握手佇列的鏈結數和

使伺服器可以服務於多個客戶端,當客戶端發起鏈結是,伺服器呼叫的

accept()返回並接受這個連線,如果有大量的客戶端發起連線而伺服器來不及處理,尚未

accept的客戶端就處於連線等待狀態最多允許有backlog個客戶端處於連接待狀態,如果接到更多請求就忽略,成功返回0失敗返回1;

**int accept(int sockfd, struct sockaddr addr, socklen_t addrlen);

#include /* see notes */

#include int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

sockdf:

socket檔案描述符

addr:

addrlen:

傳入傳出引數(值-結果),傳入sizeof(addr)大小,函式返回時返回真正接收到位址結構體的大小

返回值:

成功返回乙個新的socket檔案描述符,用於和客戶端通訊,失敗返回-1,設定errno

用來接收連線,如果在呼叫的時候沒有客戶端連線,就阻塞等待直到有客戶端連線上來。

例子:

while (1)
成功返回乙個檔案描述符,出錯返回-1。

服務端的 傳送端指向客戶端的接收端

客戶端的傳送端指向服務端的接收端

網路程式設計 1

1.套接字位址結構 套接字程式設計需要指定套接字的位址作為引數,不同的協議族有不同的位址結構定義方式。這些位址結構通常以sockaddr 開頭,每乙個協議族有乙個唯一的字尾,例如對於乙太網,其結構名稱為sockaddr in。1.1 通用套接字位址結構 套接字位址結構 struct sockaddr...

網路程式設計 1

1.前言 公司要為別的公司提供伺服器防護,採用本地環迴,節點 的方法實現對伺服器真實ip進行隱藏。但是有乙個問題 我節點端要建立乙個埠接收對映資料和保活資料,採用固定埠的話,攻擊者很容易通過掃瞄埠來獲取我較多的節點,進行攻擊 2.解決 這裡採用的是通過節點ip來生成乙個隨機埠,客戶端和節點通過這個隨...

網路程式設計序列1 理解網路程式設計

常用的tcp ip協議的三種套接字型別 流套接字 tcp協議 資料報套接字 udp協議 原始套接字 ip icmo協議 區別在於 原始套接字可以讀寫核心沒有處理的ip資料報,而流套接字只能讀取tcp協議的資料,資料報套接字只能讀取udp協議的資料。tcp transmission control p...