如何進行網絡通信和套接字編程?

網絡通信和套接字編程

引言

網絡通信是計算機科學中的重要概念,它使得不同計算機之間可以進行數據交換和信息傳遞。套接字編程是一種實現網絡通信的方法,它提供了一套標準的接口,使得應用程序可以通過網絡進行數據傳輸。本文將詳細介紹網絡通信的基本原理、套接字編程的概念,以及使用C語言進行套接字編程的基本步驟。

網絡通信基本原理

在計算機網絡中,通信的基本單元是數據包(Packet)。數據包是一種數據的封裝形式,它包含了要傳輸的信息以及相關的控制信息。在網絡中,數據包通過不同的協議進行傳輸,常見的網絡協議包括TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)等。

TCP(Transmission Control Protocol)

TCP是一種面向連接的、可靠的協議。它確保數據的可靠傳輸,通過三次握手建立連接,保持連接狀態,最后通過四次揮手終止連接。TCP提供流式傳輸,數據被分割成小的數據塊,通過序列號和確認應答機制來保證數據的完整性和順序性。

UDP(User Datagram Protocol)

UDP是一種無連接的、不可靠的協議。它不進行連接的建立和維護,也不提供數據的可靠傳輸,數據包可能會丟失或亂序。UDP適用于一些對傳輸延遲要求較低、對數據可靠性要求較低的場景。

套接字編程概念

套接字(Socket)是一種通信機制,它允許不同計算機上的進程通過網絡進行通信。套接字提供了一組接口,使得應用程序可以創建、連接、傳輸數據以及關閉連接。

在套接字編程中,常見的兩種類型是流套接字(Stream Socket)和數據報套接字(Datagram Socket)。流套接字基于TCP協議,提供面向連接的通信,而數據報套接字基于UDP協議,提供無連接的通信。

C語言套接字編程基本步驟

套接字編程通常涉及以下基本步驟:

步驟一:創建套接字

在C語言中,可以使用socket函數來創建一個套接字。socket函數的原型如下:

#include <sys/types.h>
#include <sys/socket.h>int socket(int domain, int type, int protocol);
  • domain參數指定了通信協議的地址族,常用的有AF_INET(IPv4)和AF_INET6(IPv6)。
  • type參數指定了套接字的類型,常用的有SOCK_STREAM(流套接字,對應TCP)和SOCK_DGRAM(數據報套接字,對應UDP)。
  • protocol參數指定了使用的協議,通常為0,表示使用默認協議。

例如,創建一個TCP套接字:

#include <sys/types.h>
#include <sys/socket.h>int main() {int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd == -1) {perror("Error creating socket");return 1;}// 其他操作...return 0;
}

步驟二:綁定套接字

在創建套接字后,通常需要將套接字與一個具體的地址和端口進行綁定。使用bind函數來完成這一步驟。

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  • sockfd參數是socket函數返回的套接字描述符。
  • addr參數是一個指向sockaddr結構的指針,用于指定地址和端口。
  • addrlen參數表示addr結構的大小。

例如,將套接字綁定到本地地址和端口:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>int main() {int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd == -1) {perror("Error creating socket");return 1;}struct sockaddr_in server_addr;server_addr.sin_family = AF_INET;server_addr.sin_port = htons(8080); // 端口號server_addr.sin_addr.s_addr = INADDR_ANY; // 任意本地地址if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {perror("Error binding socket");return 1;}// 其他操作...return 0;
}

步驟三:監聽連接

對于TCP套接字,需要調用listen函數開始監聽連接。

#include <sys/types.h>
#include <sys/socket.h>int listen(int sockfd, int backlog);
  • sockfd參數是socket函數返回的套接字描述符。
  • backlog參數指定了待處理連接的隊列長度。
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>int main() {int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd == -1) {perror("Error creating socket");return 1;}struct sockaddr_in server_addr;server_addr.sin_family = AF_INET;server_addr.sin_port = htons(8080); // 端口號server_addr.sin_addr.s_addr = INADDR_ANY; // 任意本地地址if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {perror("Error binding socket");return 1;}if (listen(sockfd, 5) == -1) { // 允許最多5個等待連接的客戶端perror("Error listening on socket");return 1;}// 其他操作...return 0;
}

步驟四:接受連接

對于TCP套接字,使用accept函數來接受連接。

#include <sys/types.h>
#include <sys/socket.h>int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
  • sockfd參數是socket函數返回的套接字描述符。
  • addr參數是一個指向sockaddr結構的指針,用于存儲連接方的地址信息。
  • addrlen參數表示addr結構的大小。
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>int main() {int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd == -1) {perror("Error creating socket");return 1;}struct sockaddr_in server_addr;server_addr.sin_family = AF_INET;server_addr.sin_port = htons(8080); // 端口號server_addr.sin_addr.s_addr = INADDR_ANY; // 任意本地地址if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {perror("Error binding socket");return 1;}if (listen(sockfd, 5) == -1) { // 允許最多5個等待連接的客戶端perror("Error listening on socket");return 1;}struct sockaddr_in client_addr;socklen_t client_addrlen = sizeof(client_addr);int newsockfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_addrlen);if (newsockfd == -1) {perror("Error accepting connection");return 1;}// 其他操作...return 0;
}

