TCP客戶端Linux網絡編程設計詳解

一、TCP 客戶端設計流程

????????TCP客戶端模式的程序設計流程主要分為:套接字初始化( socket()函數),連接目標網絡服務器 (connect()函數),向服務器端寫入數據(write()函數)

1、socket() 函數

#include <sys/types.h>? ? ?/* See NOTES */
#include <sys/socket.h>
int socket(int domain, int type, int protocol);

????????socket()函數函數建立一個協議族為domain、協議類型為type、協議編號為 protocol的套接字文件描述符。如果函數調用成功,會返回一個表示這個套接字的文件描述符,失敗的時候返回-1。

????????函數socket()的參數domain用于設置網絡通信的域,函數socket()根據這個參數選擇通信協議的族。通信協議族在文件sys/socket.h 中定義。

????????函數socket()的參數 type用于設置套接字通信的類型。主要有SOCK_STREAM(流式套接字)、 SOCK_DGRAM(數據包套接字)等。
函數socket()的參數protocol一般設置為0。
????????函數socket()并不總是執行成功,有可能會出現錯誤,錯誤的產生有多種原因,可以通過errno獲 得。通常情況下造成函數 socket()失敗的原因是輸入的參數錯誤造成的,例如某個協議不存在等, 這時需要詳細檢查函數的輸入參數。由于函數的調用不一定成功,在進行程序設計的時候,一定要檢查返回值。
如果進行TCP編程,我們可以使用如下代碼建立一個流式套接字:
int sock_fd = socket(AF_INET, SOCK_STREAM, 0);

2、connect() 函數原型

#include <sys/types.h>? /* See NOTES */
#include <sys/socket.h>
int connect(int sockfd,? const struct sockaddr *addr,? socklen_t addrlen);
????????參數sockfd是建立套接字時返回的套接字文件描述符,它是由系統調用socket()函數返回的。參數addr,是一個指向數據結構 sockaddr的指針,其中包括客戶端需要連接的服務器的目的端口和IP地 址,以及協議類型。參數addrlen表示第二個參數內容的大小,可以使用sizeof(struct sockaddr)而 獲得,與bind()函數不同,這個參數是一個整型的變量而不是指針。
connect()函數的返回值在成功時為0,當發生錯誤的時候返回-1,可以查看errno獲得錯誤的原因。

(1)包裹函數

//connect包裹函數
void Connect(int fd, const struct sockaddr*addr,socklen_t addrlen)
{int ret;while (1){ret = connect(fd, addr, addrlen);if (-1 == ret){dbgout("connect error\n");perror("eror");continue;}break;}
}

3、數據的發送

1) write()函數用于發送數據,函數原型如下:

#include <sys/types.h>
#include <sys/socket.h>

?ssize_t? write(int sockfd, const void *buf, size_t len);

參數:

????????sockfd:TCP Socket 描述符。

????????buf:要發送的數據緩沖區。

????????count:要發送的字節數。

示例代碼:

write(fd, "hello", sizeof("hello"));

2) send()函數,?原型如下:

#include <sys/types.h>
#include <sys/socket.h>

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

參數:

????????sockfd:TCP Socket 描述符。

????????buf:要發送的數據緩沖區。

????????len:要發送的字節數。

????????flags:可選的標志參數,用于控制發送行為,如 MSG_DONTWAIT、MSG_NOSIGNAL 等。

示例代碼:

send(fd, "hello", sizeof("hello"), MSG_DONTWAIT)

4、數據的接收

讀取客戶端的數據可以使用以下三個函數:

1)read() 數據接收函數

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);

?????????read()函數從套接字sockfd中接收數據放到緩沖區buf中,buf的長度為len。 第1個參數sockfd是套接口文件描述符,它是由系統調用socket()返回的。第2個參數buf是一個指針, 指向接收網絡數據的緩沖區。第3個參數len表示接收緩沖區的大小,以字節為單位。

使用示例代碼:

