国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

網(wǎng)絡(luò)編程(一)TCP單進(jìn)程服務(wù)器編程詳解

這篇具有很好參考價(jià)值的文章主要介紹了網(wǎng)絡(luò)編程(一)TCP單進(jìn)程服務(wù)器編程詳解。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一,單進(jìn)程處理服務(wù)器

1,基本概念

想要學(xué)習(xí)socket網(wǎng)絡(luò)編程的讀者一定要首先學(xué)好計(jì)算機(jī)網(wǎng)絡(luò)的理論知識(shí),包括
1)osi網(wǎng)絡(luò)七層模型與ip四層模型
2)套接字含義
3)局域網(wǎng)通信過程
4)廣域網(wǎng)通信過程
5)tcp,udp通信協(xié)議,在這兩個(gè)協(xié)議中的連接建立,數(shù)據(jù)封裝,傳輸過程,傳輸中可能遇到的問題的處理(差錯(cuò)控制,擁塞控制)
6)ip網(wǎng)絡(luò)層協(xié)議,以太網(wǎng)幀協(xié)議
7)數(shù)據(jù)的封裝
以上的知識(shí)點(diǎn)是個(gè)人覺得學(xué)習(xí)計(jì)算機(jī)網(wǎng)絡(luò)必須要理解透徹的一些知識(shí)點(diǎn),讀者可以自行學(xué)習(xí),這里不過多介紹,接下來要介紹的socket網(wǎng)絡(luò)編程便是基于以上知識(shí)點(diǎn)學(xué)習(xí)的。下文主要介紹socket編程。
socket網(wǎng)絡(luò)編程也是系統(tǒng)編程的一種,系統(tǒng)為我們提供了一系列的一些與網(wǎng)絡(luò)有關(guān)的接口,當(dāng)我們編寫一個(gè)網(wǎng)絡(luò)程序時(shí),需要用到網(wǎng)絡(luò)功能的時(shí)候只需要調(diào)用這些接口即可。理解透徹了前面所說的七個(gè)知識(shí)點(diǎn)有助于我們理解這些接口內(nèi)部具體的實(shí)現(xiàn)原理,方便我們?cè)诰W(wǎng)絡(luò)編程的時(shí)候遇到錯(cuò)誤可以更快地調(diào)試出正確的運(yùn)行效果。接下來就介紹這些接口的使用。

2,socket編程

2.1 字節(jié)序轉(zhuǎn)換,IP地址轉(zhuǎn)換,套接字賦值

套接字對(duì)應(yīng)程序猿來說就是一套網(wǎng)絡(luò)通信的接口,使用這套接口就可以完成網(wǎng)絡(luò)通信。網(wǎng)絡(luò)通信的主體主要分為兩部分:客戶端和服務(wù)器端。在客戶端和服務(wù)器通信的時(shí)候需要頻繁提到三個(gè)概念:IP、端口、通信數(shù)據(jù),下面先介紹一下需要注意的一些細(xì)節(jié)問題。

2.1.1 字節(jié)序

