套接字編程簡介

来源:https://www.cnblogs.com/songhe364826110/archive/2019/10/27/11746657.html
-Advertisement-
Play Games

[TOC] 1. 埠號 在同一臺主機或設備上,可能有多個進程同時在使用TCP或UDP協議,埠號的作用就是區分這些不同的進程,即每個進程使用各自不同的埠號。 對於TCP協議和UDP協議,埠號都是用unsigned short類型表示,即埠號的範圍為0 65535,這65536個埠號被分為3 ...


目錄

1. 埠號

在同一臺主機或設備上,可能有多個進程同時在使用TCP或UDP協議,埠號的作用就是區分這些不同的進程,即每個進程使用各自不同的埠號。
對於TCP協議和UDP協議,埠號都是用unsigned short類型表示,即埠號的範圍為0-65535,這65536個埠號被分為3段:

  • 眾所周知埠(well-known port):範圍為0-1023,這些埠被賦予了專用功能,如FTP的21埠、Web的80埠等,應用程式不能將它們用作其他功能
  • 已登記埠(registered port):範圍為1024-49151
  • 臨時埠:範圍為49152-65535

well-known埠在Unix系統中稱為保留埠,使用保留埠的伺服器程式,必須以root用戶啟動運行。

2. 套接字對

TCP套接字對是定義TCP連接兩個端點的四元組,包括:本地IP地址、本地埠號、對端IP地址、對端埠號,每個端點的IP地址和埠號通常稱為一個套接字。
TCP套接字對可用於唯一標識一個網路中的TCP連接。

3. 套接字地址結構

大多數套接字API都需要一個指向套接字地址結構的指針作為函數參數,每個協議族都定義它自己的套接字地址結構,這些結構的名字均以sockaddr_開頭,並以對應每個協議族的唯一尾碼結尾。

IPv4套接字地址結構

IPv4套接字地址結構通常也稱為“網際套接字地址結構”,它以sockaddr_in命名,定義在<netinet/in.h>頭文件中。

#include <netinet/in.h>

struct in_addr
{
    in_addr_t s_addr;  //32-bit IPv4 address, network byte ordered
};

struct sockaddr_in
{
    uint8_t         sin_len;     //length of structure
    sa_family_t     sin_family;  //AF_INET
    in_port_t       sin_port;    //16-bit TCP Or UDP port number, network byte ordered
    struct in_addr  sin_addr;    //IPv4 address structure
    char            sin_zero[8]; //unused
};
  • IPv4地址和埠號在套接字地址結構中必須以網路位元組序存儲
  • IPv4地址可以按sockaddr_in.sin_addr和sockaddr_in.sin_addr.s_addr兩種方式引用
  • 按照使用慣例,總是先把整個結構請0,再填寫相應欄位
  • 網路通訊時,傳遞的是套接字地址結構中的某些欄位,結構本身僅在當前主機上使用

通用套接字地址結構

通用套接字地址結構struct sockaddr定義在<sys/socket.h>頭文件中。

#include <sys/socket.h>

struct sockaddr
{
    uint8_t     sa_len;
    sa_family_t sa_family;
    char        sa_data[4];
};

對於應用程式開發人員來說,通用套接字地址結構的唯一用途就是:將特定協議的套接字地址結構指針強制類型轉換為通用套接字地址結構指針,並傳遞給套接字API。

bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));

4. 位元組排序函數

  • IPv4地址和埠號必須以網路位元組序存儲,TCP/IP協議中的網路位元組序採用大端位元組序
  • 某個給定系統使用的位元組序叫做主機位元組序,主機位元組序可能為大端位元組序或小端位元組序
  • 在填寫套接字地址結構時,必須將IPv4地址和埠號從主機位元組序轉換為網路位元組序
  • 位元組排序函數用於在主機位元組序和網路位元組序之間進行轉換
#include <arpa/inet.h>

/* 主機位元組序——>網路位元組序 */
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);