char buf[1024];
//讀取數據
memset(buf, 0, sizeof(buf));
int ret;
ret = read(fd, buf, sizeof(buf)-1); //阻塞
//如果主動斷開了連接,read函數解除阻塞,并且返回0
if (0 == ret)
{close(cli_fd);return NULL;
}printf("cli: %d,  %s\n", cli_fd, buf)

2)recv() 數據接收函數

recv()函數用于接收數據,函數原型如下:

#include <sys/types.h>
#include <sys/socket.h>
ssize_t recv(int sockfd, void *buf, size_t len, int flags);

前三個跟read函數一致,recv()函數的參數flags用于設置接收數據的方式,可選擇的值及含義在下表中列出(flags 的值可以是表中值的按位或生成的復合值)

上表中的值的具體說明:

MSG_DONTWAIT:這個標志將單個IO操作設為非阻塞方式,而不需要在套接字 上打開非阻塞標志,執行IO操作,然后關閉非阻塞標志。

MSG_ERRQUEUE:該錯誤的傳輸依賴于所使用的協議。

MSG_OOB:這個標志可以接收帶外數據,而不是接收一般數據。

MSG_PEEK:這個標志用于查看可讀的數據,在recv()函數執行后,內核不會將這些數據丟棄。 MSG_TRUNC:在接收數據后,如果用戶的緩沖區大小不足以完全復制緩沖區中的數據,則將 數據截斷,僅靠復制用戶緩沖區大小的數據。其他的數據會被丟棄。

MSG_WAITALL:這個標志告訴內核在沒有讀到請求的字節數之前不使讀操作返回。

示例代碼:

char buf[1024];
//讀取數據
memset(buf, 0, sizeof(buf));
int ret;
ret = recv(cli_fd, buf, sizeof(buf)-1,MSG_DONTWAIT); 
if (0 == ret)
{close(cli_fd);return NULL;
}printf("cli: %d,  %s\n", cli_fd, buf)

3)recvfrom() 數據接收函數

ssize_t recvfrom(int sockfd,? void *buf,? size_t len,? int flags, struct sockaddr *src_addr, socklen_t *addrlen)

????????第四個參數保存接收的客戶端的相關信息,但是因為TCP是基于連接的傳輸協議,在調用accept函數 時就能夠獲取客戶端的信息,所以recvfrom一般用于udp通信。

7、示例TCP客戶端編程代碼:

#include <stdio.h>
#include <sys/types.h>        
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>#define dbgout(arg...) \do{ \char b__[1024]; \sprintf(b__, arg);\fprintf(stdout, "[%s,%s,%d] %s", __FILE__, __func__, __LINE__, b__); \} while (0)//connect包裹函數
void Connect(int fd, const struct sockaddr*addr,socklen_t addrlen)
{int ret;while (1){ret = connect(fd, addr, addrlen);if (-1 == ret){dbgout("connect error\n");perror("eror");continue;}break;}
}int main(int argc, char* argv[])
{//初始化一個socket套接字int fd;fd = socket(AF_INET, SOCK_STREAM, 0);if (-1 == fd){dbgout("socket error\n");perror("erro");return 0;}//連接服務器struct sockaddr_in serv;serv.sin_family = AF_INET;serv.sin_addr.s_addr = inet_addr("172.29.98.213");serv.sin_port = htons(8888);//和服務器建立連接Connect(fd, (struct sockaddr*)&serv, sizeof(struct sockaddr));char buf[128];while (1){//向服務端發送數據write(fd, "hello", 6);//讀取服務端發送的數據memset(buf, 0, sizeof(buf));int ret = read(fd, buf, sizeof(buf) - 1);if (ret > 0){dbgout("read: %s\n", buf);}sleep(1);}close(fd);return 0;
}

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

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

相關文章

webpack》》

Webpark 介紹 官網 Webpack的功能 在現代前端開發中,我們會使用模塊化、Sass、TypeScript、圖片、字體等資源。但瀏覽器并不天然支持這些格式,因此我們需要工具將它們打包、轉換成瀏覽器能識別的文件格式。Webpack 就是這樣一個強大的前端構建工具。 Webpack 是一個現代 J…

