網絡編程---TCP

1.TCP:傳輸控制協議,位于傳輸層

2.TCP的特性:

a.使用流式套接字,數據連續,有順序

b.TCP是可靠傳輸,有有應答機制ACK,即收到數據后會明確告知發送方已收到數據;若發送方沒有在預計時間收到應答,則會自動重傳剛剛的數據

c.TCP在建立連接后傳輸鏈路會一直存在

d.TCP為全雙工通信,在同一時刻既可以收也可以發

e.為滿足同時收發,TCP存在雙緩沖區,每個大小為64k,當緩沖區滿時,會發生相應阻塞

3.TCP的收發過程:

三次握手過程

1.客戶端向服務端發送SYN連接請求信號和隨機初始序列號 (Client ISN)

2.服務端向客戶端發送ACK確認信號和SYN連接請求信號,并發送自己的隨機初始序列號 (Server ISN)

3.客戶端向服務端發送ACK確認信號

四次揮手過程

a.客戶端向服務端發送FIN結束連接請求信號,和SYN連接請求信號

b.服務端向客戶端發送ACK確認信號

c.服務端向客戶端發送FIN結束連接請求信號和ACK確認信號

d.客戶端向服務端發送ACK確認信號,連接結束

4.TCP函數的調用順序

1)TCP服務端

a.socket()產生一個監聽套接字

b.bind()綁定源地址

c.listen()監聽

d.accept()建立連接,產生通信套接字,即三次握手過程

e.read(),write()

f.close()關閉監聽套接字

2)TCP客戶端

a.socket()產生一個套接字

b.accept()建立連接,產生通信套接字,即三次握手過程

c.read(),write()

d.close()關閉套接字

5.使用TCP從客戶端向服務端發送一個照片文件

ser端

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <time.h>
#include <netinet/in.h>
#include <arpa/inet.h>
typedef struct sockaddr *(SA);
int	main(int argc, char **argv)
{int fd=open("2.jpg", O_WRONLY|O_CREAT|O_TRUNC,0666);int listfd=socket(AF_INET,SOCK_STREAM,0);if(-1==listfd){perror("socket fail\n");return 1;}struct sockaddr_in ser,cil;bzero(&ser, sizeof(ser));bzero(&cil, sizeof(cil));socklen_t len=sizeof(cil);ser.sin_family=AF_INET;ser.sin_port=htons(50000);//127.0.0.1表示自己的ip地址,本機自己收發//ser.sin_addr.s_addr=inet_addr("127.0.0.1");ser.sin_addr.s_addr=INADDR_ANY;int ret=bind(listfd, (SA)&ser, sizeof(ser));if(-1==ret){perror("blind");return 1;}listen(listfd, 3);//三次握手的排隊數int conn=accept(listfd, (SA)&cil, &len);//conn為通信套接字if(conn==-1){perror("accept");return 1;}while(1){char buf[1024]={0};//int ret=recv(conn, buf, sizeof(buf), 0);int ret=recvfrom(conn, buf, sizeof(buf), 0,(SA)&cil,&len);if(ret<=0)//==0說明對方連接斷開{break;}write(fd, buf, ret);bzero(buf, sizeof(buf));strcpy(buf,"ok");send(conn, buf, strlen(buf), 0);}close(listfd);close(conn);return 0;
}

cli端

#include <string.h>
#include <strings.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <time.h>
#include <fcntl.h>
typedef struct sockaddr *(SA);
int	main(int argc, char **argv)
{int fd=open("1.jpg", O_RDONLY);if(-1==fd){perror("open");return 1;}int conn=socket(AF_INET, SOCK_STREAM, 0);if(-1==conn){perror("socket");return 1;}struct sockaddr_in ser;bzero(&ser,sizeof(ser));ser.sin_family=AF_INET;ser.sin_port=htons(50000);ser.sin_addr.s_addr=INADDR_ANY;int ret=connect(conn, (SA)&ser, sizeof(ser));if(-1==ret){perror("connect error\n");return 1;}while (1){char buf[1024]={0};int ret=read(fd, buf, sizeof(buf));if(ret<=0){break;}send(conn, buf, ret, 0);bzero(buf, sizeof(buf));recv(conn, buf, sizeof(buf), 0);}close(conn);close(fd);return 0;
}

