Linux網絡編程 day4

inet_pton:IP 字符串 → 網絡字節序地址
ntohl:網絡字節序 → 主機字節序

TCP狀態轉換圖(重點)?

可以通過下面這行代碼查看目前網絡狀態

netstat -apn | grep client

?

1、主動發起請求端? close-->SYN-->SYN_SENT-->接收ACK、SYN-->SYN_SENT-->發送ACK-->ESTABLISHED(數據通信狀態).

2、主動關閉請求端ESTABLISHED-->發送FIN-->FIN_WAIT_1-->接收ACK-->FIN_WAIT_2(半關閉)-->接收對端FIN-->FIN_WAIT_2-->發送ACK-->TIME_WAIT-->等待2MSL時長-->CLOSE.

只有主動關閉連接方會經歷TIME_WAIT狀態。

3、被動接收連接請求端 close-->LISTEN-->接收SYN-->LISTEN-->發送ACK、SYN-->SYN_RCVD-->接收ACK-->ESTABLISHED.

4、被動關閉連接請求端ESTABLISHED-->接收SYN-->ESTABLISHED-->發送ACK-->CLOSE_WAIT-->發送FIN-->LAST_ACK-->接收ACK-->CLOSE.?

當被動關閉連接請求端處于CLOSE_WAIT的時候,主動關閉連接請求端處于半關閉狀態。

重點記憶:ESTABLISHED、FIN_WAIT_2 <---->CLOSE_WAIT、TIME_WAIT(2MSL).

2MSL時長

一定出現在主動發送請求端。

保證最后一個ACK能成功被對端接收。(等待期間,對端沒收到我發的ACK,對端會再次發送FIN請求)。

端口復用(讓端口重復利用,固定操作)

在server代碼的socket和bind之間插入下面代碼

int opt = 1; // 取值一般只有兩個 0/1
setsockopt(listenfd , SOL_SOCKET , SO_REUSEADDR , (void*)&opt , sizeof(opt));SO_REUSEADDR:允許重用本地地址
SO_RESUEPORT:允許重用本地端口成功返回0,失敗-1

半關閉

通信雙方中只有一端關閉通信 ---FIN_WAIT_2.

close(cfd);

close(cfd);
shutdown(int fd , int how);
how:   SHUT_RD;   關讀端 SHUT_WR;   關寫端SHUT_RDWR; 關讀寫端

這個函數不是很重要,結論:shutdown在關閉多個文件描述符應用的文件時,采用全關閉的方法,close只關閉一個(主要在dup2的時候用到的區別)。

select多路IO轉接

借助內核,select來監聽客戶端連接、數據通信事件。

之前做的CS模型中都是服務器端自己做連接以及read/write等操作,這種方法相當于是有了一個秘書select,服務器端創建了lfd之后交給select,select監聽是否有要建立連接的客戶端,如果有,反饋給服務器端,讓服務器端調用accept函數,創建cfd,之后再交給select,如果select監聽到客戶端有傳數據的需求再反饋給服務器端。

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);nfds:所有監聽的最大的文件描述符+1
fd_set *readfds, fd_set *writefds, fd_set *exceptfds:傳入傳出參數
fd_set *readfds:讀文件描述符監聽集合
fd_set *writefds:寫文件描述符監聽集合
fd_set *exceptfds:異常文件描述符監聽集合
通常寫和異常不使用,一般用NULL
可以參考位圖timeout > 0 設置監聽超時時長
timeout = 0 非阻塞監聽,輪詢
timeout = NULL 阻塞監聽返回值 > 0 , 所有監聽集合(3)中 , 滿足對應事件總數
返回值 = 0 ,  所有監聽集合(3)中 , 沒有滿足對應事件總數
返回值 = -1 , errno

?FD_ZERO

清空一個文件描述符集合。

void FD_ZERO(fd_set *set);eg. fd_set rset;
FD_ZERO(&rset);

?FD_SET

將待監聽的文件描述符,添加到監聽集合中。

void FD_SET(int fd, fd_set *set);
eg.
fd_set rset;
FD_ZERO(&rset);
FD_SET(3 , &rset);

FD_CLR