字節(jié)序即我們計(jì)算機(jī)組成原理曾經(jīng)學(xué)過的一個(gè)數(shù)據(jù)是采用大端存儲(chǔ)還是小端存儲(chǔ)的問題,下面也可以簡單復(fù)習(xí)一遍:大端模式——數(shù)據(jù)的高字節(jié)保存在內(nèi)存的低地址中;比如說一個(gè)以字節(jié)為單位進(jìn)行尋址的計(jì)算機(jī),要存儲(chǔ)一個(gè)十六進(jìn)制的數(shù)“0x1234”這個(gè)數(shù)字的話,每一個(gè)數(shù)據(jù)位占據(jù)4個(gè)存儲(chǔ)位,那么沒兩個(gè)數(shù)據(jù)位就占8個(gè)存儲(chǔ)位即一個(gè)字節(jié),具體存儲(chǔ)在硬盤中就是:數(shù)據(jù)的高字節(jié)“12”存儲(chǔ)在內(nèi)存的低地址中,數(shù)據(jù)的低字節(jié)“34”存儲(chǔ)在內(nèi)存的高地址中。也就是說我們要從內(nèi)存的低地址處開始取數(shù)據(jù)的話,依次取出來的是一個(gè)數(shù)據(jù)的從高到低的數(shù)據(jù)位。而小端存儲(chǔ)的話:數(shù)據(jù)的高數(shù)據(jù)字節(jié)存儲(chǔ)在高地址位;數(shù)據(jù)的低數(shù)據(jù)字節(jié)存儲(chǔ)在低地址位。
那么問題就來了,對(duì)于要通信的多個(gè)主機(jī)來說,他們內(nèi)部選擇的數(shù)據(jù)存儲(chǔ)方式是不一樣的,這也就導(dǎo)致他們讀取一串?dāng)?shù)據(jù)的讀取方式也是不一樣的,甚至在網(wǎng)絡(luò)中的數(shù)據(jù)存儲(chǔ)方式也是不一樣的,(網(wǎng)絡(luò)字節(jié)序一搬是大端)。因此在數(shù)據(jù)傳輸?shù)臅r(shí)候必須要對(duì)數(shù)據(jù)進(jìn)行處理,以保證接收數(shù)據(jù)的一方使用它自己的主機(jī)序接收數(shù)據(jù)時(shí)得到正確的數(shù)據(jù)。具體的處理方法為下面四個(gè)函數(shù)。

#include <arpa/inet.h>
// u:unsigned
// 16: 16位, 32:32位
// h: host, 主機(jī)字節(jié)序
// n: net, 網(wǎng)絡(luò)字節(jié)序
// s: short
// l: int
// 這套api主要用于 網(wǎng)絡(luò)通信過程中 IP 和 端口 的轉(zhuǎn)換
// 將一個(gè)短整形從主機(jī)字節(jié)序 -> 網(wǎng)絡(luò)字節(jié)序
uint16_t htons(uint16_t hostshort);	
// 將一個(gè)整形從主機(jī)字節(jié)序 -> 網(wǎng)絡(luò)字節(jié)序
uint32_t htonl(uint32_t hostlong);	
// 將一個(gè)短整形從網(wǎng)絡(luò)字節(jié)序 -> 主機(jī)字節(jié)序
uint16_t ntohs(uint16_t netshort)
// 將一個(gè)整形從網(wǎng)絡(luò)字節(jié)序 -> 主機(jī)字節(jié)序
uint32_t ntohl(uint32_t netlong);

這四個(gè)函數(shù)一般用來轉(zhuǎn)換ip地址(32位)與端口(16位),例如主機(jī)A某一個(gè)ip經(jīng)過 htonl 就可以將A自己的主機(jī)端序轉(zhuǎn)化為網(wǎng)絡(luò)端序,而另一個(gè)主機(jī)接收到這個(gè)數(shù)據(jù)只需要 ntohl 就可以將網(wǎng)絡(luò)端序轉(zhuǎn)換為B主機(jī)自己的端序,讓其正確讀取。
注意:一般char型的數(shù)據(jù)不需要轉(zhuǎn)換,因?yàn)楸緛硪粋€(gè)char型變量就會(huì)存儲(chǔ)一個(gè)字節(jié),不論大端小端,他們的數(shù)據(jù)存儲(chǔ)效果都是一樣的。

2.1.2 IP地址轉(zhuǎn)換

為了方便我們?nèi)庋圩x取ip地址,我們一般會(huì)把一個(gè)32位的ip地址表示成點(diǎn)分十進(jìn)制的形式,這種形式是方便人類理解了,但是計(jì)算機(jī)并不理解。因此,如果要在編程中使用點(diǎn)分十進(jìn)制的形式為一個(gè)ip進(jìn)行初始化的話,一定要記得將這個(gè)點(diǎn)分十進(jìn)制的IP地址轉(zhuǎn)換成一個(gè)整型數(shù)(網(wǎng)絡(luò)字節(jié)序,下面稱呼為大端序),轉(zhuǎn)換的方法如下:

// 主機(jī)字節(jié)序的IP地址轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序
// 主機(jī)字節(jié)序的IP地址是字符串, 網(wǎng)絡(luò)字節(jié)序IP地址是整形
int inet_pton(int af, const char *src, void *dst); 
參數(shù):
af:地址族(IP地址的家族包括ipv4和ipv6)協(xié)議
AF_INET: ipv4格式的ip地址
AF_INET6: ipv6格式的ip地址
src:傳入?yún)?shù),對(duì)應(yīng)要轉(zhuǎn)換的點(diǎn)分十進(jìn)制的ip地址:192.168.1.100
dst:傳出參數(shù),函數(shù)調(diào)用完成,轉(zhuǎn)換得到的大端整形IP被寫入到這塊內(nèi)存中
O返回值:成功返回1,失敗返回0或者- 1

另外,我們當(dāng)然也可以將一個(gè)整型數(shù)轉(zhuǎn)換為一個(gè)點(diǎn)分十進(jìn)制的字符串

#include <arpa/inet.h>
// 將大端的整形數(shù), 轉(zhuǎn)換為小端的點(diǎn)分十進(jìn)制的IP地址        
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);

:還有一組函數(shù)也能進(jìn)程I地址大小端的轉(zhuǎn)換,但是只能處理ipv4的ip地址:

// 點(diǎn)分十進(jìn)制IP -> 大端整形
in_addr_t inet_addr (const char *cp);

// 大端整形 -> 點(diǎn)分十進(jìn)制IP
char* inet_ntoa(struct in_addr in);
2.1.3, 結(jié)構(gòu)體:sockaddr,sockaddr_in

1,sockaddr結(jié)構(gòu)體
系統(tǒng)內(nèi)核通過讀取該結(jié)構(gòu)體當(dāng)中的內(nèi)容獲取我們要寫的套接字的ip地址與端口,比如bind函數(shù)就需要輸入一個(gè)sockaddr的參數(shù)來指明其要綁定的ip地址與端口,這個(gè)結(jié)構(gòu)體成員如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-616114.html


typedef unsigned short int sa_family_t;
#define __SOCKADDR_COMMON_SIZE (sizeof (unsigned short int))
typedef unsigned short  uint16_t;
typedef unsigned int    uint32_t;
struct sockaddr {
   
	sa_family_t sa_family;       // 地址族協(xié)議, ipv4
	

到了這里,關(guān)于網(wǎng)絡(luò)編程(一)TCP單進(jìn)程服務(wù)器編程詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Linux網(wǎng)絡(luò)編程二(TCP三次握手、四次揮手、TCP滑動(dòng)窗口、MSS、TCP狀態(tài)轉(zhuǎn)換、多進(jìn)程/多線程服務(wù)器實(shí)現(xiàn))

    Linux網(wǎng)絡(luò)編程二(TCP三次握手、四次揮手、TCP滑動(dòng)窗口、MSS、TCP狀態(tài)轉(zhuǎn)換、多進(jìn)程/多線程服務(wù)器實(shí)現(xiàn))

