Socket詳解

一.定義

Socket(套接字)是網絡編程的核心,它允許不同主機或同一主機的不同進程之間進行通信,Socket API 提供了一套標準的接口,支持 TCP、UDP、IP 等協議

分為以下三個類型:

SOCK_STREAM:
用于tcp協議,可靠、面向連接、字節流,使用場景:HTTP、FTP、SSHSOCK_DGRAM:
用于udp協議,不可靠、無連接、數據報,使用場景:DNS、視頻流、游戲SOCK_RAW:
用于IP/ICMP	原始套接字(直接訪問網絡層),使用場景:網絡嗅探、自定義協議

地址結構:

IPV4:? struct sockaddr_in

struct sockaddr_in {sa_family_t sin_family; // 地址族(AF_INET)in_port_t sin_port;// 端口號(16位,需用 htons() 轉換)struct in_addr sin_addr; // IP地址(32位,需用 inet_addr() 或 htonl())char sin_zero[8]; //填充(保持與 sockaddr 大小一致)
};

IPV6:struct sockaddr_in6

通用結構:struct?sockaddr

struct sockaddr {sa_family_t sa_family; //地址族(AF_INET, AF_INET6, AF_UNIX)char sa_data[14]; //實際地址數據
};

二.API接口(核心)

socket():

作用:創建套接字

//頭文件:
#include <sys/socket.h>int socket(int domain,int type,int protocol);domain --- 協議族(AF_INET、AF_INET6、AF_UNIX)
type --- 套接字類型(SOCK_STREAM、SOCK_DGRAM)
protocol --- 控制,通常填 0(自動選擇,如 IPPROTO_TCP)返回值:
-1 --- 創建失敗
其他 --- 創建成功,并返回socketfd(套接字描述符)

舉例:

#include <iostream>
#include <sys/socket.h>int socketfd = socket(AF_INET,SOCK_STREAM,0);
//檢查:
if(socketfd == -1){std::cerr<<"socket creation failed"<<std::endl;exit(EXIT_FAILURE);
}
//創建成功

bind():

綁定IP和端口

//頭文件:
#include <sys/socket.h>int bind(int socketfd,const struct sockaddr* addr,socklen_t addrlen);//參數:
socketfd --- 套接字描述符
addr --- 指向 sockaddr_in 或 sockaddr_in6 的指針(需強制轉換)
addrlen --- 地址結構的大小(sizeof(struct sockaddr_in))//返回值:
-1 --- 綁定失敗
其他(0)--- 綁定成功

舉例:

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)
{ perror("bind failed");exit(EXIT_FAILURE);
}

listen():

監聽連接(TCP)

#include <sys/socket.h>int listen(int sockfd,int backlog);//參數:
sockfd --- 套接字描述符
backlog --- 等待連接隊列的最大長度//返回值:
-1 --- 失敗
其他(0)--- 成功

舉例:

if (listen(sockfd, 5) == -1) {perror("listen failed");exit(EXIT_FAILURE);
}

accept():

接收連接

#include <sys/socket.h>int accept(int sockfd,struct socketaddr* addr,socklen_t* addrlen);//參數:
sockfd --- 套接字描述符
addr --- 用于存儲客戶端地址
addrlen --- 地址結構大小(需先初始化)//返回值:
-1 --- 連接失敗
其他 --- 連接成功,返回的是新的套接字描述符

舉例:

struct sockaddr_in client_addr;
socklen_t client_len = sizeof(client_addr);
int connet_fd = accpet(sockfd,(struct socketaddr*)&client_addr,&client_len);
if(connet_fd == -1)
{perror("accept failed");exit(EXIT_FAILURE);
}
//連接成功

connect():

用戶向服務器發起連接

#include <sys/socket.h>int connect(int sockfd,const struct sockaddr *addr, socklen_t addrlen);//參數:
sockfd --- 套接字描述符
addr --- 服務器地址
addrlen --- 地址結構大小//返回值:
-1 --- 連接失敗
其他(0)--- 連接成功

舉例:

struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htos(8080);
//解析IP:
inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr); //連接并判斷:
if(connect(sockfd,(struct sockaddr*)&server_addr,sizeof(server_addr)) == -1)
{perror("connect failed");exit(EXIT_FAILURE);
}
//連接成功

send/recv:

TCP數據收發

#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);//buf內容要填充的,不能用const//參數:
sockfd --- 已連接的套接字
buf --- 數據緩沖區
len --- 數據長度
flags --- 可選標志(如 MSG_WAITALL 阻塞直到收滿)//返回值:
-1 --- 失敗
其他 --- 成功 并返回發送/接收的字節數

舉例:

char buffer[1024];//緩沖區
ssize_t bytes_received = recv(connect_fd,buffer,sizeof(buffer),0);
if(bytes_received == -1)
{perror("recv failed");
}
else
{buffer[bytes_received] = '\0';  // 確保字符串終止printf("Received: %s\n", buffer);
}

sendto/recvfrom:

UDP數據收發