將一個文件描述符從監聽集合中移除。

void FD_CLR(int fd, fd_set *set);

FD_ISSET

判斷一個文件描述符是否在監聽集合中。

int  FD_ISSET(int fd, fd_set *set);
返回值:在返回1 不在返回0

多路復用IO轉接代碼思路

lfd = socket();                  //創建套接字
bind();                          //綁定地址結構
listen();                        //設置監聽上限
fd_set rset , allset;            //創建讀監聽集合
FD_ZERO(&rset);                  
FD_ZERO(&allset);                //將讀監聽集合清零
FD_SET(lfd , &allset);           //將lfd添加至讀監聽集合中
while(1){rset = allset;ret = select(lfd + 1 , &rset , NULL , NULL , NULL); //監聽文件描述符集合對應的事件if(ret > 0){if(FD_ISSET(lfd , &rset))  //1 在 , 0不在{    cfd = accept();FD_SET(cfd , &allset);}for(i = lfd + 1 ; i <= 最大文件描述符; i++){FD_ISSET(i , &rset);read();toupper();write();}}
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<pthread.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<ctype.h>
#define SER_PORT 9003void sys_err(char* s)
{perror(s);exit(1);
}int main(int argc , char *argv[])
{int lfd , cfd ,maxfd , i , n , k;char buf[BUFSIZ];struct sockaddr_in serv_addr , clit_addr;socklen_t clit_addr_len;bzero(&serv_addr , sizeof(serv_addr));serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(SER_PORT);serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);lfd = socket(AF_INET , SOCK_STREAM , 0);if(lfd == -1)sys_err("socket error");int opt = 1;setsockopt(lfd , SOL_SOCKET , SO_REUSEADDR , (void*)&opt , sizeof(opt));int ret = bind(lfd , (struct sockaddr*)&serv_addr , sizeof(serv_addr));if(ret == -1)sys_err("bind error");listen(lfd , 128);fd_set rset , allset; //定義讀集合和備份集合FD_ZERO(&rset);FD_ZERO(&allset);FD_SET(lfd , &allset); //添加到讀集合中maxfd = lfd; //最大文件描述符while(1){rset = allset; //備份ret = select(maxfd + 1 , &rset , NULL , NULL , NULL); //使用select監聽clit_addr_len = sizeof(clit_addr);if(ret > 0){if(FD_ISSET(lfd , &rset)){cfd = accept(lfd , (struct sockaddr*)&clit_addr , &clit_addr_len); //建立連接,不會阻塞。FD_SET(cfd , &allset); //將新產生的cfd添加到監聽讀集合中,監聽數據讀事件if(maxfd < cfd)maxfd = cfd;if(ret == 1) //說明select只返回一個并且是lfd,后續無需執行。continue;}for(i = lfd + 1 ; i <= maxfd ; i++){   //處理滿足讀事件的fdif(FD_ISSET(i , &rset)){            //找到滿足讀事件的fdn = read(i , buf , sizeof(buf));if(n == 0){    //檢測到客戶端關閉close(i);  FD_CLR(i , &allset); // 移除}else if(n < 0){sys_err("read error");}else{for(k = 0 ; k < n ; k++){buf[k] = toupper(buf[k]);}write(STDOUT_FILENO , buf , n);write(i , buf , n);}}}}else if(ret < 0){sys_err("select error");}}close(cfd);return 0 ;
}

但是上述代碼有個問題,就是當rset為[3,6,1023],相當于要循環判斷1023次,運行效率低。可以自定義一個數組,將要監聽的文件描述符放到數組中。然后根據下標索引取出需要的文件描述符。

select的優缺點

缺點:

1、監聽上限受文件描述符限制,最大1024。

2、檢測滿足條件的fd,自己添加業務邏輯提高小。提高了編碼難度。

優點:

1、跨平臺。win、Linux、macos、unix、mips。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/79593.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79593.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/79593.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于springboot+vue的個人財務管理系統

開發語言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服務器&#xff1a;tomcat7數據庫&#xff1a;mysql 5.7數據庫工具&#xff1a;Navicat12開發軟件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.3.9 系統展示 用戶信息管理 賬…

