socket UDP 環路回顯的服務端

基于socket通訊的方式,無論用http或者udp或者自定義的協議,程序結構都是類似的。這個以UDP協議為例簡要說明。

#include <stdio.h> // 標準輸入輸出庫
#include <sys/types.h> // 提供了一些數據類型,如ssize_t
#include <sys/socket.h> // 提供socket編程的接口
#include <netinet/in.h> // 提供IPv4和IPv6地址的結構體定義
#include <arpa/inet.h> // 提供網絡地址轉換的函數,如inet_pton和inet_ntop(注意:這里應該是<arpa/inet.h>的拼寫錯誤,正確的是<arpa/inet.h>,但您已經寫對了)
#include <unistd.h> // 提供對POSIX操作系統API的訪問,如close函數
#include <stdlib.h> // 標準庫,提供內存分配、程序退出等函數
#include <sys/stat.h> // 提供對文件狀態的操作,本程序中未使用
#include <fcntl.h> // 提供對文件控制的操作,如文件描述符的設置,本程序中未使用
#include <string.h> // 提供字符串處理的函數,如bzero#define N 64 // 定義緩沖區的大小int main(int argc, char const *argv[]) // 程序的主入口
{int sockfd; // 聲明socket文件描述符sockfd = socket(AF_INET, SOCK_DGRAM, 0); // 創建一個UDP socketif(sockfd < 0) // 檢查socket是否創建成功{perror("sock err"); // 如果創建失敗,打印錯誤信息return -1; // 并返回-1表示錯誤}// 綁定套接字(ip+port)struct sockaddr_in addr; // 聲明一個IPv4地址的結構體addr.sin_family = AF_INET; // 設置地址族為IPv4addr.sin_port = htons(atoi(argv[2])); // 將命令行參數轉換為整數,并轉換為網絡字節序后設置為端口號// 自動綁定所有的本機網卡的地址addr.sin_addr.s_addr = INADDR_ANY; // 設置IP地址為INADDR_ANY,表示綁定到所有可用的網絡接口int addrlen = sizeof(addr); // 獲取地址結構體的長度if(bind(sockfd, (struct sockaddr *)&addr, addrlen) < 0) // 綁定socket到指定的地址和端口{perror("bind err"); // 如果綁定失敗,打印錯誤信息return -1; // 并返回-1表示錯誤}ssize_t len; // 聲明一個變量來存儲接收到的數據長度char buf[N] = {0}; // 聲明并初始化一個緩沖區來存儲接收到的數據struct sockaddr_in cliaddr; // 聲明一個結構體來存儲客戶端的地址信息// cliaddr接收客戶端的地址while (1) // 進入一個無限循環來等待客戶端的數據{bzero(buf, N); // 清空緩沖區len = recvfrom(sockfd, buf, N, 0, (struct sockaddr *)&cliaddr, &addrlen); // 從socket接收數據if(len > 0) // 如果成功接收到數據{printf("recv data=%s\n", buf); // 打印接收到的數據sendto(sockfd, buf, len, 0, (struct sockaddr *)&cliaddr, addrlen); // 將接收到的數據發送回客戶端(注意:這里應該使用len而不是N)}}// 關閉socket(注意:由于有無限循環,這行代碼實際上永遠不會被執行)close(sockfd); // 關閉socket以釋放資源return 0; // 程序正常結束
}

程序功能

這個程序實現了一個簡單的UDP服務器,它監聽一個指定的端口,接收來自客戶端的數據,并將接收到的數據原封不動地發送回客戶端(回顯服務器)。

程序結構

  1. 初始化:創建socket,設置地址和端口,綁定socket。
  2. 接收數據:進入一個無限循環,等待并接收來自客戶端的數據。
  3. 處理數據:打印接收到的數據,并將數據發送回客戶端。
  4. 關閉socket(實際上不會被執行):在循環結束后關閉socket。

