socket程式設計(一)

2021-08-20 03:14:13 字數 2974 閱讀 1203

1.socket可以看成是使用者程序與核心網路協議棧的程式設計介面。

2.socket不僅可以用於本機的程序間通訊,還可以用於網路上不同主機的程序間通訊。

底層那部分已經被核心實現了,也就是tcp/ip協議棧已經屬於核心的一部分了,應用層是使用者要實現的,它屬於使用者程序的部分,也就是工作在使用者空間,使用者空間中的程式要想訪問核心,使用核心的服務,就需要通過一定的介面來訪問它,這個介面就稱為套介面,所以socket可以看成是使用者程序與核心網路協議棧的程式設計介面。

從通訊的角度上來看,套介面實現了將應用程式的資料傳遞給對等方的應用程式。

如下圖:

應用程式a要將資料傳遞給應用程式b,它是通過socket來傳輸的,這是從邏輯上來看的通訊過程,遮蔽了底層的一些實際的傳輸方式。所以可以把套介面看成一種抽象,兩個程序之間進行資料傳遞的抽象,這個抽象使得我們不會關心底層的傳輸細節,我們只需關心套介面的存在即可

並且套介面是全雙工的通訊方式,既可以從a主機到達b主機,也可以從b主機到達a主機。所以說socket不僅可以用於本機的程序間通訊,還可以用於網路上不同主機的程序間通訊。

並且,套介面還可以在異構系統間進行通訊,比如在手機上的qq和在pc上的qq進行通訊,兩者的硬體結構和軟體都可以不相同。

套介面既然能夠連線兩台機器碼,那麼套介面就必須擁有一定的屬性,要有位址的屬性來標識乙個端點,對等方也同樣要有這個屬性。可以把套介面看成**機,肯定必須都擁有**號碼才能進行連線。

struct sockaddr_in;
為什麼要有位址族的概念,因為socket在設計的時候不僅僅能夠用在tcp/ip協議,還能用於其他協議,比如unix域協議,所以必須指定位址家族,一旦指定位址家族為af_inet,說明採用的是ipv4協議。

位址是用乙個結構體來表示,ipv4協議位址是32位,實際上結構體中只有乙個成員,無符號的32位整數,埠號是16的無符號整數。

struct in_addr;
通用位址結構用來指定與套接字關聯的位址

struct sockaddr
為什麼要有通用位址結構,因為套介面不僅能用於tcp/ip程式設計,還能用於unix域程式設計,不同的協議位址結構可能不同,這個結構可以用於任何協議的套介面程式設計。

上面兩個位址結構是相容的。

大端位元組序

最高有效位儲存於最低記憶體位址處,最低有效位儲存於最高記憶體位址處。

小端位元組序

最高有效位儲存於最高記憶體位址處,最低有效位儲存於最低記憶體位址處。

這個整數在記憶體中的儲存形式有兩種。

為什麼要有位元組序的概念,因為socket能夠實現異構系統間通訊,不同的硬體平台對同乙個整數的存放形式是不一樣的,有的機器採用大端位元組序,有的機器採用小端位元組序存放。那麼當一整數傳輸至對等方,有可能無法解析,位元組序不同,導致解析出來的資料相反。所以必須統一位元組序,將資料傳輸的時候統一為乙個位元組序,統一出來的這個位元組序稱為網路位元組序(規定為大端位元組序)。主機的位元組序有可能是大端,也有可能是小端。所以先轉成網路位元組序。

現代pc大多採用小端位元組序,因此小端位元組序又被稱為主機位元組序。提出的解決方法是:傳送端總是把傳送的資料轉化成大端位元組序資料(小端機轉換,大端機不轉換)後再傳送,於是接收端知道對方傳送過來的資料總是採用大端位元組序,所以接收端可以根據自身採用的位元組序決定是否對接收到的資料進行轉換(小端機轉換,大端機不轉換)。因此大端位元組序也稱為網路位元組序。

#include #include int main(void)

下面的結果說明是小端位元組序。

一位十六進製制代表四位二進位制,0x12345678轉換成二進位制就是0001-0010-0011-0100-0101-0110-0111- 1000 而每八位二進位制占乙個位元組,所以8位十六進製制數佔4位元組

不同的主機有不同的位元組序,如x86為小端位元組序,arm位元組序是可配置的。

網路位元組序規定大端位元組序

位元組序轉換函式

uint32_t htonl(uint32_t hostlong);//將4個位元組的整數,由主機位元組序轉換成網路位元組序

uint16_t htons(uint16_t hostshort);

uint32_t ntohl(uint32_t netlong);

uint16_t ntohs(uint16_t netshort);

說明:在上述的函式中,h代表host;n代表network;s代表short;l代表long

#include #include int main(void)

int inet_aton(const char *cp,struct in_addr *inp);//和下面乙個作用一樣,輸出到引數

int_addr_t inet_addr(const char *cp);//將點分十進位制的ip位址轉化成32位的整數

char *inet_ntoa(struct in_addr in);//將乙個位址結構轉換成點分十進位制的ip位址

#include #include int main(void)

1.流式套接字(sock_stream)

提供面向連線的、可靠的資料傳輸服務,資料無差錯,無重複的傳送,且按傳送順序接受。對應的就是tcp協議。

2.資料報式套接字(sock_dgram)

提供無連線服務。不提供無錯保證,資料可能丟失或重複,並且接收順序混亂。對應的就是udp協議。

3.原始套接字(sock_raw)

socket程式設計(一)

1 socket可以看成是使用者程序與核心網路協議的程式設計介面。2 socket不僅可以用於本機的程序間通訊,還可以用於網路不同主機的程序間通訊。異構架構可以不同 手機pc ipv4套介面位址結構通常也稱為 網際套接字位址結構 它以sockaddr in命名,定義在標頭檔案中 struct soc...

socket程式設計(一)

include include pragma comment lib,ws2 32.lib using namespace std int main int argc,char argv 建立套接字 socket slisten socket af inet,sock stream,ipproto ...

Socket程式設計(一)

class program endpoint point new ipendpoint address,7788 封裝ip和埠號 server.bind point 3.開始監聽,等待客戶端做連線 server.listen 100 最大連線數是100 console.writeline serve...