
文章插圖
1.目標(biāo)暫時想不出什么好的應(yīng)用場景 , 目前想到目標(biāo)就是實(shí)現(xiàn)讓兩個設(shè)備通過網(wǎng)絡(luò)傳輸數(shù)據(jù) , 比如開發(fā)板和Linux主機(jī)之間傳數(shù)據(jù) , 以后就可以實(shí)現(xiàn)開發(fā)板通過網(wǎng)絡(luò)上報數(shù)據(jù)或者主機(jī)通過網(wǎng)絡(luò)控制開發(fā)板 。
此外 , 暫時不想關(guān)心具體的網(wǎng)絡(luò)模型 , 更注重于網(wǎng)絡(luò)相關(guān)函數(shù)的直接使用 。
2.Linux網(wǎng)絡(luò)編程基礎(chǔ)2.1 嵌套字
多個TCP連接或者多個應(yīng)用程序進(jìn)程 可能需要同一個TCP端口傳輸數(shù)據(jù) 。
為了區(qū)分不同應(yīng)用程序進(jìn)程和連接 , 許多計算機(jī)操作系統(tǒng)為應(yīng)用程序與TCP/IP交互提供了稱為**嵌套字(Socket)**的接口 。
Linux中的網(wǎng)絡(luò)編程正是通過Socket接口實(shí)現(xiàn)的 , Socket是一種文件描述符 。
常用的TCP/IP有以下三種類型的嵌套字:
流式嵌套字(SOCK_STREAM)
用于提供面向連接的、可靠的數(shù)據(jù)傳輸服務(wù) , 即使用TCP進(jìn)行傳輸 。
數(shù)據(jù)報嵌套字(SOCK_DGRAM)
用于提供無連接的服務(wù) , 即使用UDP進(jìn)行傳輸 。
原始嵌套字(SOCK_RAW)
可以讀寫內(nèi)核沒有處理的IP數(shù)據(jù)報 , 而流式嵌套字只能讀取TCP的數(shù)據(jù) , 數(shù)據(jù)報嵌套字只能讀取UDP的數(shù)據(jù) 。
因此 , 如果要訪問其它協(xié)議發(fā)送的數(shù)據(jù)必須使用原始嵌套字 , 它允許對底層協(xié)議(如IP或ICMP)直接訪問 。
2.2 端口
TCP/IP協(xié)議中的端口 , 端口號的范圍從0~65535 。
一類是由互聯(lián)網(wǎng)指派名字和號碼公司ICANN負(fù)責(zé)分配給一些常用的應(yīng)用程序固定使用的“周知的端口” , 其值一般為0~1023 。例如http的端口號是80 , FTP為21 , SSH為22 , Telnet為23等 。
還有一類是用戶自己定義的 , 通常是大于1024的整型值 。
2.3 網(wǎng)絡(luò)地址
網(wǎng)絡(luò)通信 , 歸根到底還是進(jìn)程間的通信(不同計算機(jī)上的進(jìn)程間通信) 。
在網(wǎng)絡(luò)中 , 每一個節(jié)點(diǎn)(計算機(jī)或路由)都有一個網(wǎng)絡(luò)地址 , 如192.168.1.4 , 也就是IP地址 。
兩個進(jìn)程通信時 , 首先要確定各自所在的網(wǎng)絡(luò)節(jié)點(diǎn)的網(wǎng)絡(luò)地址 。
但是 , 網(wǎng)絡(luò)地址只能確定進(jìn)程所在的計算機(jī) , 而一臺計算機(jī)上很可能同時運(yùn)行著多個進(jìn)程 , 所以僅憑網(wǎng)絡(luò)地址還不能確定到底是和網(wǎng)絡(luò)中的哪一個進(jìn)程進(jìn)行通信 , 因此套接口中還需要包括其他的信息 , 也就是端口號(PORT) 。
在一臺計算機(jī)中 , 一個端口號一次只能分配給一個進(jìn)程 , 也就是說 , 在一臺計算機(jī)中 , 端口號和進(jìn)程之間是一一對應(yīng)關(guān)系 。
所以 , 使用端口號和網(wǎng)絡(luò)地址的組合可以唯一的確定整個網(wǎng)絡(luò)中的一個網(wǎng)絡(luò)進(jìn)程 。
例如 , 如網(wǎng)絡(luò)中某一臺計算機(jī)的IP為192.168.1.4 , 操作系統(tǒng)分配給計算機(jī)中某一應(yīng)用程序進(jìn)程的端口號為1500 , 則此時192.168.1.4 1500就構(gòu)成了一個套接口 。
2.4網(wǎng)絡(luò)地址的格式在Socket程序設(shè)計中 , struct sockaddr用于記錄網(wǎng)絡(luò)地址 , 其格式如下:
struct sockaddr{unsigned short sa_family; /*協(xié)議族 , 采用AF_XXX的形式 , 例如AF_INET(IPv4協(xié)議族)*/char sa_data[14]; /*14字節(jié)的協(xié)議地址 , 包含該socket的IP地址和端口號 。*/};但在實(shí)際編程中 , 并不針對sockaddr數(shù)據(jù)結(jié)構(gòu)進(jìn)行操作 , 而是用與其等價的sockaddr_in數(shù)據(jù)結(jié)構(gòu):
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請您及時就醫(yī)或請專業(yè)人士給予相關(guān)指導(dǎo)!
「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對您有所幫助:- 硬盤io設(shè)備錯誤解決方法 linux硬盤查看命令
- linux查看CPU使用情況 linux查看cpu主頻命令
- 通信基礎(chǔ)知識入門 移動通信系統(tǒng)的組成
- linux查看已安裝的軟件版本 查看yum安裝的軟件包
- linux基礎(chǔ)入門知識 linux基礎(chǔ)培訓(xùn)文檔
- 線下劇本殺入門基礎(chǔ)知識小白必看 劇本殺怎么玩
- java入門基礎(chǔ)知識 java算法題面試
- 《蕙蘭瑜伽視頻教程》01 蕙蘭瑜伽基礎(chǔ)知識
- linux磁盤掛載詳細(xì)教程 磁盤掛載命令
- 查看linux版本的三種常用方法 查詢linux操作系統(tǒng)版本