    TCP三次握手 TCP 三次握手 (TCP three-way handshake)是TCP協(xié)議建立可靠連接的過程,確??蛻舳撕头?wù)器之間可以進(jìn)行可靠的通信。下面是TCP三次握手的詳細(xì)過程: 假設(shè)客戶端為A,服務(wù)器為B 1 、第一次握手(SYN=1,seq=500) A向B發(fā)送一個(gè)帶有SYN標(biāo)志位的數(shù)據(jù)包,表示A請(qǐng)求建立連接。

    2024年02月06日
    瀏覽(42)
  • Linux網(wǎng)絡(luò)編程二(TCP圖解三次握手及四次揮手、TCP滑動(dòng)窗口、MSS、TCP狀態(tài)轉(zhuǎn)換、多進(jìn)程/多線程服務(wù)器實(shí)現(xiàn))

    Linux網(wǎng)絡(luò)編程二(TCP圖解三次握手及四次揮手、TCP滑動(dòng)窗口、MSS、TCP狀態(tài)轉(zhuǎn)換、多進(jìn)程/多線程服務(wù)器實(shí)現(xiàn))

    1、TCP三次握手 TCP 三次握手 (TCP three-way handshake)是 TCP協(xié)議建立可靠連接 的過程,確??蛻舳撕头?wù)器之間可以進(jìn)行可靠的通信。下面是TCP三次握手的 詳細(xì)過程 : 假設(shè)客戶端為A,服務(wù)器為B。 (1) 第一次握手 第一次握手(SYN=1,seq=500) A向B發(fā)送一個(gè)帶有 SYN 標(biāo)志位的數(shù)據(jù)包,

    2024年04月22日
    瀏覽(38)
  • 【Linux網(wǎng)絡(luò)編程】網(wǎng)絡(luò)編程套接字(TCP服務(wù)器)

    【Linux網(wǎng)絡(luò)編程】網(wǎng)絡(luò)編程套接字(TCP服務(wù)器)

    作者:愛寫代碼的剛子 時(shí)間:2024.4.4 前言:本篇博客主要介紹TCP及其服務(wù)器編碼 只介紹基于IPv4的socket網(wǎng)絡(luò)編程,sockaddr_in中的成員struct in_addr sin_addr表示32位 的IP地址 但是我們通常用點(diǎn)分十進(jìn)制的字符串表示IP地址,以下函數(shù)可以在字符串表示和in_addr表示之間轉(zhuǎn)換 字符串轉(zhuǎn)in

    2024年04月14日
    瀏覽(108)
  • 【網(wǎng)絡(luò)編程】demo版TCP網(wǎng)絡(luò)服務(wù)器實(shí)現(xiàn)

    【網(wǎng)絡(luò)編程】demo版TCP網(wǎng)絡(luò)服務(wù)器實(shí)現(xiàn)

    UDP和TCP的區(qū)別: 對(duì)于TCP協(xié)議有幾個(gè)特點(diǎn): 1?? 傳輸層協(xié)議 2?? 有連接(正式通信前要先建立連接) 3?? 可靠傳輸(在內(nèi)部幫我們做可靠傳輸工作) 4?? 面向字節(jié)流 對(duì)于UDP協(xié)議有幾個(gè)特點(diǎn): 1?? 傳輸層協(xié)議 2?? 無連接 3?? 不可靠傳輸 4?? 面向數(shù)據(jù)報(bào) 可以看到

    2024年02月06日
    瀏覽(29)
  • Linux網(wǎng)絡(luò)編程:多進(jìn)程 多線程_并發(fā)服務(wù)器

    文章目錄: 一:wrap常用函數(shù)封裝 wrap.h? wrap.c server.c封裝實(shí)現(xiàn) client.c封裝實(shí)現(xiàn) 二:多進(jìn)程process并發(fā)服務(wù)器 server.c服務(wù)器 實(shí)現(xiàn)思路 代碼邏輯? client.c客戶端 三:多線程thread并發(fā)服務(wù)器 server.c服務(wù)器 實(shí)現(xiàn)思路 代碼邏輯? client.c客戶端 ???? ??read 函數(shù)的返回值 wrap.h? wrap

    2024年02月12日
    瀏覽(31)
  • 【網(wǎng)絡(luò)編程】TCP流套接字編程(TCP實(shí)現(xiàn)回顯服務(wù)器)

    【網(wǎng)絡(luò)編程】TCP流套接字編程(TCP實(shí)現(xiàn)回顯服務(wù)器)

    Socket(既能給客戶端使用,也能給服務(wù)器使用) 構(gòu)造方法 基本方法: ServerSocket(只能給服務(wù)器使用) 構(gòu)造方法: 基本方法: 客戶端代碼示例: 服務(wù)器代碼示例: 運(yùn)行結(jié)果: 代碼執(zhí)行流程: 服務(wù)器啟動(dòng),阻塞在accept,等待客戶端建立連接. 客戶端啟動(dòng).這里的new操作會(huì)觸發(fā)和服務(wù)器之間建立連

    2024年04月25日
    瀏覽(23)
  • 網(wǎng)絡(luò)編程(8.14)TCP并發(fā)服務(wù)器模型

    網(wǎng)絡(luò)編程(8.14)TCP并發(fā)服務(wù)器模型

    作業(yè): 1.?多線程中的newfd,能否修改成全局,不行,為什么? 2.?多線程中分支線程的newfd能否不另存,直接用指針間接訪問主線程中的newfd,不行,為什么? 多線程并發(fā)服務(wù)器模型原代碼: 1.將newfd改成全局變量效果: ?答:不行,因?yàn)閚ewfd是全局變量的話,客戶端連接后生成

    2024年02月13日
    瀏覽(28)
  • 學(xué)習(xí)網(wǎng)絡(luò)編程N(yùn)o.6【將服務(wù)器日志和守護(hù)進(jìn)程化】

    學(xué)習(xí)網(wǎng)絡(luò)編程N(yùn)o.6【將服務(wù)器日志和守護(hù)進(jìn)程化】

    北京時(shí)間:2023/9/1/21:15,下午剛更新完博客,同理再接再厲,這樣整天不需要干什么,除了玩手機(jī)的日子不多了,馬上就要開學(xué),每天需要簽到簽退的日子就要來臨,煩躁,照我預(yù)料下學(xué)期我們學(xué)校應(yīng)該會(huì)開一門Java的專業(yè)課,現(xiàn)在這種線下課給我的第一感覺就是擺爛,學(xué)了跟

    2024年02月08日
    瀏覽(22)
  • 計(jì)算機(jī)網(wǎng)絡(luò)編程 | 并發(fā)服務(wù)器代碼實(shí)現(xiàn)(多進(jìn)程/多線程)

    計(jì)算機(jī)網(wǎng)絡(luò)編程 | 并發(fā)服務(wù)器代碼實(shí)現(xiàn)(多進(jìn)程/多線程)

    歡迎關(guān)注博主 Mindtechnist 或加入【Linux C/C++/Python社區(qū)】一起學(xué)習(xí)和分享Linux、C、C++、Python、Matlab,機(jī)器人運(yùn)動(dòng)控制、多機(jī)器人協(xié)作,智能優(yōu)化算法,濾波估計(jì)、多傳感器信息融合,機(jī)器學(xué)習(xí),人工智能等相關(guān)領(lǐng)域的知識(shí)和技術(shù)。 專欄:《網(wǎng)絡(luò)編程》 當(dāng)涉及到構(gòu)建高性能的服務(wù)

    2024年02月08日
    瀏覽(36)
  • 【網(wǎng)絡(luò)編程】實(shí)現(xiàn)UDP/TCP客戶端、服務(wù)器

    【網(wǎng)絡(luò)編程】實(shí)現(xiàn)UDP/TCP客戶端、服務(wù)器

    需要云服務(wù)器等云產(chǎn)品來學(xué)習(xí)Linux的同學(xué)可以移步/--騰訊云--/--阿里云--/--華為云--/官網(wǎng),輕量型云服務(wù)器低至112元/年,新用戶首次下單享超低折扣。 ? 目錄 一、UDP 1、Linux客戶端、服務(wù)器 1.1udpServer.hpp 1.2udpServer.cc 1.3udpClient.hpp 1.4udpClient.cc 1.5onlineUser.hpp 2、Windows客戶端 二、T

    2024年02月06日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包