步驟五:連接到服務器

對于TCP套接字,客戶端需要使用connect函數連接到服務器。

#include <sys/types.h>
#include <sys/socket.h>int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  • sockfd參數是socket函數返回的套接字描述符。
  • addr參數是一個指向sockaddr結構的指針,用于指定服務器的地址和端口。
  • addrlen參數表示addr結構的大小。
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>int main() {int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd == -1) {perror("Error creating socket");return 1;}struct sockaddr_in server_addr;server_addr.sin_family = AF_INET;server_addr.sin_port = htons(8080); // 服務器端口號server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 服務器地址if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {perror("Error connecting to server");return 1;}// 其他操作...return 0;
}

步驟六:發送和接收數據

使用sendrecv函數來發送和接收數據。

#include <sys/types.h>
#include <sys/socket.h>ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
  • sockfd參數是socket函數返回的套接字描述符。
  • buf參數是一個指向要發送或接收數據的緩沖區。
  • len參數表示要發送或接收的數據的大小。
  • flags參數通常為0,表示沒有特殊操作。
#include <sys/types.h>
#include <sys/socket.h>int main() {int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd == -1) {perror("Error creating socket");return 1;}struct sockaddr_in server_addr;server_addr.sin_family = AF_INET;server_addr.sin_port = htons(8080); // 服務器端口號server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 服務器地址if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {perror("Error connecting to server");return 1;}char message[] = "Hello, Server!";if (send(sockfd, message, sizeof(message), 0) == -1) {perror("Error sending message");return 1;}char buffer[1024];if (recv(sockfd, buffer, sizeof(buffer), 0) == -1) {perror("Error receiving message");return 1;}printf("Received message from server: %s\n", buffer);// 其他操作...return 0;
}

步驟七:關閉套接字

在通信結束后,需要使用close函數關閉套接字。

#include <unistd.h>int close(int sockfd);

sockfd參數是socket函數返回的套接字描述符。

#include <sys/types.h>
#include <sys/socket.h>int main() {int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd == -1) {perror("Error creating socket");return 1;}struct sockaddr_in server_addr;server_addr.sin_family = AF_INET;server_addr.sin_port = htons(8080); // 服務器端口號server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 服務器地址if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {perror("Error connecting to server");return 1;}// 發送和接收數據...if (close(sockfd) == -1) {perror("Error closing socket");

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

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

相關文章

Python---global關鍵字---設置全局變量

global 英 /?ɡl??b(?)l/ adj. 全球的&#xff0c;全世界的&#xff1b;全面的&#xff0c;整體的&#xff1b;&#xff08;計算機&#xff09;全局的&#xff1b;球形的 需求&#xff1a;如果有一個數據&#xff0c;在函數A和函數B中都要使用&#xff0c;該怎么辦&…

【PyGIS】使用阿里AIEarth快速下載指定區域指定年份的土地利用數據

說明 中國逐年土地覆蓋數據集(CLCD) 由武漢大學的楊杰和黃昕教授團隊基于Landsat影像制作了中國逐年土地覆蓋數據集(annual China Land Cover Dataset, CLCD),數據包含1985—2021年中國逐年土地覆蓋信息。研究團隊基于Landsat長時序衛星觀測數據,構建時空特征,結合隨機森…

Linux常用命令——blockdev命令

在線Linux命令查詢工具 blockdev 從命令行調用區塊設備控制程序 補充說明 blockdev命令在命令調用“ioxtls”函數&#xff0c;以實現對設備的控制。 語法 blockdev(選項)(參數)選項 -V&#xff1a;打印版本號并退出&#xff1b; -q&#xff1a;安靜模式&#xff1b; -v&…

藍橋杯官網填空題(重合次數)

問題描述 在同一天中, 從上午 6 點 13 分 22 秒到下午 14 點 36 分 20 秒, 鐘表上的 分針和秒針一共重合了多少次? 注意時針、分針、秒針都圍繞中心敳勻速運動。 答案提交 這是一道結果填空的題&#xff0c;你只需要算出結果后提交即可。本題的結果為一 個整數, 在提交答案…

【正則插件】前端正則插件以及預覽插件推薦

1&#xff09; 2&#xff09; any-rule Pegex Previewer 下載好插件之后 在代碼層右鍵選擇 選擇你需要的正則表達式&#xff0c;隨后可以使用第二個插件 正則表達式插入之后頂部會有 Test Regex.. 點擊會出現以下內容 將他 ctrl a 刪除&#xff0c;輸入你對應的正則表達…

@Validated注解的作用代碼示例

當使用Spring框架進行參數驗證時&#xff0c;可以通過Validated注解來觸發參數驗證。以下是一個簡單的示例&#xff0c;演示了如何在Spring控制器中使用Validated注解來驗證請求的參數&#xff1a; 首先&#xff0c;假設有一個簡單的User類作為請求的數據模型&#xff1a; pu…

電腦序列號查詢

