嵌入式Linux網路程式設計

2021-07-23 07:46:18 字數 3919 閱讀 7670

osi 七層模型(理想模型)

應用層 表示層 會話層 傳輸層 網路層 資料鏈路層 物理層

tcp/ip 四層模型(廣泛應用)

應用層 傳輸層 網路層(internet) 網路介面層(hw / 網絡卡)

對應關係

tcp/ip模型各層對應的協議

應用層協議:http ftp telnet

傳輸層協議(埠號工作在該層):tcp udp

tcp 傳輸控制協議: 

可靠協議, 建立在連線上(打**),要求通訊過程中有回應,才能說下一句話。

tcp占用網路資源更多,用在使用賬戶密碼登入或者是對資料完整性有要求的時候

udp 使用者資料報協議:

不可靠協議, 不需要建立連線(發簡訊、寫信)

如果tcp和udp都能使用的場合,網路越差越應該使用udp

port 埠號: (識別到底是哪個應用程式)源&目標

16位-- 2byte short型

埠號一般由iana管理

眾所周知埠:1~1023(1~255之間為眾所周知埠,256~1023埠通常由unix系統占用)如:ftp– 21,telnet-23,http(web)-80

動態或者私有埠 49151— 65535

註冊埠 1024–49150

網路層: ipv4 ipv6 icmp igmp (ip)

網路介面層: arp rarp mpls

a   最高位為0, 只有最高位元組表示網路,剩下位元組表示主機 

網路個數 0~ 0x7f

主機個數 0~0xffffff

0.0.0.0 表示本網路

127(即01111111)保留作為本機軟體迴路測試之用

位址範圍 0.0.0.1~~~~ 126.255.255.255

對應的掩碼(網路的位元組數)255.0.0.0

b 最高位為10,最高兩個位元組表示網路,剩下位元組表示主機

網路個數 0~ 0x3fff

主機個數 0~0xffff

位址範圍 128.0.0.0 ~ 191.255.255.255

對應的掩碼(網路的位元組數)255.255.0.0

c 最高位為110,最高三個位元組表示網路,剩下位元組表示主機

網路個數 0~ 0x1fffff

主機個數 0~0xff

位址範圍 192.0.0.0 ~ 223.255.255.255

對應的掩碼(網路的位元組數)255.255.255.0

(192.168.1.2 255.255.255.0都是判斷依據)

d multicast 組播

二進位制表示

11100000 00000000 00000000 00000000 ~ 11101111 11111111 11111111 11111111

轉成十六進製制

224.0.0.0 ~~ 239.255.255.255

另外還有broadcast 廣播位址,最後乙個位元組為255

1、socket()函式

int

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

domain 選擇位址型別

ipv4 af_inet

ipv6 af_inet6

type socket 型別

tcp sock_stream

udp sock_dgram

protocol 一般為0 除非是用原始socket

tcp:sockfd = socket(af_inet,sock_stream,0);

udp:sockfd =socket(af_inet, sock_dgram,0);

2、bind()函式—將本地ip位址繫結到埠號

int bind(int sockfd, const

struct sockaddr *addr, socklen_t addrlen);

因為該結構體中的sa_data成員不知如何賦值

struct sockaddr
所以使用同長結構體

struct sockaddr_in //(注意網路位元組序需要轉換)

; 是個32位無符號int , 大端

unsigned

char sin_zero[8];

}

3、listen()、connect()函式

int

listen(int sockfd, int backlog);

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

listen函式的第乙個引數即為要監聽的socket描述字,第二個引數為相應socket可以排隊的最大連線個數。socket()函式建立的socket預設是乙個主動型別的,listen函式將socket變為被動型別的,等待客戶的連線請求。

connect函式的第乙個引數即為客戶端的socket描述字,第二引數為伺服器的socket位址,第三個引數為socket位址的長度。客戶端通過呼叫connect函式來建立與tcp伺服器的連線。

4、accept()函式

int

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

accept函式的第乙個引數為伺服器的socket描述字,第二個引數為指向struct sockaddr *的指標,用於返回客戶端的協議位址,第三個引數為協議位址的長度。如果accpet成功,那麼其返回值是由核心自動生成的乙個全新的描述字,代表與返回客戶的tcp連線。

5、send ()、recv ()等函式

#include 

ssize_t recv(int sockfd, void *buff, size_t nbytes, int flags);

ssize_t send(int sockfd, const

void *buff, size_t nbytes, int flags);

6、close()函式—關閉socket 結束通訊

#include 

int close(int fd);

嵌入式Linux網路程式設計(一)

網路協議 國際標準組織 iso 制定了osi模型,把網路通訊分為7層。而tcp ip將網路通訊分為4層 應用層,傳輸層,網路互連層,網路介面層。socket介面是tcp ip網路的api,定義了許多函式和例子。1 結構體sockaddr struct sockaddr sa family 一般是af...

Linux嵌入式之 網路程式設計socket

socket是應用層與tcp ip協議族通訊的中間軟體抽象層,它是一組介面。在設計模式中,socket其實就是乙個門面模式,它把複雜的tcp ip協議族隱藏在socket介面後面,對使用者來說,一組簡單的介面就是全部,讓socket去組織資料,以符合指定的協議。門面模式,用自己的話說,就是系統對外界...

嵌入式程式設計

1 interrupt double compute area double radis 1 isr不能返回乙個值。2 isr不能傳遞引數。3 在許多處理器中浮點是不可重入的。4 printf 經常有重入和效能上的問題,所以一般不使用printf 2.volatile 1 volatile的語法和c...