Linux學習——TCP

一.TCP編程API

1.socket函數

1.socket函數
include include
int socket(int domain,int type,int protocol);
? ? 參數
? ? ? ? domain
? ? ? ? AF_INET
? ? ? ? AF_INET6
? ? ? ? AF_UNIX,AF_LOCAL
? ? ? ? AF_NETLINK
? ? ? ? AF_PACKET
? ? type
? ? ? ? SOCK_STREAM: 流式套接字,唯一對應于TCP
? ? ? ? SOCK_DGRAM:數據報套接字,唯一對應著UDP
? ? ? ? SOCK_RAW:原始套接字
? ? protocol
? ? ? ? 一般填0,原始套接字編程時需填充
? ? 返回值
? ? ? ? 成功返回文件描述符
? ? ? ? 出錯返回-1
? ? ? ? 如果是IPV6編程,要使用struct sockddr_in6結構體(man 7 IPV6),通常使用struct ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? sockaddr_storage來編程。

int socket(int domain,int type,int protocol);參數domainAF_INETAF_INET6AF_UNIX,AF_LOCALAF_NETLINKAF_PACKETtypeSOCK_STREAM: 流式套接字,唯一對應于TCPSOCK_DGRAM:數據報套接字,唯一對應著UDPSOCK_RAW:原始套接字protocol一般填0,原始套接字編程時需填充返回值成功返回文件描述符出錯返回-1如果是IPV6編程,要使用struct sockddr_in6結構體(man 7 IPV6),通常使用struct ? ? ? ? ? ? ? ? ? ? ? ?sockaddr_storage來編程。

2.bind函數

2.bind函數
int bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen)
? ? 參數
? ? ? ? sockfd:通過socket()函數拿到的fd
? ? ? ? addr:采用struct sockaddr的結構體地址,通用結構體
? ? ? ? struct sockaddr
? ? ? ? ?{
? ? ? ? ? ? sa_family_t sa_family;
? ? ? ? ? ? char sa_data[4];
? ? ? ? ?}
? ? ? ? struct sockaddr_in{ 基于Internel通信結構體
? ? ? ? ? ? as_family_t sin_family;
? ? ? ? ? ? in_port_t sin_port;
? ? ? ? ? ? struct in_addr sin_addr;
? ? ? ? ? ? sin_zero , //填充字節,需清零
? ? ? ? ? ? }
? ? ? ? struct in_addr{
? ? ? ? ? ? uint32_t s_addr;
? ? ? ? ? ? }
? ? ? ? addrlen:地址長度

2.bind函數
int bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen)參數sockfd:通過socket()函數拿到的fdaddr:采用struct sockaddr的結構體地址,通用結構體struct sockaddr{sa_family_t sa_family;char sa_data[4];}struct sockaddr_in{ 基于Internel通信結構體as_family_t sin_family;in_port_t sin_port;struct in_addr sin_addr;sin_zero , //填充字節,需清零}struct in_addr{uint32_t s_addr;}addrlen:地址長度

3.listen函數

3.listen()函數
int listen(int sockfd,int backlog);
? ? 參數:
? ? ? ? sockfd: 通過socket()函數拿到的fd;
? ? ? ? backLog:同時允許幾路客戶端和服務器進行正在連接的過程(正在三次握手),一般填5。
? ? ? ? ? ? 內核中服務器的套接字fd會維護2個鏈表
? ? ? ? ? ? ? ? 1.正在三次握手的客戶端鏈表(數量=2*backlog+1)
? ? ? ? ? ? ? ? 2.已經建立好連接的客戶端鏈表(已經完成三次握手分配好了的newfd)
? ? ? ? 返回值:
? ? ? ? ? ? ? ? 成功返回0
? ? ? ? ? ? 出錯返回-1
? ? listen(fd,5);//表示系統允許11(2*5+1)個客戶端同時進行三次握手

3.listen()函數
int listen(int sockfd,int backlog);參數:sockfd: 通過socket()函數拿到的fd;backLog:同時允許幾路客戶端和服務器進行正在連接的過程(正在三次握手),一般填5。內核中服務器的套接字fd會維護2個鏈表1.正在三次握手的客戶端鏈表(數量=2*backlog+1)2.已經建立好連接的客戶端鏈表(已經完成三次握手分配好了的newfd)返回值:成功返回0出錯返回-1listen(fd,5);//表示系統允許11(2*5+1)個客戶端同時進行三次握手

4.accept函數

4.accept()函數
阻塞等待客戶端連接請求int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);參數sockfd:經過前面socket()創建并通過bind(),listen()設置過的fdaddr:指向存放地址信息的結構體的首地址獲取客戶端IP地址和端口號addrlen:存放地址信息的結構體的大小返回值成功,返回已經建立連接的新的newfd出錯,返回-1

