課堂筆記十之嵌入式LinuxC 網路開發實戰

2021-10-05 18:16:32 字數 3579 閱讀 8151

一、網路程式設計

1、c/s vs b/s

(1)c/s架構

優點:a、由於客戶端實現與伺服器的直接相連,沒有中間環節,因此響應速度快;

b、操作介面漂亮、形式多樣,可以充分滿足客戶自身的個性化要求;

c、c/s結構的管理資訊系統具有較強的事務處理能力,能實現複雜的業務流程。

缺點:a、c/s結構的管理資訊系統具有較強的事務處理能力,能實現複雜的業務流程;

b、相容性差,對於不同的開發工具,具有較大的侷限性;若採用不同工具,需要重新改寫程式;

c、開發成本較高,需要具有一定專業水準的技術人員才能完成;

(2)b/s架構

優點:a、具有分布性特點,可以隨時隨地進行查詢、瀏覽等業務處理;

b、業務擴充套件簡單方便,通過增加網頁即可增加伺服器功能;

c、維護簡單方便,只需要改變網頁,即可實現所有使用者的同步更新;

d、開發簡單,共享性強。

缺點:a、表現要達到cs程式的程度需要花費不少精力;

b、在速度和安全性上需要花費巨大的設計成本,這是bs架構的最大問題。

2、套接字

作用:傳輸層的檔案描述符

3、tcp的c/s實現

(1)循壞伺服器模型

1)tcp伺服器實現過程

a、建立套接字:socket函式;

b、給套接字繫結ip位址和埠號:bind函式

第乙個引數:socket函式建立的套接字

第二個引數:儲存ip和埠號的結構體

a. 位元組序轉化

網路位元組序採用大端位元組序

位元組序轉化函式

b.ip位址格式轉化

第三個引數:第二個引數的長度

c、出現無法繫結?

解決辦法:setsockopt函式

d、將套接字檔案描述符,從主動變為被動檔案描述符(做監聽準備):listen函式

主動描述符可以主動的向對方傳送資料。

被動描述符只能被動的等別人主動想你發資料,然後再回答資料,不能主動的傳送資料。

為什麼要將「套接字檔案描述符」轉為被動描述符後,才能監聽連線?

e、被動監聽客戶的連線並響應:accept函式

f、伺服器呼叫read(recv)和write(send),收發資料,實現與客戶的通訊

send函式

recv函式

注意事項:

資料的傳送和接收,收發資料的資料需要在網路中傳輸,所以同樣要進行端序的轉換。

傳送資料:將主機端序轉為網路端序

接收資料:將網路端序轉為主機端序

int num = 0x12345678;

a - b 0x7853412

char*ptr = 「hello world」;

不過只有short、int、float等儲存單元位元組》1位元組的資料,才有轉換的需求。如果是char這種儲存單元為乙個位元組的資料,不需要對端序進行轉換。

g、呼叫close或者shutdown關閉tcp的連線

2)tcp客戶端的實現過程

a、用socket建立套接字檔案,指定使用tcp協議

b、呼叫connect主動向伺服器發起三次握手,進行連線

c、呼叫read(recv)和write(send)收發資料

d、呼叫close或者shutdown關閉連線

4、udp的c/s實現

(1)udp協議沒有建立連線特性,所以udp協議沒有自動記錄對方ip和埠的特點,每次傳送資料時,必須親自指定對方的ip和埠,只有這樣才能將資料傳送給對方。

(2)udp通訊過程

1)呼叫socket建立套接字檔案

2)bind繫結固定的ip和埠

3)呼叫sendto和recvfrom函式,傳送和接收資料

(3)廣播

1)乙個人發,然後其它所有人都接收,這就是廣播;

2)廣播只能在區域網內部有效,廣播資料是無法越過路由器的,也就是說路由器就是廣播資料的邊界。

3)實現方法:ip位址寫成廣播位址;例如:192.168.1.255。

(4)組播

1)廣播是給其他所有計算機廣播資料,而組播只對其它所有計算機中的某部分計算機廣播資料。

二、i/o多路轉接(復用)模型

1、為什麼需要i/o多路復用模型?