UDP發送和接收函數的參數

  • recvfrom()函數:
    • sockfd:socket文件描述符。
    • buf:指向存儲接收數據的緩沖區的指針。
    • len:緩沖區的大小。
    • flags:標志位,通常設置為0。
    • src_addr:指向存儲發送方地址信息的結構體的指針。
    • addrlen:指向存儲地址結構體長度的變量的指針。
  • sendto()函數:
    • sockfd:socket文件描述符。
    • buf:指向要發送的數據的緩沖區的指針。
    • len:要發送的數據的長度(注意:這里應該使用實際接收到的數據長度,而不是緩沖區的大小)。
    • flags:標志位,通常設置為0。
    • dest_addr:指向存儲接收方地址信息的結構體的指針。
    • addrlen:地址結構體的長度。

其中:

sockaddr_in?結構體在 IPv4 網絡編程中用于表示一個 Internet 地址。這個結構體定義在?<netinet/in.h>?頭文件中(在 POSIX 兼容的系統中),并且它通常用于?bind(),?connect(),?sendto(),?recvfrom()?等網絡相關的系統調用中,以指定或接收網絡地址信息。

?sockaddr_in?結構體的定義:

struct sockaddr_in {sa_family_t    sin_family; // 地址族,對于 IPv4 來說是 AF_INETuint16_t       sin_port;   // 端口號,使用網絡字節序(大端模式)struct in_addr sin_addr;   // IPv4 地址,也使用網絡字節序// 在某些實現中,可能有一個用于填充的數組,以確保結構體大小與 sockaddr 一致// char        sin_zero[8]; // 這通常用于保持結構體大小的一致性,但現代代碼通常不直接使用它
};
  • sin_family:這是一個?sa_family_t?類型的字段,用于指定地址族。對于 IPv4 地址,它應該被設置為?AF_INET

  • sin_port:這是一個?uint16_t?類型的字段,用于指定端口號。端口號應該以網絡字節序(大端模式)存儲,這通常意味著在將主機字節序(小端模式或大端模式,取決于具體的系統架構)的端口號傳遞給網絡之前,需要使用?htons()?函數進行轉換。

  • sin_addr:這是一個?struct in_addr?類型的字段,它包含了一個 IPv4 地址。IPv4 地址也應該以網絡字節序存儲。struct in_addr?通常定義為一個包含單個?uint32_t?類型字段?s_addr?的結構體,用于存儲 32 位的 IPv4 地址。

  • sin_zero:在某些實現中,sockaddr_in?結構體可能包含一個名為?sin_zero?的字符數組字段,用于填充,以確保結構體的大小與更通用的?sockaddr?結構體一致。然而,在現代的網絡編程實踐中,這個字段通常不被直接使用,而且可能在一些實現中根本不存在。如果你的系統定義中包含了這個字段,你通常不需要關心它,只需要確保在初始化?sockaddr_in?結構體時將其清零(盡管這通常不是必需的,因為系統調用通常只關心?sin_family,?sin_port, 和?sin_addr?字段)。

在使用?sockaddr_in?結構體時,你需要確保正確地設置?sin_family,?sin_port, 和?sin_addr?字段,并且如果?sin_zero?字段存在,也最好將其清零(盡管這通常不是錯誤源)。然后,你可以將這個結構體的地址作為參數傳遞給網絡相關的系統調用。

?

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

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

相關文章

Linux:network:添加ip的時候自動添加一個本地路由

