【linux網絡編程】套接字編程API詳細介紹

在C語言中,套接字(Socket)編程主要用于網絡通信,尤其是在基于TCP/IP協議的應用程序開發中。常用的套接字編程API主要基于Berkeley Sockets(伯克利套接字)接口,這些函數通常在<sys/socket.h><netinet/in.h>頭文件中定義。以下是對常見套接字API的詳細講解,包括函數功能、參數、返回值、涉及的結構體及其成員的含義。


1. socket()

功能

創建新的套接字。

函數原型
int socket(int domain, int type, int protocol);
參數
  • domain: 指定通信協議族(協議域)。
    • 類型: int
    • 常見值:
      • AF_INET(IPv4協議)
      • AF_INET6(IPv6協議)
      • AF_UNIX(本地通信)
    • 含義: 定義套接字的地址格式和通信范圍。
  • type: 指定套接字類型。
    • 類型: int
    • 常見值:
      • SOCK_STREAM(面向連接的TCP流)
      • SOCK_DGRAM(無連接的UDP數據報)
      • SOCK_RAW(原始套接字)
    • 含義: 定義通信的語義。
  • protocol: 指定具體協議。
    • 類型: int
    • 常見值:
      • 通常為0(表示由domaintype自動選擇默認協議,如TCP或UDP)
      • 特殊值(如IPPROTO_TCPIPPROTO_UDP)用于顯式指定協議。
    • 含義: 細化協議選擇。
返回值
  • 類型: int
  • 含義:
    • 成功: 返回套接字文件描述符(非負整數)。
    • 失敗: 返回-1,并設置errno表示錯誤。
相關結構體

無直接結構體參數。


2. bind()

功能

將套接字綁定到特定的地址和端口。