#include <sys/socket.h>//發送數據:
ssize_t sendto(int sockfd,const void* buf,size_t len,int flags,const struct sockaddr* dest_addr,socklen_t addrlen);//接收數據:
ssize_t recvfrom(int sockfd,void* buf,size_t len,int flags,struct sockaddr* src_addr,socklen_t* socklen);//參數:
很多之前我們已經講過了,講下幾個沒講的
dest_addr / src_addr --- 目標/源地址//返回值:
-1 --- 發送、接收失敗
其他 --- 返回發送/接收的字節數

舉例:

struct sockaddr_in client_addr;
socklen_t client_len = sizeof(client_addr);
char buffer[1024];
ssize_t bytes_recvfrom = recvfrom(sockfd,buffer,sizeof(buffer),0,(struct sockaddr*)&client_addr,&client_len);
if(bytes_recvfrom == -1)
{perror("recvfrom failed");
}
//接收成功

close()

關閉套接字

#include <unistd.h>//Linux系統下:
int close(int sockfd);//補充:Windows系統下
#incluide <winsock2.h>
int closesocket(SOCKET sockfd);//也是關閉連接,但是可以自己選擇
int shutdown(int sockfd, int how);//參數:
how --- 1.SHUT_RD:關閉讀取    2.SHUT_WR:關閉寫入    3.SHUT_RDWR:完全關閉

掌握這些 API 后,你可以實現基本的?TCP 服務器/客戶端?和?UDP 通信了

最后,感謝你的支持!!!

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

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

相關文章

如何實現打印功能

一、AI賦能提供思路基本框架<!-- 隱藏的打印內容&#xff08;默認不顯示&#xff09; --> <div id"print-container" style"display: none;"><h1>退貨單打印內容</h1><table><!-- 打印專用的表格結構 --></table&g…

Android 架構演進:從 MVC 到 MVVM 的設計之道

在 Android 開發初期&#xff0c;很多開發者會把所有邏輯塞進 Activity—— 網絡請求、數據處理、UI 更新全堆在一起&#xff0c;導致代碼超過數千行&#xff0c;改一個按鈕點擊都要翻半天。這種 “面條式代碼” 的根源是缺乏架構設計。隨著應用復雜度提升&#xff0c;MVC、MVP…

使用 gh-pages 將 next.js15 靜態項目部署到 github pages

以下我使用 next.js15 寫的 Todo List 為例,假設我們本地已經存在一個 next.js15 的 Todo List 項目。 說明:解決了項目部署到 github pages 后訪問不到 css、js、字體以及訪問不到 public 目錄下的圖片問題。 第一步 安裝 gh-pages: npm i gh-pages第二步 在 public 目…

rename系統調用及示例

21. rename - 重命名文件或目錄 函數介紹 rename系統調用用于重命名文件或目錄&#xff0c;也可以將文件或目錄移動到另一個位置。如果目標文件已存在&#xff0c;則會被替換。 函數原型 #include <stdio.h>int rename(const char *oldpath, const char *newpath);功能 將…

PHP框架之Laravel框架教程:3. 數據庫操作(簡要)

3. 數據庫操作&#xff08;簡要&#xff09; 配置 數據庫的配置文件在 config/database.php 文件中&#xff0c;你可以在這個文件中定義所有的數據庫連接配置&#xff0c;并指定默認的數據庫連接。這個文件中提供了大部分 Laravel 能夠支持的數據庫配置示例。 mysql > [driv…

項目七.AI大模型部署

環境準備此處使用的是rock linux8.9操作系統k8s集群三個設備&#xff0c;使用centos7.9操作系統設備配置##上傳ollama工具的壓縮包 [rootproject ~]# ll total 1497732 -rw-r--r-- 1 root root 1533674176 Jul 21 11:27 ollama-linux-amd64.tgz [rootproject ~]# tar -C /usr -…

Oracle 19C RU 19.28 升級和安裝

背景介紹 概述 本次升級包括安全漏掃中所有19c數據庫,漏掃預警版本19.3到19.27各個版本,數據庫需要升級至19.28版本滿足安全要求。 原端19C 升級目標端19.28 db_name racdb racdb ORACLE_SID racdb1/2 racdb1/2 ORACLE_HOME GI:/oracle/asm DB:/oracle/db GI:/orac…

嵌入式學習日志————對射式紅外傳感器計次

前言這是第二次學習這部分內容了&#xff0c;第一次是大一上學期&#xff0c;因為大二下忙著其他事一直沒來得及吧STM32學完&#xff0c;所以假期從頭開始再學&#xff0c;比第一次也有了更深的理解&#xff0c;以下內容均是看【STM32入門教程-2023版 細致講解 中文字幕】https…

ONLYOFFICE深度解鎖系列.13-如何復制、重新排序 PDF 頁面:onlyoffice 9.0.3 新功能