6.數據的粘包

發送方發送數據,接收方無法解析數據

解決方案:

a.設置邊界

b.固定大小

c.自定義協議

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

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

相關文章

對計算機網絡模型的理解

文章目錄 目錄 前言 一、Internet 的核心特點 二、Internet 的組成結構 1. 硬件基礎&#xff1a;網絡運行的 “物理載體” 2. 軟件支撐&#xff1a;網絡運行的 “功能橋梁” 3. 協議規則&#xff1a;網絡運行的 “通用語言” 三、OSI 七層參考模型&#xff08;理論標準&…

每日一算:分發糖果

在算法面試中&#xff0c;“分發糖果” 是一道經典的貪心算法應用題&#xff0c;核心考察對 “局部最優推導全局最優” 的理解。本文將從問題分析出發&#xff0c;提供兩種主流解題思路&#xff0c;并附上 C 實現代碼&#xff0c;幫助你徹底掌握這道題。一、問題重述題目要求有…

【WorkManager】無法在 Direct Boot 模式下初始化

【WorkManager】無法在 Direct Boot 模式下初始化一、問題描述二、問題分析2.1 關于 Direct Boot 模式2.2 支持 Direct Boot 模式2.3 手動初始化 WorkManager 組件2.4 WorkManager 不支持 Direct Boot 的官方修改三、解決方案一、問題描述 在使用 WorkManager 庫來實現開機上報…

Hybrid應用性能優化實戰分享(本文iOS 與 H5為例,安卓同理)

前言在移動應用開發中&#xff0c;Hybrid 架構因其跨平臺特性和開發效率優勢被廣泛采用。然而&#xff0c;WebView 的性能問題一直是開發者面臨的挑戰。本文將基于實際項目經驗&#xff0c;分享 iOS Hybrid 應用的核心優化策略&#xff0c;涵蓋 WebView 池化、預加載、用戶體驗…

點積、叉積、矩陣行列式詳解、線性相關與線性無關、矩陣的秩、矩陣可逆與不可逆詳解

1.向量 1.1 點積&#xff08;Dot Product&#xff09; 1.1.1 定義 點積是在求一個標量&#xff0c;點積結果沒有方向。 對于兩個向量u(u1,u2,u3),v(v1,v2,v3)\bold{u}(u_1,u_2,u_3),\bold{v}(v_1,v_2,v_3)u(u1?,u2?,u3?),v(v1?,v2?,v3?) 點積定義為&#xff1a;u?vu1v1u…

Mac安裝nvm詳細教程(超簡單)

本章教程,主要介紹如何在Mac操作系統上安裝nvm. 我們使用官方一鍵安裝腳本,完成安裝 一、安裝步驟 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash配置環境變量,編輯.zshrc文件 vim .zshrcexport NVM_DIR="$(

【selenium】網頁元素找不到?從$(‘[placeholder=“手機號“]‘)說起

網頁元素找不到&#xff1f;從$(‘[placeholder“手機號”]’)說起總結&#xff1a;控制臺不騙人&#xff0c;元素選不到&#xff0c;八成是寫法、時機或環境的問題。我們在寫網頁自動化腳本或者調試頁面的時候&#xff0c;經常遇到一個讓人頭疼的問題&#xff1a;明明元素就在…

SSE 模仿 GPT 響應