5.客戶端連接函數connect

5.客戶端連接函數connect()
int connect (int sockfd, struct sockaddr * serv_addr, int addrlen)參數:sockfd:通過socket()函數拿到的fdaddr:struct sockaddr的結構體變量地址addrlen:地址長度返回值:成功,返回0失敗,返回-1

二.編程

socket函數編寫

用將socket函數的返回值給fd,通過fd是否小于零來判斷是否成功

bland函數

第一個參數是socket()拿到的fd

sockaddr_in? 結構體

第二個參數是結構體,需先定義 sockaddr_in? 結構體

定義之后在填充之前還需要將結構體清零 ,用bzero函數清零

清零之后去初始化結構體

man 2 bind 往下滑找到 socket,它是在man 7 ip,去man 7 ip 中找到我們填充的sockaddr_in結構體,發現它初始化用的是AF_INET

初始化之后去寫結構體的第二個參數sin_port的ip地址,可以去宏定義,5000以前是內核相關的,為了防止沖突寫5001

SERV_IP_ADDR通過ifconfig查看

?sin_port用的是本地字節,需要轉換成網絡字節,用u_short htons(u_short short)主機字節序到網絡字節序

結構體第三個參數

sin_addr 又指向s_addr,也是要轉換成網絡節字

sockaddr_in結構體也可以使用另一種方式初始化與配置

將sockaddr_in結構體轉化成sockaddr結構體

bind函數成功返回0,失敗返回-1

去判斷是否成功

listen函數

accept函數

TCP服務器讀取內容

接著上一章TCP學習所寫的代碼寫 read函數代碼

read成功返回字節數,失敗返回-1

在do-while循環里不斷讀取accept函數接收到的數據,當小于-1就退出

后兩個if作用是判斷是否還在接收字節,沒有就退出

第三個if 是客戶端是否主動要退出如果是就退出

TCP客戶端

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

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

相關文章

Linux驅動開發--異步通知與異步I/O

3、異步通知與異步I/O 3.1 Linux信號 阻塞與非阻塞訪問、poll()函數提供了較好的解決設備訪問的機制,但是如果有了異步通知,整套機制則更加完整了。 異步通知的意思是:一旦設備就緒,則主動通知應用程序,這樣應用程序…

大語言模型推理能力的強化學習現狀理解GRPO與近期推理模型研究的新見解

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎?訂閱我們的簡報,深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同,從行業內部的深度分析和實用指南中受益。不要錯過這個機會,成為AI領…

【Linux系統】Linux基礎指令(詳解Linux命令行常用指令,每一個指令都有示例演示)

文章目錄 一、與文件路徑相關的指令0.補充知識:路徑的認識1.pwd 指令2.cd 指令(含家目錄的介紹) 二、創建和刪除文件的指令0.補充知識:普通文件和目錄文件1.touch 指令(可以修改文件的時間戳)2.mkdir 指令3…

LangChain 單智能體模式示例【純代碼】

# LangChain 單智能體模式示例import os from typing import Anyfrom langchain.agents import AgentType, initialize_agent, Tool from langchain_openai import ChatOpenAI from langchain.tools import BaseTool from langchain_experimental.tools.python.tool import Pyt…

解決:VSCode C++ conan 安裝第三方庫后 頭文件報錯

文章目錄 1 頭文件include路徑查找報錯參考 1 頭文件include路徑查找報錯 找到conan_toolchain.cmake中 INCLUDE_PATH list(PREPEND CMAKE_INCLUDE_PATH "/Users/hanliqiang/.conan2/p/b/fmte8c4f7a755477/p/include")生成C編譯配置 CtrlShiftP 中選擇C Edit Confi…

松靈Cobot Magic雙臂具身遙操機器人(基于ROS的定位建圖與協同導航技術)

摘要 本文以CobotMagic可移動協作機器人為研究對象,從硬件架構設計、軟件系統架構、多傳感器融合定位建圖系統、智能導航系統協同機制四個維度,深入解析機器人系統工作原理。重點研究多傳感器融合定位建圖系統實現原理,結合實測數據驗證系統…

回歸,git 分支開發操作命令

核心分支說明 主分支(master/production)存放隨時可部署到生產環境的穩定代碼,僅接受通過測試的合并請求。 開發分支(develop)集成所有功能開發的穩定版本,日常開發的基礎分支,從該分支創建特性…

ASP.NET Core 最小 API:極簡開發,高效構建(下)

在上篇文章 ASP.NET Core 最小 API:極簡開發,高效構建(上) 中我們添加了 API 代碼并且測試,本篇繼續補充相關內容。 一、使用 MapGroup API 示例應用代碼每次設置終結點時都會重復 todoitems URL 前綴。 API 通常具有…