文章目錄 問題問題 最近在看一個路由的問題,順便看內核代碼,發現在添加IP的時候,內核會自動添加一個local route。 net/ipv4/devinet.c inet_rtm_newaddr->__inet_insert_ifa /* Send message first, then call notifier.Notifier will trigger FIB update, so thatlis…

Magnet Player:一款基于Web的磁力鏈媒體播放器

Magnet Player&#xff1a;一款基于Web的磁力鏈媒體播放器 項目地址:https://gitcode.com/gh_mirrors/ma/magnet-player 是一個創新的開源項目&#xff0c;它允許用戶直接在瀏覽器中播放磁力鏈&#xff08;Magnet URI&#xff09;內容&#xff0c;無需下載或安裝任何桌面應用…

php:完整部署Grid++Report到php項目,并實現模板打印

一、下載Grid++Report軟件 路徑:開發者安裝包下載 - 銳浪報表工具 二、 安裝軟件 1、對下載的壓縮包運行內部的exe文件 2、選擇語言 3、 完成安裝引導 下一步即可 4、接收許可協議 點擊“我接受” 5、選擇安裝路徑 “瀏覽”選擇安裝路徑,點擊"安裝" 6、完成…

web安全攻防入門教程

Web安全攻防入門教程 Web安全攻防是指在Web應用程序的開發、部署和運行過程中&#xff0c;保護Web應用免受攻擊和惡意行為的技術與策略。這個領域不僅涉及防御措施的實現&#xff0c;還包括通過滲透測試、漏洞挖掘和模擬攻擊來識別潛在的安全問題。 本教程將帶你入門Web安全攻…

前端node環境安裝:nvm安裝詳細教程(安裝nvm、node、npm、cnpm、yarn及環境變量配置)

需求&#xff1a;在做前端開發的時候&#xff0c;有的時候 這個項目需要 node 14 那個項目需要 node 16&#xff0c;我們也不能卸載 安裝 。這豈不是很麻煩。這個時候 就需要 一個工具 來管理我們的 node 版本和 npm 版本。 下面就分享一個 nvm 工具 用來管理 node 版本。 這個…

Unity在運行狀態下,當物體Mesh網格發生變化時,如何讓MeshCollider碰撞體也隨之實時同步變化?

舊版源代碼地址&#xff1a;https://download.csdn.net/download/qq_41603955/90087225?spm1001.2014.3001.5501 舊版效果展示&#xff1a; 新版加上MeshCollider后的效果&#xff1a; 注意&#xff1a;在Unity中&#xff0c;當你動態地更改物體的Mesh時&#xff0c;通常期望…

OpenCV--特征匹配

OpenCV--特征匹配 代碼和筆記 代碼和筆記 import cv2 import numpy as np""" 特征匹配 """""" 暴力特征匹配&#xff1a;使用第一組&#xff08;第一幅圖&#xff09;中的一個特征描述子&#xff0c;使用一些距離計算與第二組中…

什么是自動化辦公

自動化辦公是指使用技術工具或軟件&#xff0c;通過預設流程或腳本&#xff0c;自動執行日常辦公任務&#xff0c;從而提升效率、減少錯誤、節約時間的辦公模式。它適用于需要重復性、規則明確的工作流程&#xff0c;讓員工將精力集中在更具創造性和戰略性的工作上。 自動化辦公…

常見排序算法總結 (四) - 快速排序與隨機選擇

快速排序 算法思想 每一輪在數組相應的范圍上隨機找一個元素進行劃分&#xff0c;將不大于它的所有元素都放到左邊&#xff0c;將大于它的元素都放到右邊。在左右兩個子數組上不斷地遞歸&#xff0c;直到整個數組上有序。 注意&#xff1a;實現時選擇的時參考荷蘭國旗問題優化…

unraid固態硬盤分區格式—默認1MiB對齊

背景 我的unraid中有三個機械硬盤和兩個固態硬盤&#xff0c;其中兩個固態硬盤組成zfs鏡像的cache&#xff0c;防止其中一個硬盤出問題導致數據丟失。然而&#xff0c;今天突然看到機械硬盤的分區格式為GPT 4k&#xff0c;而固態硬盤是MBR 1MiB。想到GPT更加優秀&#xff0c;并…

Flutter 圖片編輯板(一) 事件路由

一個圖片編輯板&#xff0c;有兩部分組成。編輯板和內容項。每一個內容項是被InteractiveViewer修飾的widget&#xff0c;具有縮放偏移的功能。 在圖片編輯板上&#xff0c; 會有多個內容相&#xff0c;圖片或文字&#xff08;添加文字目前還沒做過&#xff09;。 當要編輯其中…

數倉技術hive與oracle對比(一)

準備 包括軟硬件環境、數據、測試數據三方面的準備內容。 環境 虛擬機軟件virtualbox7&#xff0c;同樣的虛擬機配置&#xff1a;內存2G、cpu一核&#xff0c;物理主機同一臺macbookpro&#xff08;13-2020款&#xff09;&#xff0c;所以硬盤IO讀寫速度一致。 綜上&#x…

AR眼鏡_消費級工業AR智能眼鏡主板硬件解決方案

AR眼鏡的研發是一項復雜的軟硬件集成工程&#xff0c;它需要在攝影、音頻、交互和連接等多個方面提供卓越的基礎體驗&#xff0c;因此產品的每個細節都顯得尤為重要。 在設計AR眼鏡時&#xff0c;重量、體積和散熱性能都是必須認真考量的關鍵因素。在芯片平臺的選擇上&#xff…

通信原理概論復習筆記(1)

1 緒論 消息: 通信系統傳輸對象, 信息的載體和物理表現形式. 信息: 消息的有效內容和內涵. 信號: 消息的傳輸載體. 模擬通信: 信源 → \to → 調制器 → \to → 信道(噪聲) → \to → 解調器 → \to → 信宿. 數字通信: 信源 → \to → 信源編碼(壓縮數字化) → \to →…

ASPICE評估如何優化軟件開發、測試和部署流程

ASPICE&#xff08;Automotive SPICE&#xff0c;即汽車軟件過程改進及能力評定&#xff09;評估在提高軟件開發、測試、部署的速度和質量方面發揮著重要作用。以下是ASPICE評估如何具體提高這些環節的具體方式&#xff1a; 一、提高軟件開發效率 標準化流程&#xff1a;ASPIC…

【OpenCV】Canny邊緣檢測

理論 Canny 邊緣檢測是一種流行的邊緣檢測算法。它是由 John F. Canny 在 1986 年提出。 這是一個多階段算法&#xff0c;我們將介紹算法的每一個步驟。 降噪 由于邊緣檢測易受圖像中的噪聲影響&#xff0c;因此第一步是使用 5x5 高斯濾波器去除圖像中的噪聲。我們在前面的章…

Ubuntu 安裝 web 服務器

安裝 apach sudo apt install apache2 -y 查看 apach2 版本號 apache2 -v 檢查是否啟動服務器 sudo service apache2 status 檢查可用的 ufw 防火墻應用程序配置 sudo ufw app list 關閉防火墻 sudo ufw disable 更改允許通過端口流量 sudo ufw allow Apache Full 開啟…

如何落地文件即服務?--- 基于makeself封裝服務并啟動

我通常想能不能給客戶一個文件&#xff0c;然后客戶通過執行這個簡單的指令就可以吧&#xff0c;一個服務在本地起來&#xff1f; 這是一種文件即服務的思想&#xff0c;不知道你有沒有類似的想法&#xff0c;當我發現https://makeself.io/ &#xff0c;我覺得它能很好的解決我…

mysql集群MHA方式部署

1. 基本信息 部署機器角色部署路徑192.168.242.71MySQL-Mater MHA-NodeMySQL: /alidata1/mysql-5.7.43192.168.242.72MySQL-Slave MHA-NodeMHA-Node: /alidata1/admin/tools/mha4mysql-node-0.58192.168.242.73MySQL-Slave MHA-Node192.168.242.74MHA-ManagerMHA-Manager: …

【C++】8___繼承

目錄 一、基本語法 二、繼承方式 三、對象模型 四、繼承中的構造與析構的順序 五、繼承中同名成員處理 六、多繼承語法 七、菱形繼承 一、基本語法 好處&#xff1a;減少重復的代碼 語法&#xff1a; class 子類 &#xff1a; 繼承方式 父類 子類 也稱為 派生類 父類…