后端代碼 const express require(express) const cors require(cors);const app express(); app.use(cors()); const port 3000;app.listen(port, () > {console.log(Server running at http://localhost:${port}/); });const msg 全國同胞們&#xff0c; 尊敬的各位國…

MAC 多個版本 JDK進行切換

1.查看本機所有的jdk/usr/libexec/java_home -V2、打開bash_profile文件。可以在終端vim ~/.bash_profile打開&#xff0c;也可以打開訪達shiftcmdG然后輸入/Users/mac/.bash_profile&#xff08;本機bash_profile的路徑&#xff09;加入新的環境變量格式如下&#xff08;參考我…

shell 中 expect 詳解

一、概述Expect是一個免費的編程工具語言&#xff0c;用來實現自動和交互式任務進行通信&#xff0c;而無需人的干預。Expect的作者DonLibes在1990年開始編寫Expect時對Expect做有如下定義&#xff1a;Expect是一個用來實現自動交互功能的軟件套件。通過expect系統管理員可以創…

第4講 機器學習基礎概念

機器學習作為人工智能的子領域&#xff0c;專注于訓練計算機算法自動發現數據中的模式與關聯關系。以下是其核心基礎概念&#xff1a;4.1 數據數據是機器學習的基石。缺乏數據&#xff0c;算法將無從學習。數據可呈現為結構化數據&#xff08;如電子表格、數據庫&#xff09;和…

Go組合式繼承:靈活替代方案

Go 語言沒有傳統面向對象編程中的繼承機制&#xff0c;但通過組合和接口實現類似功能。Go 更提倡組合優于繼承的設計原則&#xff0c;這種設計方式更靈活且易于維護。結構體組合&#xff08;偽繼承&#xff09;通過嵌套結構體實現類似繼承的效果。子結構體可以直接訪問父結構體…

Verilog三段式FSM,實現十字路口紅綠燈

運行環境&#xff1a;VCS verdi狀態說明&#xff1a;S0 &#xff1a; 初始狀態 S1 &#xff1a; 東西方向綠燈亮&#xff0c;南北方向紅燈亮&#xff1b;點亮30周期 S2 &#xff1a; 東西方向黃燈亮&#xff0c;南北方向紅燈亮&#xff1b;點亮2 周期 S3 &#xff1a; 東西方向…

java 將pdf轉圖片

如何將pdf文件轉為圖片 import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.PDFRenderer; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class Pdf2Png {/**…

手搓Spring

目錄 兩種方法創建Spring容器 自定義Spring容器及前置操作 Spring掃描邏輯實現 createBean()方法 getBean()方法 依賴注入&#xff08;DI&#xff09; BeanNameAware接口 InitializingBean接口 BeanPostProcessor接口 AOP的實現 Spring 是一個輕量級的 Java 開發框架…

.NET 單文件程序詳解:從原理到實踐

C# 混淆加密大師在最新版本中, 提供了.NET單文件解包打包功能, 它可以快速解包官方打包的單文件程序&#xff0c;恢復為原始的多文件結構。也可以對解包后的程序集進行混淆與加密&#xff0c;有效提升逆向門檻。最后還能重新打包成單文件程序&#xff0c;保持對用戶友好的分發形…

Spring面試題記錄?

請簡述 Spring 框架的核心是什么&#xff1f;它主要包含了哪些核心模塊&#xff1f; spring的核心模塊主要有spring-core&#xff08;工具類&#xff0c;資源加載&#xff09;&#xff0c;spring-bean&#xff08;bean的定義&#xff0c;創建&#xff0c;封裝&#xff09;&…

一次緩存引發的文件系統數據不一致問題排查與深度解析

01 起因EFC&#xff08;Elastic File Client&#xff09;是 NAS 自研的分布式文件系統客戶端&#xff0c;最近完成了對緩存架構的更新&#xff0c;現在支持多個客戶端之間構成分布式緩存&#xff0c;底層支持 NAS、CPFS 和 OSS。由于開發時間較短&#xff0c;一直沒有做 NAS 場…

Spring Boot Gateway 教程:從入門到精通

一、Spring Cloud Gateway 簡介Spring Cloud Gateway 是基于 Spring 5、Project Reactor 和 Spring Boot 2 構建的 API 網關&#xff0c;旨在為微服務架構提供一種簡單而有效的路由管理方式。它取代了 Netflix Zuul&#xff0c;提供了更高效和更強大的網關解決方案。核心特點&a…

防火墻 只允許信任的幾臺服務器訪問

1. 首先&#xff0c;確保 firewalld 服務正在運行&#xff1a;systemctl start firewalld systemctl enable firewall2. 設置默認拒絕規則&#xff1a;設置默認拒絕所有流量&#xff08;拒絕所有的入站流量&#xff09;&#xff1a;firewall-cmd --zonepublic --add-rejectal…