電腦序列號是廠商給每臺電腦分配的一個產品識別碼&#xff0c;也稱為S/N&#xff08;Serial Number&#xff09;。主要用來查詢電腦的出廠日期、保修狀態、生產產地、產品配置等信息。電腦序列號查詢有以下幾種方法&#xff1a; 1、電腦機箱外殼&#xff1b; 2、系統信息/命令…

前端下載文件鏈接

前端下載文件鏈接 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </hea…

CSS 文字溢出:ellipsis在IE上不起效果

單行文本的溢出顯示省略號 p {overflow: hidden;text-overflow: ellipsis;white-space: nowrap; }多行文本的溢出顯示省略號 方法一&#xff1a; p {display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 3;overflow: hidden;text-overflow: ellipsis; }…

梁培強:塑造下一代投資高手

在當前全球經濟動蕩和金融市場快速變化的背景下&#xff0c;梁培強的投資教育計劃不僅僅是一套課程&#xff0c;它是對傳統投資理念的深度挑戰和革新。梁培強&#xff0c;擁有超過二十年金融行業經驗的資深分析師&#xff0c;正在引領一場投資者教育的變革&#xff0c;旨在培養…

C++中的Makefile是什么, 如何使用

Makefile簡介 Makefile是一種用于構建C/C程序的文件&#xff0c;其中包含了項目中所有源文件、頭文件以及編譯器和鏈接器指令。使用Makefile可以使編譯和鏈接成為一個自動化的過程&#xff0c;這樣就可以方便地管理復雜的項目。 以下是一個簡單的Makefile示例&#xff1a; C…

Centos 7 安裝yum(針對python卸載yum出錯)

提前下載所需安裝包&#xff0c;按照下面順序安裝即可完成&#xff0c;每個依賴包必須正確安裝 下載地址&#xff1a;http://mirrors.163.com/centos/7/os/x86_64/Packages/ rpm -qa|grep python|xargs rpm -ev --allmatches --nodeps ##強制刪除已安裝程序及其關聯 whereis …

基于SSM+Vue的社區共享食堂管理系統

基于SSM的社區共享食堂管理系統的設計與實現~ 開發語言&#xff1a;Java數據庫&#xff1a;MySQL技術&#xff1a;SpringMyBatisSpringMVC工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系統展示 主頁 菜品詳情 管理員界面 摘要 社區共享食堂管理系統是一種基于SSM&#xf…

CentOS 7實現類似于Kali Linux中的自動補全功能

在CentOS 7中&#xff0c;可以通過安裝和使用Bash-completion來實現自動補全功能&#xff0c;類似于Kali Linux中的自動補全。以下是安裝和使用Bash-completion的步驟&#xff1a; 首先&#xff0c;確保您的系統已更新并安裝了EPEL存儲庫。&#xff08;非必要&#xff0c;直接…

實現數據全字段搜索

代碼 按鈕 <el-button type"text" style"position: absolute;top:-48px;right:260px;z-index: 99;color: #000;"click"handleButtonClick(搜索), showConfirmationModal2()" :class"{ blue-text: activeButton 搜索 }"><im…

二、sql手工注入

一、SQL注入的本質 解釋&#xff1a;想要進行sql注入&#xff0c;肯定要發現注入點&#xff0c;一般簡單的sql注入通過下面兩種方式判斷就能發現是否存在sql注入漏洞 1.字符型 注意&#xff1a;字符型注入可能為或" 查詢語句&#xff1a; select * from student where…

Python生成exe文件

Python如何生成exe文件 在終端執行 pip install pyinstaller 在終端執行pyinstaller E:\fund_data\GetFund.py&#xff0c;運行結束后會在D:\Python\Python311\Scripts\dist\目錄下生成GetFund.exe文件 3.雙擊exe文件運行&#xff0c;如果未出現預期結果&#xff0c;可以把e…

含分布式電源的配電網可靠性評估(matlab代碼)

1主要內容 該程序參考《基于仿射最小路法的含分布式電源配電網可靠性分析》文獻方法&#xff0c;通過概率模型和時序模型分別進行建模&#xff0c;實現基于概率模型最小路法的含分布式電源配電網可靠性評估以及時序模型序貫蒙特卡洛模擬法的含分布式電源配電網可靠性評估。程序…

區間第k小數 (可持久化線段樹、主席樹)

題意&#xff1a;多次詢問&#xff0c;每次詢問某區間的第k小數。 可持久化線段樹&#xff1a; 摻雜了一點前綴和的思想&#xff0c;對于每一個1 ~ i 的區間都建一個樹&#xff0c;每個節點存的都是一個線段樹&#xff0c;值存的是當前區間中初始數組按大小排序后[l, r]之間的…

【AGC】鴻蒙應用軟件包上傳問題解析

【問題背景】 近期收到了一些反饋&#xff0c;一些鴻蒙元服務開發者在發布應用市場的過程中&#xff0c;上傳.app包時遇到了不同的報錯&#xff0c;導致上傳失敗&#xff0c;下面來看一下這些報錯的具體原因&#xff0c;如何正確打包上傳。 【問題描述1】 HarmonyOS元服務軟件…