函數原型
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
參數
  • sockfd: 要綁定的套接字文件描述符。
    • 類型: int
    • 含義: 由socket()創建的套接字。
  • addr: 指向地址結構體的指針。
    • 類型: const struct sockaddr *
    • 含義: 指定綁定的地址和端口。
  • addrlen: 地址結構體的大小。
    • 類型: socklen_t(通常是unsigned int
    • 含義: addr指向的結構體長度。
返回值
  • 類型: int
  • 含義:
    • 成功: 返回0
    • 失敗: 返回-1,并設置errno
相關結構體
  • struct sockaddr
    • 定義:
      struct sockaddr {sa_family_t sa_family;    // 地址族char        sa_data[14];  // 地址數據(具體含義依賴地址族)
      };
      
    • 成員:
      • sa_family: 地址族(如AF_INET)。
        • 類型: sa_family_t(通常是unsigned short
        • 含義: 指定地址類型。
      • sa_data: 地址數據的字節數組。
        • 類型: char[14]
        • 含義: 存儲具體地址信息,但通常不直接使用。
  • 實際常用: struct sockaddr_in(針對IPv4)
    • 定義:
      struct sockaddr_in {sa_family_t    sin_family; // 地址族in_port_t      sin_port;   // 端口號struct in_addr sin_addr;   // IP地址unsigned char  sin_zero[8]; // 填充字節
      };
      
    • 成員:
      • sin_family: 地址族。
        • 類型: sa_family_t
        • 含義: 通常為AF_INET
      • sin_port: 端口號。
        • 類型: in_port_t(通常是uint16_t
        • 含義: 網絡字節序的端口號(如htons(8080))。
      • sin_addr: IP地址。
        • 類型: struct in_addr
        • 定義:
          struct in_addr {in_addr_t s_addr; // IPv4地址(32位)
          };
          
        • 成員:
          • s_addr: IPv4地址。
            • 類型: in_addr_t(通常是uint32_t
            • 含義: 網絡字節序的IP地址(如inet_addr("127.0.0.1"))。
      • sin_zero: 填充字節。
        • 類型: unsigned char[8]
        • 含義: 用于對齊,通常置為0

3. listen()

功能

將套接字設置為監聽狀態,用于接受客戶端連接(僅限TCP)。

函數原型
int listen(int sockfd, int backlog);
參數
  • sockfd: 要監聽的套接字文件描述符。
    • 類型: int
    • 含義: 已綁定的服務器套接字。
  • backlog: 等待連接隊列的最大長度。
    • 類型: int
    • 含義: 指定未完成連接的最大排隊數(如510)。
返回值
  • 類型: int
  • 含義:
    • 成功: 返回0
    • 失敗: 返回-1,并設置errno
相關結構體

無直接結構體參數。


4. accept()

功能

接受客戶端連接請求,返回新的套接字用于通信(僅限TCP)。

函數原型
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
參數
  • sockfd: 監聽的套接字文件描述符。
    • 類型: int
    • 含義: 已調用listen()的服務器套接字。
  • addr: 客戶端地址信息。
    • 類型: struct sockaddr *
    • 含義: 用于存儲連接的客戶端地址(通常轉換為struct sockaddr_in)。
  • addrlen: 地址結構體的長度。
    • 類型: socklen_t *
    • 含義: 傳入時為addr的大小,函數返回時為實際地址長度。
返回值
  • 類型: int
  • 含義:
    • 成功: 返回新的套接字文件描述符,用于與客戶端通信。
    • 失敗: 返回-1,并設置errno
相關結構體
  • bind()中的struct sockaddrstruct sockaddr_in

5. connect()

功能

發起與服務器的連接(用于客戶端)。

函數原型
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
參數
  • sockfd: 客戶端套接字文件描述符。
    • 類型: int
    • 含義: 由socket()創建的套接字。
  • addr: 目標服務器地址。
    • 類型: const struct sockaddr *
    • 含義: 指定服務器的地址和端口。
  • addrlen: 地址結構體的長度。
    • 類型: socklen_t
    • 含義: addr的大小。
返回值
  • 類型: int
  • 含義:
    • 成功: 返回0
    • 失敗: 返回-1,并設置errno
相關結構體
  • bind()中的struct sockaddrstruct sockaddr_in

6. send()recv()

功能
  • send(): 發送數據。
  • recv(): 接收數據。
函數原型
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: 套接字文件描述符。
    • 類型: int
    • 含義: 已連接的套接字。
  • buf: 數據緩沖區。
    • 類型: const void *send)或void *recv
    • 含義: 發送或接收的數據存儲位置。
  • len: 數據長度。
    • 類型: size_t
    • 含義: 要發送或接收的字節數。
  • flags: 操作標志。
    • 類型: int
    • 常見值:
      • 0(默認行為)
      • MSG_DONTWAIT(非阻塞)
    • 含義: 修改發送/接收行為。
返回值
  • 類型: ssize_t
  • 含義:
    • 成功: 返回實際發送/接收的字節數。
    • 失敗: 返回-1,并設置errno
相關結構體

無直接結構體參數。


7. close()

功能

關閉套接字。

函數原型
int close(int sockfd);
參數
  • sockfd: 要關閉的套接字文件描述符。
    • 類型: int
    • 含義: 由socket()accept()返回的描述符。
返回值
  • 類型: int
  • 含義:
    • 成功: 返回0
    • 失敗: 返回-1,并設置errno
相關結構體

無直接結構體參數。


總結

以下是常用套接字API的快速參考表:

函數功能返回值類型主要結構體
socket()創建套接字int
bind()綁定地址intsockaddr, sockaddr_in
listen()開始監聽int
accept()接受連接intsockaddr, sockaddr_in
connect()發起連接intsockaddr, sockaddr_in
send()發送數據ssize_t
recv()接收數據ssize_t
close()關閉套接字int

這些API是C語言網絡編程的核心,配合結構體(如struct sockaddr_in)使用,可以實現基本的客戶端-服務器通信。需要注意網絡字節序(htons, ntohs, htonl, ntohl)和錯誤處理(errno)的使用。

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

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

相關文章

Linux和gcc/g++常用命令總結

目錄 Linux命令總結 文件操作相關命令 ls cd pwd cp mv rm cat mkdir rmdir touch 文本處理操作命令 grep awk sed 進程管理操作相關命令 ps top htop kill pkill killall chmod chown 網絡操作相關命令 ping ifconfig netstat ss lsof curl …

VUE的第二天

1. 指令修飾符 1.1什么是指令修飾符&#xff1f; ? 所謂指令修飾符就是通過“.”指明一些指令后綴 不同的后綴封裝了不同的處理操作 —> 簡化代碼 1.2按鍵修飾符 keyup.enter —>當點擊enter鍵的時候才觸發 代碼演示&#xff1a; <div id"app"><…

WSL with NVIDIA Container Toolkit

一、wsl 下安裝 docker 會提示安裝 docekr 桌面版&#xff0c;所以直接安裝 docker 桌面版本即可 二、安裝 NVIDIA Container Toolkit NVIDIA Container Toolkit倉庫 https://github.com/NVIDIA/nvidia-container-toolkit?github.com/NVIDIA/nvidia-container-toolkit 安裝…

mysql下載

目錄 下載地址&#xff1a; 1.MSI安裝包下載 2.ZIP壓縮包下載 卸載MySQL&#xff1a; 下載地址&#xff1a; MySQL :: Download MySQL Community Server到mysql官網進行下載&#xff1a;MySQL :: Download MySQL Community Server &#xff08;下面二選一&#xff0c;選擇一…

基于Kubernetes部署MySQL主從集群

以下是一個基于Kubernetes部署MySQL主從集群的詳細YAML示例&#xff0c;包含StatefulSet、Service、ConfigMap和Secret等關鍵配置。MySQL主從集群需要至少1個主節點和多個從節點&#xff0c;這里使用 StatefulSet 初始化腳本 實現主從自動配置。 1. 創建 Namespace (可選) ap…

如何使用 GPT-4o 翻譯播客聲音

Voice Translation into Different Languages | OpenAI Cookbook 如何使用 GPT-4o 將播客翻譯并配音成您的母語 您是否曾想過將播客翻譯成您的母語&#xff1f;翻譯和配音音頻內容可以讓全球更多的觀眾獲取信息。而現在&#xff0c;借助 GPT-4o 的音頻輸入&#xff08;audio-i…

Lab17_ Blind SQL injection with out-of-band data exfiltration

文章目錄 前言&#xff1a;進入實驗室構造 payload 前言&#xff1a; 實驗室標題為&#xff1a; 帶外數據泄露的 SQL 盲注 簡介&#xff1a; 本實驗包含一個SQL盲目注入漏洞。應用程序使用跟蹤Cookie進行分析&#xff0c;并執行包含提交的Cookie值的SQL查詢。 SQL查詢是異…

深入解析 configService.addListener 使用中的注意事項

在使用 Nacos 的 configService.addListener 方法進行配置監聽時&#xff0c;為了確保程序的穩定性、可靠性以及高效性&#xff0c;有諸多注意事項需要我們關注。下面將對這些關鍵要點進行詳細闡述。 一、連接穩定性 1.1 網絡連接問題 Nacos 客戶端與服務端通過網絡進行通信&…

C/C++藍橋杯算法真題打卡(Day4)

一、P11041 [藍橋杯 2024 省 Java B] 報數游戲 - 洛谷 算法代碼&#xff1a; #include<bits/stdc.h> using namespace std;// 計算第 n 個滿足條件的數 long long findNthNumber(long long n) {long long low 1, high 1e18; // 二分查找范圍while (low < high) {lo…

【Python 數據結構 10.二叉樹】

目錄 一、二叉樹的基本概念 1.二叉樹的定義 2.二叉樹的特點 3.特殊的二叉樹 Ⅰ、斜樹 Ⅱ、滿二叉樹 Ⅲ、完全二叉樹 Ⅳ、完全二叉樹和滿二叉樹的區別 4.二叉樹的性質 5.二叉樹的順序存儲 Ⅰ、完全二叉樹 Ⅱ、非完全二叉樹 Ⅲ、稀疏二叉樹 6.二叉樹的鏈式存儲 7.二叉樹的遍歷概念…

Windows 系統 Docker Desktop 入門教程:從零開始掌握容器化技術

文章目錄 前言一、Docker 簡介二、Docker Desktop 安裝2.1 系統要求2.2 安裝步驟 三、Docker 基本概念四、Docker 常用命令五、實戰&#xff1a;運行你的第一個容器5.1 拉取并運行 Nginx 容器5.2 查看容器日志5.3 停止并刪除容器 六、總結 前言 隨著云計算和微服務架構的普及&…

可變參數與遞歸

可變參數與遞歸 可變參數 package method; ? public class Demo03 {public static void main(String[] args) {Demo03 demo03new Demo03();demo03.test(1,2,3);?}public void test (int... i){System.out.println(i[0]);//1System.out.println(i[1]);//2System.out.println(…

【redis】全局命令exists、del、expire、ttl(惰性刪除和定期刪除)

exists——判定 key 是否存在 語法&#xff1a; exists key [key...] # 返回值&#xff1a;key 存在的個數針對多個 key 來說&#xff0c;是非常有用的時間復雜度 O ( 1 ) O(1) O(1) Redis 組織這些 key 就是按照哈希表的方式來組織的。Redis 支持很多數據結構指的是 value …

系統架構設計師—系統架構設計篇—特定領域軟件體系結構

文章目錄 概述領域分類垂直域水平域 系統模型基本活動參與角色 概述 特定領域軟件架構&#xff08;Domain Specific Software Architecture&#xff0c;DSSA&#xff09;是在一個特定應用領域中&#xff0c;為一組應用提供組織結構參考的標準團建體系結構。 領域分類 垂直域…

OpenManus:優點突出,短板也明顯

最近&#xff0c;OpenManus 在 AI 領域掀起了一陣熱潮。作為開源版的智能代理軟件&#xff0c;它自誕生起就備受矚目。今天&#xff0c;咱們就來深入聊聊 OpenManus 在實際測試中的表現&#xff0c;看看它到底有哪些過人之處&#xff0c;又存在哪些不足。? 優點大起底? 開源…

VUE3項目的文檔結構分析

1. Vue 3 項目的文檔結構 Vue 3 項目通常基于 Vue CLI 或 Vite 等工具創建&#xff0c;其文檔結構如下&#xff1a; 常見目錄結構 my-vue-project/ ├── public/ # 靜態資源目錄 │ ├── index.html # 入口頁面 ├── src/ …

P8662 [藍橋杯 2018 省 AB] 全球變暖--DFS

P8662 [藍橋杯 2018 省 AB] 全球變暖--dfs 題目 解析講下DFS代碼 題目 解析 這道題的思路就是遍歷所有島嶼&#xff0c;判斷每一塊陸地是否會沉沒。對于這種圖的遍歷&#xff0c;我們首先應該想到DFS。 代碼的注意思想就是&#xff0c;在主函數中遍歷找出所有島嶼&#xff0c…

mmseg

系列文章目錄 文章目錄 系列文章目錄bug bug File "/public/home/rsinfo/project/mmsegmentation/mmseg/__init__.py", line 61, in <module>assert (mmcv_min_version < mmcv_version < mmcv_max_version), \ AssertionError: MMCV2.2.0 is used but i…

AI多模態教程:DeepSeek多模態模型解析及實踐指南

AIGCmagic社區知識星球是國內首個以AIGC全棧技術與商業變現為主線的學習交流平臺&#xff0c;涉及AI繪畫、AI視頻、大模型、AI多模態、數字人以及全行業AIGC賦能等100應用方向。星球內部包含海量學習資源、專業問答、前沿資訊、內推招聘、AI課程、AIGC模型、AIGC數據集和源碼等…

【銀河麒麟高級服務器操作系統實例】虛擬機橋接網絡問題分析及處理

更多銀河麒麟操作系統產品及技術討論&#xff0c;歡迎加入銀河麒麟操作系統官方論壇 https://forum.kylinos.cn 了解更多銀河麒麟操作系統全新產品&#xff0c;請點擊訪問 麒麟軟件產品專區&#xff1a;https://product.kylinos.cn 開發者專區&#xff1a;https://developer…