網絡編程套接字詳解

目錄

1. 預備介紹

2.網絡字節序

3.udp網絡程序

4.地址轉換函數

5.udp網絡編程


1.預備介紹

1.1源IP地址和目標IP地址

舉個例子:

? ? ? 從北京出發到上海旅游, 那么源IP地址就是北京, 目標IP地址就是上海.

?1.2 端口號

?作用: 標識一個進程, 告訴OS這個數據交給那個進程來處理;

(1) 端口號是2字節16位數據;

(2) 端口號+IP地址就可以標識特定的某一臺主機和某一個進程來處理;

(3)?一個端口號只能標識一個進程;

小tips:

端口號和進程ID有什么聯系?

一個進程可以有多個端口號, 但是一個端口號只能標識一個進程.

源端口號和目標端口號

源端口號是指發送數據的應用程序在本地計算機上使用的端口號,而目的端口號是指接收數據的應用程序在遠程計算機上使用的端口號。

舉個栗子: 送快遞的這個快遞是誰發的,就是源端口號, 發送給誰就是目標端口號.

?1.3 TCP協議和udp協議特點

TCP特點: 傳輸層協議 有連接 可靠傳輸 面向字節流

UDP特點:?傳輸層協議 無連接 不可靠傳輸 面向數據報

?2.網路字節序

網絡數據流和內存地址一樣也是分大小端的, 網絡字節序就是用來定義網絡數據流的地址.

(1)發送端主機通常將緩沖區的數據由低到高的順序發出;

(2)接受端主機也將數據由低到高的順序進行保存到緩沖區;

(3)所以先發出的數據是低地址, 后發出的是高地址.

(4)無論主機是大端還是小端機,?都是按照TCP/IP協議大端字節序(低位是高地址);


2.1 認識一些接口用于主機字節序和網絡字節序的交換:

(1)socket: 創建一個套接字.(文件描述符)

參數1.domain:地址族; 就是IP地址類型, 常用有AF_INET和AF_INET6.

2.type:套接字的類型, 有SOCK_STREAM(流式套接字) 和 SOCK_DGRAM(數據報套接字);

3.protocol: 傳輸協議;

(2) bind: 綁定端口號.

(3) listen: 監聽端口號;

(4)accept接受請求:

(5) connect建立連接:

sockaddr結構體:網絡編程接口

sockaddr:保存多種類型的IP的地址和端口號.

sockaddr_in: 用來專門保存IPv4的地址

3.udp網絡程序

這里專門后面寫一篇博客詳細講解! 大家可以蹲一波.謝謝!

4.地址轉換函數

sockaddr結構體里面的一個字段:

sin_addr: 是表示32位的IP地址, 我們通常的讀取地址字符串的點分十進制;

字符串轉in_addr的函數:

htonl和htons是用來主機序轉為網絡序;

ntohl和ntohs是用來網絡序轉為主機序;

in_addr轉字符串的函數:

inet_ntoa函數: 將返回結果放到了靜態區, 第二次調用會覆蓋之前的數據, 可能造成線程不安全的問題, 最好使用inet_ntop, 將數據存放在緩存區.

?5.TCP網絡編程

這個和udp編程放到一篇博客里面具體來講.

?6.sock API

(1)?sock:打開網絡通訊接口;成功就會返回一個文件描述符;

錯誤就會返回-1;

int sock(int domain, int type, int protocol)

(2) bind: 用來綁定特定的IP地址和端口號用來向服務器發起連接;

成功返回0, 失敗返回-1.

將sockfd和addr進行綁定, 用于網絡監聽文件描述符;

Add:

對于addr需要自己進行手動修改, bzero進行清零; 設置sin_family , sin_addr.s_addr ,

sin_port.

int bind(int sockfd, const struct sockaddr* addr, socklen_t addrlen)

(3)?listen: 網絡監聽

backlog是運行客戶端等待連接的個數;

listen()成功返回0,失敗返回-1;

int listen(int sockfd, int backlog)

(4) accept:

三次握手成功之后, 調用accept接受連接;