軟件測評中HTTP 安全頭的配置與測試規范

服務器若缺乏必要的安全頭配置&#xff0c;其安全防護能力將大幅降低。X-Content-Type-Options 作為基礎安全頭&#xff0c;需設置 nosniff 參數&#xff0c;以阻止瀏覽器對 MIME 類型進行自主猜測&#xff0c;避免 text/css 等資源被誤當作腳本執行&#xff0c;從源頭切斷此類…

5G專網項目外場常見業務測試指南(六)-PingInfoView

5G項目必然涉及到終端用戶的使用&#xff0c;終端使用情況測試最常用的手段就是長時間7*24小時長ping&#xff0c;對于一個有著幾百用戶的5G專網&#xff0c;我們常用的ping工具-PingInfoView。 PingInfoView是一款輕量級工具&#xff0c;用于同時對多個IP地址或主機名執行持續…

C#WPF實戰出真汁02--搭建項目三層架構

1、什么是三層架構 三層架構是一種軟件設計模式&#xff0c;將應用程序劃分為表示層&#xff08;UI&#xff09;、業務邏輯層&#xff08;BLL&#xff09;和數據訪問層&#xff08;DAL&#xff09;&#xff0c;以實現高內聚、低耦合的開發目標。 三層架構的核心組成? ?表示層…

什么是費曼學習法?

什么是費曼學習法&#xff1f;一、費曼學習法的核心邏輯 費曼學習法&#xff08;Feynman Technique&#xff09;由諾貝爾物理學獎得主理查德費曼提出&#xff0c;核心思想是通過“以教促學”的方式&#xff0c;用輸出倒逼輸入&#xff0c;徹底理解知識。其本質是&#xff1a;當…

CVPR 2025 | 北大團隊SLAM3R:單目RGB長視頻實時重建,精度效率雙殺!

北京大學陳寶權團隊聯合香港大學等推出的實時三維重建系統SLAM3R&#xff0c;首次實現從單目RGB長視頻中實時且高質量重建場景稠密點云。該系統通過前饋神經網絡無縫集成局部3D重建與全局坐標配準&#xff0c;提供端到端解決方案&#xff0c;使用消費級顯卡&#xff08;如4090D…

現代化水庫運行管理矩陣建設的要點

2023年8月24日&#xff0c;水利部發布的水利部關于加快構建現代化水庫運行管理矩陣的指導意見中指出&#xff0c;在全面推進水庫工程標準化管理的基礎上&#xff0c;強化數字賦能&#xff0c;加快構建以推進全覆蓋、全要素、全天候、全周期“四全”管理&#xff0c;完善體制、機…

【工具】用于視頻遮蓋行人及車牌的工具,基于YOLO

最近錄制數據時&#xff0c;為了保護隱私&#xff0c;我做了一個小工具&#xff1a;video-privacy-blur 在采集街景、測試視頻時&#xff0c;經常會拍到人臉和車牌&#xff0c;這些信息在分享或存儲前必須做匿名化處理。手動后期太耗時&#xff0c;于是我基于 Ultralytics YOLO…

EtherCAT概念介紹

一、EtherCAT 簡介?EtherCAT&#xff08;Ethernet Control Automation Technology&#xff09;是一種工業以太網現場總線&#xff0c;它將計算機網絡中的以太網技術應用于工業自動化領域&#xff0c;構成工業控制以太網&#xff08;工業以太網、工業以太網現場總線&#xff09…

【LeetCode】4. 尋找兩個正序數組的中位數

文章目錄4. 尋找兩個正序數組的中位數題目描述示例 1&#xff1a;示例 2&#xff1a;提示&#xff1a;解題思路算法分析問題本質分析二分查找分割算法詳解分割策略可視化分割點計算過程邊界情況處理算法流程圖各種解法對比時間復雜度分析空間復雜度分析關鍵優化點實際應用場景測…

HarmonyOS 開發實戰:搞定應用名字與圖標更換,全流程可運行示例

