linux基礎知識總結「linux編程基礎」

1.目標

暫時想不出什麼好的應用場景,目前想到目標就是實現讓兩個設備通過網路傳輸數據,比如開發板和Linux主機之間傳數據,以後就可以實現開發板通過網路上報數據或者主機通過網路控制開發板

此外,暫時不想關心具體的網路模型,更注重於網路相關函數的直接使用。

Linux網路編程基礎

2.Linux網路編程基礎

2.1 嵌套字

多個TCP連接或者多個應用程序進程 可能需要同一個TCP埠傳輸數據。

為了區分不同應用程序進程和連接,許多計算機操作系統為應用程序與TCP/IP交互提供了稱為**嵌套字(Socket)**的介面。

Linux中的網路編程正是通過Socket介面實現的,Socket是一種文件描述符。

常用的TCP/IP有以下三種類型的嵌套字:

流式嵌套字(SOCK_STREAM)

用於提供面向連接的、可靠的數據傳輸服務,即使用TCP進行傳輸。

數據報嵌套字(SOCK_DGRAM)

用於提供無連接的服務,即使用UDP進行傳輸。

原始嵌套字(SOCK_RAW)

可以讀寫內核沒有處理的IP數據報,而流式嵌套字只能讀取TCP的數據,數據報嵌套字只能讀取UDP的數據。

因此,如果要訪問其它協議發送的數據必須使用原始嵌套字,它允許對底層協議(如IP或ICMP)直接訪問。

2.2 埠

TCP/IP協議中的埠,埠號的範圍從0~65535。

一類是由互聯網指派名字和號碼公司ICANN負責分配給一些常用的應用程序固定使用的「周知的埠」,其值一般為0~1023。例如http的埠號是80,FTP為21,SSH為22,Telnet為23等。

還有一類是用戶自己定義的,通常是大於1024的整型值。

2.3 網路地址

網路通信,歸根到底還是進程間的通信(不同計算機上的進程間通信)。

在網路中,每一個節點(計算機或路由)都有一個網路地址,如192.168.1.4,也就是IP地址。

兩個進程通信時,首先要確定各自所在的網路節點的網路地址。

但是,網路地址只能確定進程所在的計算機,而一台計算機上很可能同時運行著多個進程,所以僅憑網路地址還不能確定到底是和網路中的哪一個進程進行通信,因此套介面中還需要包括其他的信息,也就是埠號(PORT)。

在一台計算機中,一個埠號一次只能分配給一個進程,也就是說,在一台計算機中,埠號和進程之間是一一對應關係。

所以,使用埠號和網路地址的組合可以唯一的確定整個網路中的一個網路進程。

例如,如網路中某一台計算機的IP為192.168.1.4,操作系統分配給計算機中某一應用程序進程的埠號為1500,則此時192.168.1.4 1500就構成了一個套介面。

2.4網路地址的格式
在Socket程序設計中,struct sockaddr用於記錄網路地址,其格式如下:

struct sockaddr
{
     unsigned short sa_family; /*協議族,採用AF_XXX的形式,例如AF_INET(IPv4協議族)*/
     char sa_data[14]; /*14位元組的協議地址,包含該socket的IP地址和埠號。*/
};

但在實際編程中,並不針對sockaddr數據結構進行操作,而是用與其等價的sockaddr_in數據結構:

struct sockaddr_in
{
     short int sa_family; /*地址族*/
     unsigned short int sin_port; /*埠號*/
     struct in_addr sin_addr; /*IP地址*/
     unsigned char sin_zero[8]; /*填充0 以保持與struct sockaddr同樣大小*/
};
Linux網路編程基礎

2.4.1 網路地址的轉換

IP地址通常用數字加點(如192.168.1.a)表示,而在struct in_addr中使用的式32位整數表示。因此,Linux提供如下函數進行兩者之間的轉換:

  • inet_aton()函數:
    所需要頭文件
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

函數格式

int inet_aton(const char *cp, struct in_addr *inp);

函數功能:將a.b.c.d字元串形式的IP地址轉換成32位網路序號IP地址;*cp:存放字元串形式的IP地址的指針*inp:存放32位的網路序號IP地址

返回值:轉換成功,返回非0,否則返回0;

  • inet_ntoa()函數:客戶機端:
    所需要頭文件
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

函數格式

char *inet_ntoa(struct in_addr in);

函數功能:將32位網路序號IP地址轉換成a.b.c.d字元串形式的IP地址;in:Internet主機地址的結構

返回值:轉換成功,返回一個字元指針,否則返回NULL;

Linux網路編程基礎

2.4 位元組序

不同的CPU採用對變數的位元組存儲順序可能不同。

常用的X86結構是小端模式,很多的ARM,DSP都為小端模式,即內存的低地址存儲數據的低位元組,高地址存儲數據的高位元組。

而KEIL C51則為大端模式,內存的高地址存儲數據的低位元組,低地址存儲數據高位元組。

對於網路傳輸來說,數據順序必須是一致的,網路位元組順序採用大端位元組序方式。

下面是四個常用的轉換函數:

主機轉網路:

htons()函數:

所需要頭文件:

#include <netinet/in.h>

函數格式

unsigned short int htons(unsigned short int hostshort)

函數功能:將參數指定的16位主機(host)字元順序轉換成網路(net)字元順序;hostshort:待轉換的16位主機字元順序數返回值:返回對應的網路字元順序數;

  • htonl()函數:
    所需要頭文件:
#include <netinet/in.h>

函數格式

unsigned long int htons(unsigned long int hostlong)

函數功能:將參數指定的32位主機(host)字元順序轉換成網路(net)字元順序;hostlong:待轉換的32位主機字元順序數返回值:返回對應的網路字元順序數;

網路轉主機:

  • ntohs()函數:
    所需要頭文件:
#include <netinet/in.h>

函數格式

unsigned short int ntohs(unsigned short int netshort)

函數功能:將參數指定的16位網路(net)字元順序轉換成主機(host)字元順序;netshort:待轉換的16位網路字元順序數

返回值:返回對應的主機字元順序數;

  • ntohl()函數:
    所需要頭文件:
#include <netinet/in.h>

函數格式

unsigned long int ntohl(unsigned long int netlong)

函數功能
將參數指定的32位網路(net)字元順序轉換成主機(host)字元順序;
netshort:待轉換的32位網路字元順序數
返回值
返回對應的主機字元順序數;

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/251166.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-13 17:22
下一篇 2024-12-13 17:22

相關推薦

發表回復

登錄後才能評論