在處理合同、講義、研究資料或掃描文檔時&#xff0c;保持頁面順序井然尤為重要。有時文件頁數繁多、排序混亂或缺少邏輯&#xff0c;這不僅影響閱讀體驗&#xff0c;也不利于后續使用或分享。好消息是&#xff0c;借助 ONLYOFFICE PDF 編輯器&#xff0c;您可以輕松拖拽頁面&a…

vue遞歸樹形結構刪除不符合數據 生成一個新數組

首先看一下數據結構&#xff08;我的是路由菜單&#xff09;{"code": 200,"message": "請求成功!","success": true,"data": [{"startDate": null,"endDate": null,"createTime": "2023…

【機器學習之推薦算法】基于K最近鄰的協同過濾推薦與基于回歸模型的協同過濾推薦

基于K最近鄰的協同過濾推薦 基于K最近鄰的協同過濾推薦其實本質上就是MemoryBased CF&#xff0c;只不過在選取近鄰的時候&#xff0c;加上K最近鄰的限制。 這里我們直接根據MemoryBased CF的代碼實現 修改以下地方 class CollaborativeFiltering(object):based Nonedef __ini…

望言OCR視頻字幕提取2025終極評測:免費版VS專業版提全方位對比(含免費下載)

大家好&#xff0c;歡迎來到程序視點&#xff01;我是你們的老朋友.小二&#xff01;一、產品定位&#xff1a;AI時代的視頻字幕處理專家望言OCR作為專業的視頻硬字幕提取工具&#xff0c;在AI視頻處理領域占據重要地位。最新評測顯示&#xff0c;其免費版本依然保持著驚人的97…

Matplotlib(二)- Matplotlib簡單繪圖

文章目錄一、pyplot模塊介紹二、Matplotlib簡單繪圖1. 繪制折線圖1.1 折線圖介紹1.2 plt.plot()函數介紹1.3 繪制簡單折線圖1.3.1 繪制單條折線圖1.3.2 繪制多條折線圖1.4 示例&#xff1a;繪制天氣氣溫折線圖2. 繪制柱形圖2.1 柱形圖介紹2.2 plt.bar()函數介紹2.3 繪制柱形圖2…

【世紀龍科技】數字化技術解鎖新能源汽車電驅動總成裝調與檢修

隨著新能源汽車產業加速升級&#xff0c;電驅動總成裝調與檢修技術已成為職業院校汽車專業教學的核心挑戰。傳統實訓模式面臨設備投入高、更新周期長、高壓操作安全隱患多、教學與產業需求脫節等現實問題&#xff0c;導致學生實踐能力培養滯后于行業發展。如何通過數字化手段突…

springboot基于Java與MySQL庫的健身俱樂部管理系統設計與實現

用戶&#xff1a;注冊&#xff0c;登錄&#xff0c;健身教練&#xff0c;健身課程&#xff0c;健身器材&#xff0c;健身資訊&#xff0c;課程報名管理&#xff0c;教練預約管理&#xff0c;會員充值管理&#xff0c;個人中心管理員&#xff1a;登錄&#xff0c;個人中心&#…

如何修改debian的ip地址

編輯配置文件&#xff1a; sudo nano /etc/network/interfaces修改內容&#xff08;示例將 eth0 設為靜態IP&#xff09;&#xff1a; auto eth0 iface eth0 inet static address 192.168.1.100 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers 8.8.8.8 8.8.4.4 #…

haproxy七層代理(知識點+相關實驗部署)

目錄 1.負載均衡介紹 1.1 什么是負載均衡 1.2 為什么用負載均衡 1.3 負載均衡類型 1.3.1 四層負載均衡 1.3.2 七層負載均衡 1.3.3 四層和七層的區別 2.haproxy簡介 2.1 haproxy主要特性 2.2 haproxy的優點與缺點 3.haproxy的安裝和服務信息 3.1 實驗環境 3.1.1 hap…

【集合】JDK1.8 HashMap 底層數據結構深度解析

一、核心數據結構&#xff1a;為什么是 "數組 鏈表 紅黑樹"&#xff1f;?HashMap 的底層設計本質是用空間換時間&#xff0c;通過哈希表的快速定位特性&#xff0c;結合鏈表和紅黑樹處理沖突&#xff0c;平衡查詢與插入效率。?1.1 基礎容器&#xff1a;哈希桶數組…

【element-ui】HTML引入本地文件出現font找不到/fonts/element-icons.woff

文章目錄目錄結構問題復現解決辦法目錄結構 |-web|- public|- lib|- ...|- index.htmlindex.html <!DOCTYPE html> <html> <head><meta charset"UTF-8"><!-- import CSS --><link rel"stylesheet" href"./public/…

Windows|CUDA和cuDNN下載和安裝,默認安裝在C盤和不安裝在C盤的兩種方法

本篇文章將詳細介紹在Windows操作系統中配置CUDA和cuDNN的步驟。通過本教程&#xff0c;您將能夠輕松完成CUDA和cuDNN的安裝、環境變量配置以及與深度學習框架&#xff08;如TensorFlow和PyTorch&#xff09;兼容性測試&#xff0c;從而為您的深度學習項目提供強大的硬件支持。…