如果還沒有客戶端連接的請求就會阻塞等待直到客戶端連接;

addr參數是用來傳出客戶端的IP和端口號; 如果為NULL就是不關系客戶端的地址;

addrlen參數就是用來緩沖區的長度避免溢出, 傳出的是sockaddr的實際長度.

int accept(int sockfd, const struct sockaddr* addr, struct socklen_t* addrlen)

(5) connect:連接服務器;??

與bind的區別: connect連接的是別人的地址, bind的是自己的地址.

成功返回0, 失敗返回-1.

int connect(int sockfd, const struct sockaddr* addr, socklen_t addrlen)

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

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

相關文章

Oracle: 一個用戶多個表空間處理

1.場景描述 今天工作中,同事說建了一個用戶,往里面導入數據時提示表空間不存在,建了表空間后,部分仍然導不進去。期望幫忙創建表空間,并指定默認表空間,成功將數據導入。 (1)創建好的…

K8s:二進制安裝k8s(單臺master)

目錄 一、安裝k8s 1、拓撲圖 2、系統初始化配置 2.1關閉防火墻selinx以及swap 2.2設置主機名 2.3在每臺主機中添加hosts,做映射 2.4調整內核參數,將橋接的ipv4流量傳遞到iptables,關閉ipv6 2.4時間同步 3、部署docker引擎&#xff0…

使用LangChain和Neo4j快速創建RAG應用

大家好,Neo4j 通過集成原生的向量搜索功能,增強了其對檢索增強生成(RAG)應用的支持,這標志著一個重要的里程碑。這項新功能通過向量索引搜索處理非結構化文本,增強了 Neo4j 在存儲和分析結構化數據方面的現…

go語言map底層及擴容機制原理詳解(上)

底層數據結構-哈希表 go語言map的底層數據結構是哈希表:通過哈希表來存儲鍵值對,通過hash函數把鍵值對散列到一個個桶(bucket)中。 什么是哈希表? 在順序結構以及平衡樹中,元素與其的存儲位置之間沒有對應關系,因此…

SwiftUI中的@StateObject和@ObservedObject的區別

SwiftUI中的StateObject和ObservedObject屬性包裝器指示視圖更新以響應被觀察對象的變化。雖然這兩個屬性包裝器看起來很相似,但在使用SwiftUI構建應用程序時,有一個關鍵的區別需要理解。 兩個屬性包裝器都要求對象符合ObservableObject協議。這個協議表…

表征和基于結構的蛋白質工程:黃芪特異性皂苷乙酰轉移酶-文獻精讀14

Characterization and structure-based protein engineering of a regiospecific saponin acetyltransferase from Astragalus membranaceus 表征和基于結構的蛋白質工程:黃芪特異性皂苷乙酰轉移酶,一篇乙酰基轉移酶文章精讀分享~ 摘要 乙酰化有助于許…

【C++】繼承相關(基類與派生類的繼承關系以及細節整理)