Spring之我見 - Spring Boot Starter 自動裝配原理

歡迎光臨小站:致橡樹 Spring Boot Starter 的核心設計理念是 約定優于配置,其核心實現基于 自動配置(Auto-Configuration) 和 條件化注冊(Conditional Registration)。以下是其生效原理: 約定…

精益數據分析(7/126):打破創業幻想,擁抱數據驅動

精益數據分析(7/126):打破創業幻想,擁抱數據驅動 在創業的道路上,我們都懷揣著夢想,但往往容易陷入自我編織的幻想中。我希望通過和大家一起學習《精益數據分析》,能幫助我們更清醒地認識創業過…

牛客java練習題

[toc] 1.依賴注入 依賴注入是一種設計模式和編程思想,不依賴 具體的框架實現,可以通過多種方式和框架來實現可以通過Spring , Google Guice , PicoContainer 等都可以實現依賴注入,也可以通過手動編寫實現目的: 為了解耦合,將對象之間的依賴關系從代碼中解耦出來, 使系統更加…

大模型應用開發自學筆記

理論學習地址: https://zh.d2l.ai/chapter_linear-networks/index.html autodl學術加速: source /etc/network_turboconda常見操作: 刪除: conda remove --name myenv --all -y導出: conda env export > environment.yml…

鴻蒙ArkUI實戰之TextArea組件、RichEditor組件、RichText組件、Search組件的使用

本文接上篇繼續更新ArkUI中組件的使用,本文介紹的組件有TextArea組件、RichEditor組件、RichText組件、Search組件,這幾個組件的使用對應特定場景,使用時更加需要注意根據需求去使用 TextArea組件 官方文檔: TextArea-文本與輸…

除了`String`、`StringBuffer` 和 `StringBuilder`之外,還有什么處理字符串的方法?

一、標準庫中的字符串處理類 1. StringJoiner(Java 8) 用途:用于在拼接字符串時自動添加分隔符、前綴和后綴。示例:StringJoiner sj new StringJoiner(", ", "[", "]"); sj.add("A").…

Qt中讀寫結構體字節數據

在Qt中讀寫結構體字節數據通常涉及將結構體轉換為字節數組(QByteArray)或直接從內存中讀寫。以下是幾種常見方法&#xff1a; 方法1&#xff1a;使用QDataStream讀寫結構體 cpp #include <QFile> #include <QDataStream>// 定義結構體 #pragma pack(push, 1) //…

Windows 10 上安裝 Spring Boot CLI詳細步驟

在 Windows 10 上安裝 Spring Boot CLI 可以通過以下幾種方式完成。以下是詳細的步驟說明&#xff1a; 1. 手動安裝&#xff08;推薦&#xff09; 步驟 1&#xff1a;下載 Spring Boot CLI 訪問 Spring Boot CLI 官方發布頁面。下載最新版本的 .zip 文件&#xff08;例如 sp…

Unity3D仿星露谷物語開發37之澆水動畫

1、目標 當點擊水壺時&#xff0c;實現澆水的動畫。同時有一個水從水壺中流出來的特效。 假如某個grid被澆過了&#xff0c;則不能再澆水了。。 如果某個grid沒有被dug過&#xff0c;也不能被澆水。 2、優化Settings.cs腳本 增加如下內容&#xff1a; public static float…

【2】Kubernetes 架構總覽

Kubernetes 架構總覽 主節點與工作節點 主節點 Kubernetes 的主節點&#xff08;Master&#xff09;是組成集群控制平面的關鍵部分&#xff0c;負責整個集群的調度、狀態管理和決策。控制平面由多個核心組件構成&#xff0c;包括&#xff1a; kube-apiserver&#xff1a;集…

如何對docker鏡像存在的gosu安全漏洞進行修復——筑夢之路

這里以mysql的官方鏡像為例進行說明&#xff0c;主要流程為&#xff1a; 1. 分析鏡像存在的安全漏洞具體是什么 2. 根據分析結果有針對性地進行修復處理 3. 基于當前鏡像進行修復安全漏洞并復核驗證 # 鏡像地址mysql:8.0.42 安全漏洞現狀分析 dockerhub網站上獲取該鏡像的…

【Tauri2】026——Tauri+Webassembly

前言 不多廢話 直言的說&#xff0c;筆者看到這篇文章大佬的文章 【04】Tauri 入門篇 - 集成 WebAssembly - 知乎https://zhuanlan.zhihu.com/p/533025312嘗試集成一下WebAssembly&#xff0c;直接開始 正文 準備工作 新建一個項目 安裝 vite的rsw插件和rsw pnpm instal…