ffmpeg 元數據-avformatcontext字段 AVDictionary *metadata;

ffmpeg 元數據 1. 解釋什么是ffmpeg元數據 ffmpeg元數據是指與音視頻文件相關的附加信息&#xff0c;這些信息不直接影響音視頻內容的播放&#xff0c;但提供了關于文件內容、創作者、版權、播放參數等的有用信息。元數據在音視頻文件的處理、管理和共享中起著重要作用。 2.…

55.[前端開發-前端工程化]Day02-包管理工具npm等

包管理工具詳解 npm、yarn、cnpm、npx、pnpm 1 npm包管理工具 代碼共享方案 包管理工具npm 2 package配置文件 npm的配置文件 方式二 常見的配置文件 常見的屬性 常見的屬性 常見的屬性 依賴的版本管理 常見屬性 npm install 命令 項目安裝 3 npm install原理 npm instal…

Spring MVC @RequestBody 注解怎么用?接收什么格式的數據?

RequestBody 注解的作用 RequestBody 將方法上的參數綁定到 HTTP 請求的 Body&#xff08;請求體&#xff09;的內容上。 當客戶端發送一個包含數據的請求體&#xff08;通常在 POST, PUT, PATCH 請求中&#xff09;時&#xff0c;RequestBody 告訴 Spring MVC 讀取這個請求體…

海外平臺短劇批量混剪自動剪輯智能去重與多語言適配方案解析

一、引言&#xff1a;全球化內容分發的技術挑戰 在短劇出海的浪潮中&#xff0c;如何通過標準化技術流程實現「高效生產 合規分發」成為行業關鍵課題。本文結合 TikTok、YouTube 等平臺的運營經驗&#xff0c;解析基于智能去重算法、多語言字幕生成、動態元素疊加的全流程解決…

stm32 hal庫 SPI使用(二)硬件SPI的HAL庫函數調用

使用硬件SPI1&#xff0c;開啟DMA&#xff0c;軟件NSS。 1.使用硬件spi后&#xff0c;spi.c文件里會自動生成SPI_HandleTypeDef hspi1句柄&#xff0c;并且在main.c中自動使用MX_SPI1_Init&#xff08;&#xff09;函數對hsp1句柄賦值和SPI初始化 void MX_SPI1_Init(void) {h…

ES類的索引輪換

通過以下請求方法創建一個名為 “tiered-storage-policy” 的 ISM policy&#xff1a; PUT _plugins/_ism/policies/tiered-storage-policy {"policy": {"description": "Changes replica count and deletes.","schema_version": 1,…

51LA使用方法與悟空統計,網站數據分析的雙重選擇

在網站運營與數據分析領域&#xff0c;51LA作為國內較早的流量統計工具&#xff0c;曾為許多用戶提供基礎的訪問數據監測服務。然而&#xff0c;隨著技術的發展和用戶需求的升級&#xff0c;越來越多的企業開始尋求功能更全面、體驗更優的統計工具。小編今天將給大家介紹一款更…

go語言實現用戶管理系統

goweb實現用戶管理系統 用戶后臺管理系統功能描述 登錄功能 支持用戶通過郵箱密碼和密碼進行登錄。對輸入的郵箱和密碼進行驗證&#xff0c;確保用戶信息的正確性。登錄成功后&#xff0c;更新用戶的今日登錄統計信息&#xff0c;并將用戶信息存入會話&#xff08;cookie&am…

Elasticsearch:RAG 和 grounding 的價值

作者&#xff1a;來自 Elastic Toms Mura 了解 RAG、grounding&#xff0c;以及如何通過將 LLM 連接到你的文檔來減少幻覺。 更多閱讀&#xff1a;Elasticsearch&#xff1a;在 Elastic 中玩轉 DeepSeek R1 來實現 RAG 應用 想獲得 Elastic 認證嗎&#xff1f;查看下一期 Elast…

【黑馬JavaWeb+AI知識梳理】后端Web基礎01 - Maven

Maven Maven核心 Maven概述 定義&#xff1a; Maven是一款用于管理和構建Java項目的工具&#xff0c;是apache旗下的一個開源項目&#xff0c;基于項目對象模型&#xff08;POM&#xff0c;project object model&#xff09;的概念&#xff0c;通過一小段描述信息來管理項目的…