/* 網路位元組序——>主機位元組序 */
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);

上面4個位元組排序函數只適用於整數類型,因此在套接字編程中:

  • 位元組排序函數常用來轉換16位埠號和IPv4通配地址INADDR_ANY
  • 其餘IP地址則一般使用地址轉換函數進行轉換

5. 地址轉換函數

地址轉換函數用於在IP地址的字元串格式和網路位元組序格式之間進行轉換。

  • inet_addr()、inet_aton()、inet_ntoa()僅適用於IPv4地址轉換
  • inet_pton()和inet_ntop()適用於IPv4和IPv6地址
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

/*
 * 字元串——>網路位元組序;
 * 成功返回網路位元組序IPv4地址,失敗返回INADDR_NONE;
*/
in_addr_t inet_addr(const char *str);

/*
 * 字元串——>網路位元組序,並通過addr指針保存;
 * 若字元串有效則成功返回1,否則失敗返回0.
*/
int inet_aton(const char *str, struct in_addr *addr);

/*
 * 網路位元組序——>字元串;
 * 返回字元串格式的IPv4地址.
*/
char *inet_ntoa(struct in_addr addr);

上面三個函數有兩點需要註意:

  • INADDR_NONE是一個32位都為1的整數,因此inet_addr()不能轉換地址255.255.255.255
  • inet_ntoa()的參數是結構體變數,而非結構體指針

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • [TOC] 說明 ASP.NET Core 3.0 一個 jwt 的輕量角色/用戶、單個API控制的授權認證庫 最近得空,重新做一個角色授權庫,而之前做了一個角色授權庫,是利用微軟的預設介面做的,查閱了很多文檔,因為理解不夠,所以最終做出了有問題。 之前的舊版本 https://github.com ...
  • 以簡報的形式記錄C#發送電子郵件(SMTP)的技術要點,以及使用outlook.com提供的SMTP伺服器的特殊事項。 ...
  • LinqDB資料庫查詢數據,還是很方便的。 1. 添加Entity數據實體類 方便之後映射操作 2. 添加DB操作通用類 3. 添加指定資料庫的映射連接類 4. 添加資料庫查詢輔助類 這裡是將資料庫放在程式啟動目錄下,通過絕對路徑引用。 ...
  • .Net Core 3.0 IdentityServer4 快速入門 —— resource owner password credentials(密碼模式) 一、前言 OAuth2.0預設有四種授權模式(GrantType): 1)授權碼模式 2)簡化模式 3)密碼模式(resource owne ...
  • 經過兩三天的修改,代碼進一步完善。但是鑒於自己水平有限,代碼錯誤之處在所難免。不足之處,希望大家提出寶貴意見,使代碼進一步完善。 ...
  • 0x00 前言 最近使用 CFW 過程中使用 Fiddle Web Debug 設置 Store 的迴環代理的過程中發現無論是否使用代理,Store 都無法訪問網路的問題,在最下麵的提示中出現了 0x00000193 的錯誤代碼,在經過一系列的嘗試後發現可能是更改系統地區和DNS的問題。現在將解決該 ...
  • 關於WSL的,Win10 的Linux子系統如何安裝,就不贅述了,Win10商店裡就有,至於win7和win8.1想裝這個估計也不行,所以跳過。 最近處於好奇,也懶得弄VMware的虛擬機(那玩意兒占記憶體太多了),就整了個來玩下,興奮之餘也測試了一些命令行分屏工具,後來決定下來用byobu。 一、直 ...
  • 磁碟存儲 liunx 存儲方式 一切皆文件 設備類型: 1. 塊設備: block liunx 表現為b開頭文件,可以隨機讀寫,存在緩存,存取單位是“塊”如:磁碟 2. 字元設備: char 不存在緩存,存取單位是“字元”,如:鍵盤 設備文件: 關聯至一個設備驅動程式,進而能夠跟與之對應硬體設備進行 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...