目錄 00.引言 01.繼承的定義 02.基類和派生類對象 03.繼承中的作用域 04.派生類的默認成員函數 05.友元、靜態成員 00.引言 繼承是面向對象編程中的一個重要概念,它的作用是創建一個新的類,該類可以從一個已存在的類(父類/基類&#x…

服務攻防——數據庫安全

第一步: 端口掃描:nmap 掃不到端口:端口被修改,防護軟件,放在內網環境 mysql 內置端口3306 第一種官方漏洞 第一步:先掃描有什么端口開發 用這個錯誤密碼一直訪問,最終就進去了 弱口令猜解 不可以直接猜解&#x…

WEB后端復習——MVC、SSM【含登錄頁面代碼】

MVC(Model-View-Controller)是一種軟件設計模式,用于將應用程序分解為三個相互關聯的組件:模型(Model)、視圖(View)和控制器(Controller)。這種模式在構建用戶…

機器人學導論實驗1—CoppeliaSim 平臺介紹及初步使用BJTU

1. 實驗內容分析 對實驗內容的理解及關鍵點: 理解這個實驗的關鍵點在于理解如何使用CoppeliaSim和MATLAB來控制和操作機器人。需要熟悉這兩個工具的基本操作,例如如何加載場景、如何修改機器人參數、如何使用MATLAB客戶端程序來控制機器人等。此外&#…

Docker 部署 Prometheus 實現一個極簡的 QPS 監控

背景 : Prometheus 是近年來最流行的開源監控框架, 其功能強大且易于使用, 擁有各種主流后端語言(Java/Go/Python/Node.js等)與各種場景(如web handler/ k8s/Nginx/MySQL等)的客戶端, 并自帶圖形化顯示頁面。分享一個快速入門Prometheus 的教程, 實現一個極簡的, 后端開發需要特…

Nginx-基礎-基礎配置-Location

Location 參數匹配模式 參數匹配方式匹配模式說明注意事項精準匹配普通字符串匹配用于標準uri前,要求請求字符串與uri精準匹配,成功則立即處理,nginx停止搜索其他匹配。~正則匹配正則表達式匹配用于正則uri,表示uri包含正則表達…

使用 Docker 輕松部署 Spring Boot 應用

當今軟件開發領域,Docker 和 Spring Boot 的組合已成為開發和部署應用程序的黃金標準。在這篇博客中,我們將詳細探討如何將 Spring Boot 應用容器化并使用 Docker 進行部署,確保你的部署過程既高效又可靠。 引言 Docker 提供了一個標準化的…

基于SSM的理發店會員管理系統的設計和實現(有報告)。Javaee項目。ssm項目。

演示視頻: 基于SSM的理發店會員管理系統的設計和實現(有報告)。Javaee項目。ssm項目。 項目介紹: 采用M(model)V(view)C(controller)三層體系結構&#xff0…

Docker安裝達夢數據庫

1.確保已安裝Docker 可參考:Linux安裝Docker-CSDN博客 2.上傳dm鏡像并導入安裝包 可以從:產品下載 | 達夢數據庫下載dm鏡像,如下圖: docker load -i dm8_20230808.tar 3.導入后查看鏡像 docker images 4.啟動容器 docker run …

圖的概念、性質和存儲與簡單遍歷

前置知識:樹的基本概念及性質 為了保證學習效果,請保證已經掌握前置知識之后,再來學習本章節!如果在閱讀中遇到困難,也可以回到前面章節查閱。 學習目標 掌握圖的基本概念掌握圖的一些性質 圖的概念 基本概念 圖 (…

Pytorch如何計算網絡參數

方法一. 利用pytorch自身 PyTorch是一個流行的深度學習框架,它允許研究人員和開發者快速構建和訓練神經網絡。計算一個PyTorch網絡的參數量通常涉及兩個步驟:確定網絡中每個層的參數數量,并將它們加起來得到總數。 以下是在PyTorch中計算網…

如何在 CloudFlare 里屏蔽/攔截某個 IP 或者 IP 地址段

最近除了接的 CloudFlare 代配置訂單基本很少折騰自己的 CloudFlare 配置了,今天給大家簡單的講解一下如何在 CloudFlare 里屏蔽/攔截 IP 地址和 IP 地址段,雖然明月一直都很反感針對 IP 的屏蔽攔截,但不得不說有時候還是很有必要的。并且,既然可以攔截屏蔽 IP 自然也可以但…

鴻蒙內核源碼分析(VFS篇) | 文件系統和諧共處的基礎

基本概念 | 官方定義 VFS(Virtual File System)是文件系統的虛擬層,它不是一個實際的文件系統,而是一個異構文件系統之上的軟件粘合層,為用戶提供統一的類Unix文件操作接口。由于不同類型的文件系統接口不統一&#x…

Flink HA模式下JobManager切換時發送告警

資源&版本信息 Flink版本1.14.6 運行平臺:K8s HA使用ZK(使用K8s的ETC應該是一個道理) 詳解Flink HA原理 Flink啟動時會創建HighAvailabilityServices提供HA和相關基礎服務,其中包括leaderRetrievalService和LeaderElecti…