C語言易混淆知識點詳解

C語言中容易混淆的知識點詳解 C語言作為一門基礎且強大的編程語言&#xff0c;有許多容易混淆的概念和特性。以下是C語言中一些常見易混淆知識點的詳細解析&#xff1a; 1. 指針與數組 相似點&#xff1a; c 復制 下載 int arr[10]; int *ptr arr; 都可以使用[]運算符訪…

MCP原理詳解及實戰案例(動嘴出UI稿、3D建模)

文章目錄 MCP 原理介紹架構核心組件協議層傳輸層連接生命周期MCP與function calling: 互補關系 MCP python SDKMCP的優點 怎么用MCP&#xff1a;天氣服務參考應用項目&#xff1a; REF 24年11月份&#xff0c;claude推出了模型上下文協議( MCP),作為一種潛在的解決方案&#xf…

2025年深圳杯數學建模(東三省)B題【顏色轉換】原論文講解(含完整python代碼)

大家好呀&#xff0c;從發布賽題一直到現在&#xff0c;總算完成了2025年深圳杯數學建模&#xff08;東三省&#xff09;B題【顏色轉換】完整的成品論文。 本論文可以保證原創&#xff0c;保證高質量。絕不是隨便引用一大堆模型和代碼復制粘貼進來完全沒有應用糊弄人的垃圾半成…

cpp學習筆記1--class

2年前學過cpp&#xff0c;但是一直沒有用到&#xff0c;現在要讀研了&#xff0c;終于要用到了&#xff0c;重新拿出來看一看&#xff0c;覺得很多東西都能在c和python上看到影子。 #include "iostream" class Person { private:std::string name;int age;public://…

基于YOLOv的目標檢測訓練數據構建方法研究—圖像采集、標注、劃分與增強一體化流程設計

在目標檢測任務中,高質量的訓練數據是模型性能提升的關鍵。本文圍繞 YOLOv 系列模型,系統性地研究了目標檢測訓練數據的構建方法,提出了一套從圖像采集、標注、數據集劃分到數據增強的一體化流程設計 。通過多源圖像采集策略確保樣本多樣性,結合 LabelImg 工具完成 VOC 格式…

SQL數據庫操作大全:從基礎到高級查詢技巧

大家好&#xff0c;歡迎來到程序視點&#xff01;我是你們的老朋友.小二&#xff01; SQL數據庫操作核心語法精要 數據庫基礎操作 創建/刪除數據庫&#xff1a;CREATE DATABASE / DROP DATABASE 備份SQL Server&#xff1a;使用sp_addumpdevice和BACKUP DATABASE命令 數據庫…

[2025]MySQL的事務機制是什么樣的?redolog,undolog、binog三種日志的區別?二階段提交是什么?ACID怎么保證的?主從復制的過程?

MySQL事務機制與日志系統詳解 一、MySQL事務機制 1. 事務特性&#xff08;ACID&#xff09; 特性實現機制原子性(Atomicity)undo log回滾,(事務作為一個整體被執行&#xff0c;包含在其中的對數據庫的操作要么全部被執行&#xff0c;要么都不執行)。一致性(Consistency)約束…

LLama-v2 權重下載

地址&#xff1a;llama模型 官方github倉庫&#xff1a;llama倉庫 注意點 網絡代理位置&#xff1a;美國下面的國家選擇 United States 克隆倉庫后 運行bash download.sh輸入郵箱收到的URL選擇要下載的權重等待下載完成即可 有問題留言&#xff01;&#xff01;&#xff01…

zephyr OS架構下構建Nordic MCU boot

目錄 概述 1. 軟硬件環境 1.1 軟件開發環境 1.2 硬件環境 2 MCU boot 2.1 核心功能 2.2 關鍵術語 2.3 重要字段介紹 3 VS-Code下創建MCU-BOOT項目 3.1 軟件框架結構 3.2 創建測試項目 3.3 編譯項目 3.3 固件在Flash中的分布 4 驗證 4.1 燒寫固件 ? 4.2 代碼…