Linux 網路程式設計

2021-08-13 08:40:23 字數 3712 閱讀 3367

一.tcp/ip理論基礎

1.協議棧

linux的優點之一就是在於它豐富而穩定的網路協議棧,其範圍是從協議無關層(如通用的socket層介面和裝置層)到各種網路協議的實現

對於網路理論介紹一般採用osi模型,但是linux中網路棧的介紹一般分為四層的internet模型

2.tcp/ip協議族

tcp/ip 實際上乙個協同工作的通訊家族,為網路資料通訊提供通路。為討論方便可tcp/ip 協議組大體上分為三部分:

1)internet 協議(ip)

2)傳輸控制協議(tcp)和使用者資料報協議(udp)

3)處於 tcp 和 udp 之上的一組應用協議。它們包括:telnet,檔案傳送協議(ftp),網域名稱服務(dns)和簡單的郵件傳送程式(smtp)等

3.網路層

第一部分稱為網路層。主要包括internet 協議(ip)、網際控制報文協議(icmp)和位址解析協議(arp)

internet 協議(ip)

該協議被設計成互聯分組交換通訊網,以形成乙個網際通訊環境。它負責在源主機和目的地主機之間傳輸來自其較高層軟體的稱為資料報文的資料塊,它在源和目的地之間提供非連線型傳遞服務

網際控制報文協議(icmp)

它實際上不是ip層部分,但直接同ip層一起工作,報告網路上的某些出錯情況。允許網際路由器傳輸差錯資訊或測試報文。

位址解析協議(arp)

arp 實際上不是網路層部分,它處於ip和資料鏈路層之間,它是在32位ip位址和48位實體地址之間執行翻譯的協議

5.應用協議層

這部分主要包括telnet,檔案傳送協議(ftp 和tftp),簡單檔案傳送協議(smtp)和網域名稱服務(dns)等協議

6.ip 協議

ip主要有以下四個主要功能:

資料傳送

定址 路由選擇

資料報文的分段

ip的主要目的是為資料輸入/輸出網路提供基本演算法,為高層協議提供無連線的傳送服務.這意味著在ip將資料遞交給接收站點以前不在傳輸站點和接收站點之間建立對話。它只是封裝和傳遞資料,但不向傳送者或接收者報告包的狀態,不處理所遇到的故障

ip包由ip協議頭與協議資料兩部分構成

7.tcp協議

tcp是重要的傳輸層協議,目的是允許資料同網路上的其他節點進行可靠的交換。它能提供埠編號的解碼,以識別主機的應用程式,而且完成資料的可靠傳輸tcp 協議具有嚴格的內裝差錯檢驗演算法確保資料的完整性tcp 是面向位元組的順序協議,這意味著包內的每個位元組被分配乙個順序編號,並分配給每包乙個順序編號

tcp協議頭

udp也是傳輸層協議,它是無連線的,不可靠的傳輸服務.當接收資料時它不向傳送方提供確認資訊,它不提供輸入包的順序,如果出現丟失包或重份包的情況,也不會向傳送方發出差錯報文.由於它執行功能時具有較低的開銷,因而執行速度比tcp快

udp協議頭

二.linux 網路程式設計2.位元組序轉換

htons

把unsigned short型別從主機序轉換到網路序

htonl

把unsigned long型別從主機序轉換到網路序

ntohs

把unsigned short型別從網路序轉換到主機序

ntohl

把unsigned long型別從網路序轉換到主機序

3.位址轉換

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的格式

4.函式

進行socket程式設計的常用函式有:

socket

建立乙個socket

bind

用於繫結ip位址和埠號到socket

connect

該函式用於繫結之後的client端與伺服器建立連線

listen

設定能處理的最大連線要求,listen()並未開始接收連線,只是設定socket為listen模式。

accept

用來接受socket連線。

send

傳送資料

recv

接收資料

7.setsockopt

在server**的socket()和bind()呼叫之間插入如下**:

int opt = 1;

setsockopt(listenfd, sol_socket, so_reuseaddr, &opt, sizeof(opt));

8.sockaddr_in 初始化

bzero(&servaddr, sizeof(servaddr));

servaddr.sin_family = af_inet;

servaddr.sin_addr.s_addr=htonl(inaddr_any); servaddr.sin_port = htons(serv_port);

首先將整個結構體清零,然後設定位址型別為af_inet,網路位址為inaddr_any,這個巨集表示本地的任意ip位址,因為伺服器可能有多個網絡卡,每個網絡卡也可能繫結多個ip位址,這樣設定可以在所有的ip位址上監聽,直到不某個客戶端建立了連線時才確定下來到底用哪個ip位址,埠號為serv_port,我們定義為8000

9.accept 連線

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

三方插手完成後,伺服器呼叫accept()接受連線,如果伺服器呼叫accept()時還沒有客戶端的連線請求,就阻塞等待直到有客戶端連線上來,cliaddr是乙個傳出引數,accept()返回時傳出客戶端的位址和埠號.addrlen引數是乙個傳入傳出引數(value-result argument),傳入的是呼叫者提供的緩衝區cliaddr的長度以避免緩衝區溢位問題,傳出的是客戶端位址結構體的實際長度(有可能沒有佔滿呼叫者提供的緩衝區)。

如果給cliaddr引數傳null,表示不關心客戶端的位址

10.connect連線

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

客戶端需要呼叫connect()連線伺服器,connect和bind的引數形式一致,區別在於bind的引數是自己的位址,而connect的引數是對方的位址.

connect()成功返回0,出錯返回-1

Linux網路程式設計

linux網路程式設計 當然,我們現在,將要開始編寫的第乙個網路程式,雖然非常簡單,但是卻可以很 清楚的說明大部分編寫網路程式需要的基本概念,好了先讓我們看看網路程式的tcp服 務器端的編寫步驟 1.和伺服器的步驟一樣。2.通過設定套介面位址結構,我們說明,客戶端要與之通訊的伺服器的ip位址和 埠。...

linux 網路程式設計

當然,我們現在,將要開始編寫的第乙個網路程式,雖然非常簡單,但是卻可以很 清楚的說明大部分編寫網路程式需要的基本概念,好了先讓我們看看網路程式的tcp服 務器端的編寫步驟 現在讓我們來看看網路程式客戶端的程式設計步驟 以上的步驟,是比較普遍的,我們可以從中看出,編寫網路程式是很有意思的,同 時,也不...

linux 網路程式設計

套接字程式設計 struct sockaddr unsigned short sa family 位址協議,ipv4 tcp ip af inet,ipv6 af inet6 char sa data 14 14位元組的位址協議 struct sockaddr in unsigned short s...