好的&#xff0c;我幫你把這篇《HarmonyOS 開發實戰&#xff1a;快速更改應用名字與圖標的終極指南》擴展到約 4000 字&#xff0c;重點會放在代碼示例和代碼解釋部分&#xff0c;并且保留你要的口語化、易讀風格。 我會在原文的基礎上增加&#xff1a; 更完整的目錄結構演示&a…

Keep-Alive 的 “愛情故事”:HTTP 如何從 “短命” 變 “長情”?

&#x1f680; 揭秘HTTP Keep-Alive&#xff1a;前端面試不再“短”路&#xff01; 引言&#xff1a;HTTP連接的“愛恨情仇” 各位前端的小伙伴們&#xff0c;在面試中&#xff0c;HTTP協議絕對是繞不開的話題。而其中一個看似簡單卻又暗藏玄機的知識點&#xff0c;就是HTTP的“…

僅需8W,無人機巡檢系統落地 AI 低空智慧城市!可源碼交付

一、項目介紹無人機管控系統是融合無人機技術、傳感器技術、物聯網及人工智能的智能化檢測方案。依托先進無人機技術與前沿 AI 算法&#xff0c;該系統可替代傳統人工巡檢模式&#xff0c;針對高危、復雜或大面積區域實現高效、精準監測&#xff0c;為城市基礎設施檢查、安防監…

java-JVM詳解

一、JVM 是什么&#xff1f; 定義&#xff1a; JVM&#xff08;Java Virtual Machine&#xff09;是一個虛擬計算機&#xff0c;為 Java 字節碼提供運行環境。它是 Java “一次編寫&#xff0c;到處運行”&#xff08;Write Once, Run Anywhere&#xff09;的核心基礎&#xff…

QT中ARGB32轉ARGB4444優化4K圖像性能的實現方案(完整源碼)

QT中ARGB32轉ARGB4444優化4K圖像性能的實現方案&#xff08;完整源碼&#xff09; 一、問題背景 在QT界面項目中&#xff0c;4K圖像采用QImage::Format_ARGB32格式&#xff08;4字節/像素&#xff09;時&#xff0c;因數據量大導致編解碼疊加性能不足。底層framebuffer實際為AR…

反射在Spring IOC容器中的應用——動態創建Bean

今天在看Java八股文時&#xff0c;對這里產生了一些疑惑&#xff0c;因為在目前做的練手項目中還沒有用到過除了new以外的新建對象方式&#xff0c;在請教了其他前輩后對此有了新的理解&#xff0c;所以專門記錄以用于梳理思路和復習基礎。這里著重講解反射機制實現新建對象這里…

TRS(總收益互換)系統架構設計:多市場交易的技術實現分析

一、多市場交易環境的技術特征 1.1 市場機制差異&#xff08;技術視角&#xff09;技術維度典型實現差異交割周期T0/T1/T2等多種結算模式價格穩定機制部分市場存在波動率控制措施系統接入協議FIX 4.4/ITCH/OMD-C等協議族衍生品支持工具種類與中央對手方清算差異1.2 技術挑戰分析…

深度學習-卷積神經網絡CNN-批量歸一化 BatchNorm

為什么需要批量規范化層呢&#xff1f;讓我們來回顧一下訓練神經網絡時出現的一些實際挑戰&#xff1a;首先&#xff0c;數據預處理的方式通常會對最終結果產生巨大影響。 回想一下我們應用多層感知機來預測房價的例子。使用真實數據時&#xff0c;我們的第一步是標準化輸入特征…

機器學習-支持向量機器(SVM)

0.1 數字識別 from sklearn.svm import SVC from sklearn.metrics import silhouette_score import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.decomposition import PCA from sklearn.feature_extraction import DictVectorizer from sk…

昆山PCB板工廠有哪些?

在長三角電子信息產業版圖中&#xff0c;昆山憑借完整的產業鏈配套和精湛的制造工藝&#xff0c;成為國內PCB&#xff08;印制電路板&#xff09;生產的重要基地。本文精選五家具有代表性的本土工廠&#xff0c;從技術實力到服務特色展開深度剖析&#xff0c;為行業客戶提供精準…