(1)併發伺服器模型的缺點?

1)多程序實現優點:程式設計相對簡單,不用考慮執行緒間的資料同步等、伺服器健壯;缺點:資源消耗大。啟動乙個程序消耗相對比啟動乙個執行緒要消耗大很多,同時在處理很多的連線時候需要啟動很多的程序多去處理,這時候對系統來說壓力就會比較大。另外系統的程序數限制也需要考慮。

2)多執行緒實現優點:相對多程序方式,會節約一些資源,會更加高效一些。缺點:相對多程序方式,增加了程式設計的複雜度,因為需要考慮資料同步和鎖保護。另外乙個程序中不能啟動太多的執行緒。在linux系統下執行緒在系統內部其實就是程序,執行緒排程按照程序排程的方式去執行的。

3)傳統的多程序和多執行緒的伺服器無法滿足大併發操作

a、程序和執行緒數受限

ulimit -u檢視系統最多支援的程序數

ulimit -s檢視棧的大小,算出最大執行緒的個數

改進方法:修改程序個數,系統硬體資源必須匹配;執行緒池解決多執行緒個數受限問題(執行緒池的缺陷)

b、tcp伺服器程序同時開啟檔案數的限制

檢視程序中最大開啟檔案個數:ulimit

修改方法:

第一步,修改/etc/security/limits.conf檔案,在檔案中新增如下行:

speng soft nofile 10240

speng hard nofile 10240

其中speng指定了要修改哪個使用者的開啟檔案數限制,soft或hard指定要修改軟限制還是硬限制;10240則指定了想要修改的新的限制值,即最大開啟檔案數(請注意軟限制值要小於或等於硬限制)。修改完後儲存檔案。

4)當10000個客戶端連線,只有10個客戶端在做資料通訊,此時伺服器的效能?

(2)i/o多路復用的工作原理

2、select

(1)select函式

(2)檔案集合操作

(3)select優缺點

優點:幾乎在所有的平台上支援,跨平台支援性好

缺點:陣列管理檔案描述符,個數受限;由於是採用輪詢方式全盤掃瞄,會隨著檔案描述符fd數量增多而效能下降。

3、poll

基本原理與select一致,也是輪詢+遍歷;唯一的區別就是poll沒有最大檔案描述符限制(使用鍊錶的方式儲存fd)

4、epoll

(1)使用步驟

1)int epoll_creae(int size);

2)int epoll_ctl(int epfd, int op, int fd, struct epoll_event event);

3)int epoll_wait(int epfd,struct epoll_event events, int maxevents, int timeout);

(2)epoll優點

1)select內部使用陣列實現,poll是鍊錶。他們需要做核心區到使用者區的轉換,還需要做資料拷貝,因此效率低。

2)epoll不需要做核心區到使用者區的轉換,因為資料存在共享記憶體中。epoll維護的樹在共享記憶體中,核心區和使用者區去操作共享記憶體,因此不需要區域轉換,也不需要拷貝操作。

5、封裝的庫

libevent

嵌入式課堂筆記

一 資料型別 1 strlen 測量乙個字串有多少字元 不統計 0 printf strlen str d n strlen src 2 整數原碼 補碼 負數補碼 原碼取反 1 3 bit 位元組 8bit 半字 2個位元組 16bit 字 4個位元組 32bit 4 sizeof num 測量乙個...

嵌入式課堂筆記3

學習筆記3 嵌入式linux開發工具 vim gcc gdb make gcc編譯器 學會製作動態庫和靜態庫及使用與區別 gdb偵錯程式 設定斷點 單步執行 除錯記憶體錯誤 make工程管理器 編寫makefile檔案 linux文字編輯器 vim 功能最強大的文字編輯器 拜託滑鼠 vi vim i...

嵌入式第十次課堂筆記

1 區域網 udp傳輸資料的最長長度 1518 18 20 8 1472bit 2 廣域網 用udp協議傳送時,用sendto函式最大能傳送資料的長度為 65535 ip頭 20 udp頭 8 65507位元組。用sendto函式傳送資料時,如果傳送資料長度大於該值,則函式會返回錯誤 3 協議特點 ...